Descripción del problema
Imagina que eres una tortuga en una cuadrícula. Te dan dos números f y b , y te enfrentas al este. Realiza una marcha a través de la cuadrícula, contando cada una de las celdas que encuentra, de acuerdo con las siguientes reglas:
- De forma predeterminada, escribe el recuento en la celda en la que se encuentra y luego camina hacia adelante.
- Si el recuento es divisible por f , escribe
F
en la celda en la que se encuentra, luego gira a la derecha y luego camina hacia adelante. - Si el recuento es divisible por b , escribe
B
en la celda en la que se encuentra, luego gira a la izquierda y luego camina hacia adelante. - Si el recuento es divisible por f y b , escribe
FB
en la celda en la que se encuentra y luego camina hacia adelante. - Si llegas a una plaza en la que ya has estado, te detienes.
Por ejemplo, seguir estas reglas usando f = 3 y b = 5 generará un patrón como este:
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
El reto
Escriba un programa o función que acepte dos números como entrada, correspondientes a f y b , y produzca como salida el patrón para estos números dado por las reglas anteriores.
Requisitos de formato:
- Cada celda tiene dos caracteres de ancho
- El contenido de la celda está alineado a la derecha dentro de estos dos caracteres
- Las celdas en la misma fila están delimitadas por un espacio
- La primera columna de celdas debe contener una celda no vacía
- Todas las filas deben contener celdas no vacías
- No se requiere espacio en blanco al final, pero está permitido
- Sin embargo, el ancho total de cada fila no debe exceder 3 veces el número de columnas no vacías
Su código debe funcionar para los casos de prueba proporcionados.
Las lagunas estándar no están permitidas.
Este es el código de golf; La respuesta más corta en bytes gana.
Casos de prueba
(f = 3, b = 5 caso repetido aquí como una conveniencia de cortesía).
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
Respuestas:
JavaScript (ES6), 230
240Menos golf
Prueba
fuente
Python 2,
379338326 bytesToma la entrada como dos números, separados por una coma. P.ej.
4,5
o(4,5)
Versión que funciona si la ruta es más larga que 99,
384343330 bytesMuestra 2 dígitos significativos.
Ejemplos:
input=(4,16)
input=(6,7)
(versión truncada)@Edit: Gracias a Jonathan Allan, Copper y shooqie por ahorrarme un montón de bytes.
fuente
while((x,y)not in p.keys()):
awhile(x,y)not in p:
yfor x,y in p.keys():
parafor x,y in p
. Puedes cambiarl,r=i%b==0,i%f==0
al,r=i%b<1,i%f<1
yd=(d+[0,1][r]-[0,1][l])%4
parad=(d+r-l)%4
. Puedes cambiars=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2);p[(x,y)]=s
ap[(x,y)]=[[`i`,'F'][r],' F'[r]+'B'][l].rjust(2)
. Puede haber másh*[' ']for x in range
lugar de[' ']*h for x in range
. Además,x+=[-1,1][d==1]
se puede reemplazar conx+=(d==1)*2-1
yy+=[1,-1][d==2]
se puede reemplazar cony+=(d!=2)*2-1
. Además, esf,b=inputtt
un error tipográfico?p[(x,y)]
=>p[x,y]
(aunque no estoy seguro si funciona en Python 2)Excel VBA,
347421 bytesNueva versión, para hacer frente a los requisitos de espacios en blanco. No tener esto en mi primera versión fue un descuido de mi parte, pero esto tiene su efecto en el bytecount ... Ahora corta y pega el rango utilizado a la celda
A1
.Aquí está la versión anterior que no movió el resultado final a
A1
Comienza en 70, 70 (o BR70 en Excel) y lo rodea. La función se llama con los parámetros
f
yb
como:Call t(4, 16)
@Neil me acaba de salvar un montón de bytes, ¡gracias!
fuente
q=q-1
conq=q+3
ySelect Case q
conSelect Case q Mod 4
, puede deshacerse de las dos declaraciones anteriores.However, the total width of each row must not exceed 3 times the number of non-empty columns
Supongo que esto se agregó para evitar simplemente configurar una gran cuadrícula y comenzar un poco lejos de la fronteraExcel VBA,
284278277261259255254253251 BytesSub
rutina que toma la entrada como valores,F
,B
y salidas a las células en elSheets(1)
objeto (que se limita a laSheets(1)
objeto para guardar 2 Bytes)Uso:
fuente
C, 349 bytes
Compila con gcc (con muchas advertencias)
Una versión ligeramente más sangrada:
Aquí hay una versión de 364 bytes que maneja números mayores que 100
fuente
Perl, 275 bytes
La sangría se proporciona para facilitar la lectura y no forma parte del código.
Explicación:
El código funciona al realizar un seguimiento de un hash de todos los lugares donde ha estado la tortuga y el valor apropiado almacenado
%m
. Por ejemplo: en3 5
,$m{0,2}
contiene2
, y$m{1,-3}
=26
. Continúa de esta manera hasta que alcanza un lugar que ya ha sido definido. Además, realiza un seguimiento de los límites actuales del camino de la tortuga, utilizando$a,$b,$c,$d
como máximos y mínimos.Una vez que llega a un lugar donde ya ha estado, imprime el camino utilizando los límites, todo relleno de espacios.
No hay límite para el tamaño de la ruta, ni el tamaño de los números.
fuente
PHP , 292 bytes
Pruébalo en línea!
Las sangrías son para mayor claridad, no cuentan.
Sigue el mismo algoritmo que la respuesta de Perl. Rastree dónde ha estado la tortuga en una matriz 2D,
$a
rastrea hacia dónde se enfrenta la tortuga y$u, $d, $l, $r
rastree los límites para imprimir.str_pad
nos permite asegurarnos de que cada entrada tenga exactamente 3 espacios de ancho para el formato de impresión.Por alguna razón no puedo entender, a PHP no le importa que no inicialice la mitad de las variables a 0, pero arruina el formato si no inicializo otras, aunque generalmente trata las variables no inicializadas como 0 cuando son las primeras usado. De ahí el
$x=$y=$u=$l=0
bit.fuente
Python 2 ,
267262258249245243 bytesPruébalo en línea!
fuente