Description du problème
Imagine que tu es une tortue sur une grille. On vous donne deux nombres f et b , et vous faites face à l'est. Vous effectuez une marche à travers la grille, en comptant chacune des cellules rencontrées, selon les règles suivantes:
- Par défaut, vous écrivez le nombre dans la cellule dans laquelle vous vous trouvez, puis vous avancez.
- Si le nombre est divisible par f , vous écrivez
F
dans la cellule dans laquelle vous vous trouvez, puis tournez à droite puis avancez. - Si le nombre est divisible par b , vous écrivez
B
dans la cellule dans laquelle vous vous trouvez, puis tournez à gauche et avancez. - Si le nombre est divisible par f et b , vous écrivez
FB
dans la cellule où vous vous trouvez, puis avancez. - Si vous atteignez une place où vous êtes déjà allé, vous vous arrêtez.
Par exemple, suivre ces règles en utilisant f = 3 et b = 5 va générer un motif comme celui-ci:
F 28 29 FB 1 2 F
26 4
F B B F
23 7
22 8
F B B F
19 11
F 17 16 FB 14 13 F
Le défi
Ecrivez un programme ou une fonction qui accepte deux nombres en entrée, correspondant à f et b , et produit en sortie le motif pour ces nombres donné par les règles ci-dessus.
Conditions de formatage:
- Chaque cellule est large de deux caractères
- Le contenu de la cellule est aligné à droite entre ces deux caractères.
- Les cellules de la même ligne sont délimitées par un espace
- La première colonne de cellules doit contenir une cellule non vide
- Toutes les lignes doivent contenir des cellules non vides
- Les espaces de fin ne sont pas obligatoires, mais autorisés
- Cependant, la largeur totale de chaque ligne ne doit pas dépasser 3 fois le nombre de colonnes non vides
Votre code doit fonctionner pour les cas de test fournis.
Les failles standard sont interdites.
C'est du code golf; réponse la plus courte en octets gagne.
Cas de test
(f = 3, b = 5 cas répété ici à titre gracieux).
f=3, b=5 ->
F 28 29 FB 1 2 F
26 4
F B B F
23 7
22 8
F B B F
19 11
F 17 16 FB 14 13 F
f=4, b=10 ->
F 25 26 27 F
23 29
22 1 2 3 F
21 5
FB 6
19 7
18 B 9 F
17 11
F 15 14 13 F
f=3, b=11 ->
F 16 17 F
14 19
13 1 2 F
F B 4
10 5
F 8 7 F
f=5, b=9 ->
F 41 42 43 44 1 2 3 4 F
39 6
38 7
37 8
F B B F
34 11
33 12
32 13
31 14
F 29 28 B B 17 16 F
26 19
F 24 23 22 21 F
f=5, b=13 ->
F 31 32 33 34 F
29 36
28 1 2 3 4 F
27 6
F B 7
24 8
23 9
22 B 12 11 F
21 14
F 19 18 17 16 F
Réponses:
JavaScript (ES6), 230
240Moins joué au golf
Tester
la source
Python 2,
379338326 octetsPrend la saisie sous forme de deux nombres, séparés par une virgule Par exemple.
4,5
ou(4,5)
Version qui fonctionne si le chemin est plus long que 99,
384343330 octetsAffiche 2 chiffres significatifs.
Exemples:
input=(4,16)
input=(6,7)
(version tronquée)@Edit: Merci à Jonathan Allan, Copper, et à shooqie pour m'avoir économisé plusieurs octets.
la source
while((x,y)not in p.keys()):
àwhile(x,y)not in p:
etfor x,y in p.keys():
àfor x,y in p
. Vous pouvez passerl,r=i%b==0,i%f==0
àl,r=i%b<1,i%f<1
etd=(d+[0,1][r]-[0,1][l])%4
àd=(d+r-l)%4
. Vous pouvez changers=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2);p[(x,y)]=s
pourp[(x,y)]=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2)
. Il peut y avoir plush*[' ']for x in range
au lieu de[' ']*h for x in range
. En outre,x+=[-1,1][d==1]
peut être remplacé parx+=(d==1)*2-1
ety+=[1,-1][d==2]
peut être remplacé pary+=(d!=2)*2-1
. Aussi, estf,b=inputtt
une faute de frappe?p[(x,y)]
=>p[x,y]
(pas sûr que cela fonctionne en Python 2, cependant)Excel VBA,
347421 octetsNouvelle version, pour répondre aux exigences d'espaces. Ne pas l'avoir dans ma première version était un oubli ou une partie de ma part, mais cela pèse lourdement sur le compte approximatif ... Il coupe et colle maintenant la plage utilisée dans la cellule
A1
.Voici l'ancienne version qui n'a pas déplacé le résultat final vers
A1
Commence à 70, 70 (ou BR70 dans Excel) et marche autour. La fonction est appelée avec le
f
etb
comme paramètres:Call t(4, 16)
@ Neil vient de me sauver un tas d'octets, merci!
la source
q=q-1
parq=q+3
etSelect Case q
avecSelect Case q Mod 4
alors vous pouvez vous débarrasser des deux déclarations précédentes.However, the total width of each row must not exceed 3 times the number of non-empty columns
Je suppose que cela a été ajouté pour éviter de simplement installer une grande grille et commencer un peu loin de la frontièreExcel VBA,
284278277261259255254253251 octetsSub
routine qui accepte une entrée en tant que valeurs,F
,B
et les sorties des cellules de l'Sheets(1)
objet (qui est limitée à l'Sheets(1)
objet pour enregistrer 2 octets)Usage:
la source
C, 349 octets
Compile avec gcc (avec beaucoup d'avertissements)
Une version légèrement plus en retrait:
Voici une version de 364 octets qui gère les nombres supérieurs à 100
la source
Perl, 275 octets
L'indentation est fournie pour la lisibilité et ne fait pas partie du code.
Explication:
Le code fonctionne en gardant une trace du hachage de tous les endroits où la tortue a été et de la valeur appropriée, stockée dans
%m
. Par exemple3 5
, dans ,$m{0,2}
contient2
et$m{1,-3}
=26
. Il continue ainsi jusqu'à atteindre un endroit déjà défini. De plus, il garde une trace des limites actuelles du chemin de la tortue, en utilisant$a,$b,$c,$d
comme maximum et minimum.Une fois qu'il a atteint un endroit qu'il a déjà été, il imprime le chemin à l'aide des limites, le tout étant rempli d'espaces.
Il n'y a pas de limite à la taille du chemin, ni à la taille des nombres.
la source
PHP , 292 octets
Essayez-le en ligne!
Les retraits sont pour la clarté, pas comptés.
Suit à peu près le même algorithme que la réponse Perl. Suivre l'emplacement de la tortue dans un tableau 2D,
$a
suivre son orientation et$u, $d, $l, $r
suivre les limites pour l'impression.str_pad
nous permet de nous assurer que chaque entrée a exactement 3 espaces de large pour le formatage de l’impression.Pour une raison quelconque, je ne peux pas comprendre, PHP ne me dérange pas de ne pas initialiser la moitié des variables à 0, mais gâche la mise en forme si je n'initialise pas les autres, même s'il traite généralement les variables non initialisées à 0 quand elles sont initiales utilisé. D'où le
$x=$y=$u=$l=0
bit.la source
Python 2 ,
267262258249245243 octetsEssayez-le en ligne!
la source