Divisez rapidement en Manufactoria

10

Contexte

Manufactoria a été commercialisé comme un jeu, mais nous, les golfeurs de code, pouvons le voir pour ce qu'il est vraiment: un langage de programmation à deux dimensions. Le langage de programmation Manufactoria est basé sur une seule file d'attente , qui contient une série de marqueurs colorés. Le pointeur d'instructions se déplace sur le plateau de jeu à l'aide de bandes transporteuses et rencontre une série d'écrivains et de branches qui lisent et écrivent dans la file d'attente.

La langue est très facile à comprendre, donc la façon la plus rapide de l'apprendre est de jouer aux premiers niveaux du jeu (liés ci-dessus).

Défi

Votre défi est de créer un programme qui peut diviser un nombre par un autre en un minimum de temps.

L'entrée du programme sera une chaîne de X marqueurs bleus suivie de Y marqueurs rouges. La sortie requise sera une chaîne de marqueurs rouges d'une longueur de X / Y.

Le plateau de jeu à utiliser se trouve dans ce niveau de concours officiel:

http://pleasingfungus.com/Manufactoria/?ctm=Divide_and_Conquer;Input_will_be_X_blues_followed_by_Y_reds,_output_X/Y_reds;bbbbbbrr:rrr|bbbrrr:r|bbbbr:rrrr|r:|bbbbbbbbbbbbrrrr:rrr|bbbbbbbbbbbbrrr:rrrr|bbbbbbbbbrrr:rrr|bbbbbbbbbbrr: rrrrr; 13; 3; 0

Il mesure 13x13 (la taille maximale) et il est pré-équipé des tests corrects (voir la section de notation).

Notation

Le score de votre programme est le temps total nécessaire pour que le programme réussisse tous les tests du niveau officiel du concours. Le temps total est indiqué sur l'écran de niveau terminé.

Lors de l'exécution des tests, vous devrez probablement utiliser le curseur d'accélération 50x en bas à gauche afin de recevoir les résultats rapidement (l'accélération temporelle n'affecte pas le score).

Voici une liste des problèmes de division impliqués dans les tests:

 6/2 = 3
 3/3 = 1
 4/1 = 4
 0/1 = 0
12/4 = 3
12/3 = 4
 9/3 = 3
10/2 = 5

Exemple d'E / S

12/3=4
in:  BBBBBBBBBBBBRRR
out: RRRR

10/2=5
in:  BBBBBBBBBBRR
out: RRRRR

9/3=3
in:  BBBBBBBBBRRR
out: RRR

0/1=0
in:  R
out: 
PhiNotPi
la source
Des trucs sympas, ce jeu! Ne donnez pas vraiment le temps de jouer au golf ces jours-ci, mais vous vous en souviendrez.
tomsmeding

Réponses:

6

Score 3:29

Peut aussi être un cas spécial divisé par 1,2,3,4. Rend beaucoup plus rapide.

entrez la description de l'image ici

http://pleasingfungus.com/Manufactoria/?lvl=34&code=c9:13f2;c10:13f2;c11:13f2;p12:2f7;y13:2f0;p11:2f0;c11:4f3;c10:3f0;p11:5f0 ; c10: 5f0; c9: 5f0; c11: 6f3; p11: 7f0; c10: 7f0; p11: 3f0; r10: 6f1; q8: 5f4; q8: 6f1; q9: 6f1; c7: 5f3; c7: 6f3; q10 : 2f0; r10: 1f3; r10: 4f1; q9: 3f4; q9: 4f1; c9: 2f3; c8: 3f3; c8: 4f3; r10: 8f1; q10: 9f6; q9: 9f1; q9: 8f4; q9: 7f4 ; c8: 8f3; c8: 9f3; c8: 10f3; c8: 11f3; c8: 12f3; c8: 13f2; c7: 7f2; c8: 7f3; r11: 9f3; r11: 10f0; r10: 10f0; r9: 10f3; r9 : 11f2; p11: 11f6; r11: 12f1; g11: 8f3; b10: 11f2; c16: 10f2; q17: 10f6; q17: 11f3; g18: 11f0; c12: 11f1; c12: 10f2; c13: 10f2; c14: 10f2 ; c15: 10f2; c17: 12f0; p16: 12f4; c16: 11f3; c16: 13f1; q15: 12f0; r15: 13f1; c14: 12f3; c14: 13f0; c13: 13f0; q17: 7f6; q17: 9f1; q18 : 9f6; q18: 8f5; q17: 6f1; g16: 6f2; y18: 6f0; p17: 5f5; r18: 5f0; c16: 5f0; p15: 5f0; r15: 6f3; b15: 7f2; p16: 7f6; r16: 8f1 ; q14: 5f0; y14: 4f3; g14: 6f1; p13: 5f0; p13: 6f0; p13: 7f0; p13: 8f0; p13: 9f1; g12: 9f0; c17: 8f1; & ctm = Divide_and_Conquer;Input_will_be_X_blues_followed_by_Y_reds, _output_X / Y_reds; bbbbbbrr: rrr | bbbrrr: r | bbbbr: rrrr | r: | bbbbbbbbbbbbrrrr: rrr | bbbbbbbbbbrbrb: bbbb;

Keith Randall
la source
J'aurais dû prévoir cela, mais bon travail de toute façon. Je souhaite que le moteur de jeu me permette de créer plus de 8 cas de test. Dois-je créer plus de défis Manufactoria à l'avenir?
PhiNotPi
1
Bien sûr, je les aime.
Keith Randall
4

Résultat: 15:51

entrez la description de l'image ici

Fait la division par soustraction répétée. Utilise un Y parmi les R pour garder une trace du diviseur que nous avons soustrait jusqu'à présent. Utilise Gs pour compter le quotient.

Par exemple, l'état au début de chaque boucle externe (juste après l'écrivain G initial) pour 12/4 est:

BBBBBBBBBBBB RRRR G
BBBBBBBB RRRR GG
BBBB RRRR GGG
RRRR GGGG

Lorsqu'il ne reste plus de Bs, le gadget en bas à gauche supprime Rs puis génère # G-1 Rs.

La boucle intérieure enlève un B à la fois et utilise Y pour garder une trace de la position. À partir de la boucle extérieure:

BBBBBBBB RRRR GG
BBBBBBB RYRRR GG
BBBBBB RRYRR GG
BBBBB RRRYR GG
BBBB RRRR GG

La boucle intérieure est la boîte 3x4 en bas à droite. La disposition du reste peut probablement être un peu améliorée, mais la boucle intérieure est serrée.

http://pleasingfungus.com/Manufactoria/?lvl=34&code=c11:13f2;g12:2f3;p12:3f7;c13:3f3;p13:4f3;b12:4f2;r14:4f3;p14:7f7;r13:7f2 ; q14: 8f7; g13: 8f2; p14: 9f4; r13: 10f2; p14: 10f7; b15: 10f0; q14: 11f7; p15: 11f3; r16: 11f1; p15: 8f0; r15: 9f1; c16: 8f0; c13 : 2f0; c15: 2f0; c16: 2f0; c17: 2f0; c11: 3f3; c11: 4f3; c11: 6f3; c11: 7f3; c11: 8f3; c11: 9f3; c11: 5f3; p11: 10f7; q11: 11f6 ; q11: 12f7; r10: 12f2; c10: 10f2; q16: 10f5; y14: 6f3; q14: 5f3; g15: 5f1; c15: 4f1; c15: 3f1; c17: 9f1; c17: 8f1; c17: 7f1; c17 : 6f1; c17: 5f1; c17: 4f1; c17: 3f1; y16: 9f1; g17: 10f1; q14: 2f4; g14: 1f3; & ctm = Divide_and_Conquer; Input_will_be_X_blues_followed_by_Y_reds, _outb_r | bb_r : rrrr | r: | bbbbbbbbbbbbrrrr: rrr | bbbbbbbbbbbbrrr: rrrr | bbbbbbbbbrrr: rrr | bbbbbbbbbbrr: rrrrr; 13; 3; 0 ;

Keith Randall
la source
En réorganisant radicalement les parties de votre conception, j'ai pu réduire le score à 13:28 avec 53 parties.
PhiNotPi
2

Score 20:35

Une approche complètement différente - moins de pièces mais considérablement plus lente.

solution div

http://pleasingfungus.com/Manufactoria/?lvl=34&code=p12:2f3;g11:2f3;b11:3f3;c12:4f2;c11:4f2;c13:2f3;c13:3f3;c13:4f3;c12:5f3 ; c11: 5f1; c10: 5f2; c9: 8f3; c9: 9f3; c10: 11f2; c11: 11f1; c11: 9f1; c11: 10f1; c11: 12f2; c13: 8f0; c11: 8f0; c13: 7f0; c14 : 7f0; c14: 6f3; c12: 7f3; y14: 5f0; y10: 6f1; y11: 7f1; g12: 6f2; g9: 11f2; g10: 10f0; q9: 10f3; q13: 5f7; q13: 6f7; b11: 6f1 ; b10: 9f1; p10: 7f1; r9: 7f2; p10: 8f4; p12: 8f3; q12: 12f3; r13: 12f0; r8: 10f2; c12: 9f3; c12: 10f3; c12: 11f3; & ctm = Divide_and_Conquer_oll__B__X__X__B__X__B__B__B__B , _output_X / Y_reds; bbbbbbrr: rrr | bbbrrr: r | bbbbr: rrrr | r: | bbbbbbbbbbbbrrrr: rrr | bbbbbbbbbbbbrrr: rrrr | bbbbbbbbbrrr: rrr | bbbbbbbbbbrr: rrrrr; 13; 3; 0 ;

Howard
la source