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:
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:
la source
Réponses:
Score 3:29
Peut aussi être un cas spécial divisé par 1,2,3,4. Rend beaucoup plus rapide.
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;
la source
Résultat: 15:51
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:
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:
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 ;
la source
Score 20:35
Une approche complètement différente - moins de pièces mais considérablement plus lente.
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 ;
la source