El algoritmo euclidiano es un algoritmo ampliamente conocido para calcular el máximo común divisor (MCD) de dos enteros positivos.
El algoritmo
Para el propósito de este desafío, el algoritmo se describe a continuación:
Visualice las dos entradas como líneas adyacentes de cierto carácter,
por ejemplo, una entrada de3,4
puede ser representada por las líneas adyacentes000
y0000
Convierta los primeros
length(short_line)
caracteres en la línea más larga en otro carácter, digamos-
ahora que parece000
y---0
Elimina los primeros
length(short_line)
caracteres en la línea más larga.
ahora000
,0
Repite el paso 2 y 3 hasta que los dos tienen la misma longitud, utilizando las líneas más cortas y más largas después de cada iteración, por ejemplo
000
,0
-00
,0
00
,0
-0
,0
0
,0
- Puede elegir si desea detenerse aquí o continuar la iteración y convertir una de las líneas en una línea vacía.
Cada uno de estos pasos debe estar separado por un intervalo entre 0.3s y 1.5s.
El reto
Escriba un programa que, dados dos números naturales como entrada, cree una salida que se vea exactamente igual a la salida del algoritmo anterior. Puede usar otros caracteres ASCII imprimibles que no sean espacios en blanco que no sean 0
y -
, pero sea coherente y use solo dos caracteres. También puede usar algoritmos alternativos siempre que el resultado, incluido el tiempo, sea exactamente el mismo que produciría el algoritmo anterior.
Ejemplos
Este es un ejemplo con entrada 24,35
, que son coprimos, por lo que su GCD es 1.
Este es un ejemplo con entrada 16,42
, que tiene el GCD 2.
Reglas
- Este es un código de golf , por lo que gana los bytes más cortos
- Se aplican lagunas estándar
- Puede asumir que la entrada es un número entero decimal positivo
Aclaraciones
- Las líneas que representan los números deben permanecer en su orden original, es decir, la primera y segunda líneas del primer "cuadro" visualizado deben ser la primera y la segunda líneas respectivamente, en todos los cuadros posteriores.
- Una vez que finaliza el algoritmo, no debe aparecer ninguna entidad visible adicional . Sin embargo, esto también significa que está bien dejar en blanco las líneas, si se asegura de que el último "cuadro" se muestre durante al menos la misma cantidad de tiempo que todos los demás cuadros antes de dejar en blanco.
:-)
Respuestas:
Jalea , 29 bytes
Pruébalo en línea!
Esto define una función
2Ŀ
(no un programa completo; el enlace TIO contiene un pie de página que convierte una función en un programa) que toma una lista de dos elementos como entrada y muestra la salida en la pantalla (uno de nuestros métodos legales de E / S , y uno que es bastante necesario para este desafío porque habla sobre la apariencia en pantalla). Esto supone que el programa se ejecuta en un terminal que cumple con el estándar ANSI (lo uségnome-terminal
pero la mayoría funcionará), y que el terminal está inicialmente vacío (lo que parece ser el valor predeterminado más sensible); tenga en cuenta que Pruébelo en línea! no se ajusta a estos supuestos y, por lo tanto, la salida está distorsionada allí (ejecuté el programa localmente para verificar que se anima como se esperaba). Yo uso1
donde la pregunta usa0
, y2
en lugar de-
.Explicación
Función auxiliar
1Ŀ
(dada una lista de dos listas de dígitos, las muestra en la primera y segunda línea de la pantalla, luego espera 0.5 segundos; devuelve su entrada)La cadena "\ x1bc", cuando se envía a un terminal compatible con ANSI, se interpreta como un código de control para restablecer el terminal; esto borra la pantalla y mueve el cursor a la esquina superior izquierda (restableciendo así el terminal listo para la próxima salida).
Se nombra la función auxiliar
1Ŀ
(Jelly genera automáticamente nombres de esta forma para las funciones, y de hecho no hay otra forma de nombrarlas), pero se puede hacer referencia a ella simplementeÇ
desde el programa principal (porque el lenguaje tiene abreviatura para funciones con números cercanos) )Función principal
2Ŀ
(implementa la tarea solicitada en la pregunta)fuente
JavaScript (ES6),
128124 bytesfuente
Python 2 ,
152146 bytesPruébalo en línea!
Toma dos enteros separados por comas como entrada
fuente
Javascript (ES6),
215 194...135 129127 bytesUso
Esto toma la entrada en una variación de curry. Para usarlo, primero asigna la función a una variable (por ejemplo
G
), luego llámalo así:Explicación
Función algo recursiva que se llama a sí misma después de 1 segundo siempre que el algoritmo no haya terminado. Realiza un seguimiento de una tercera variable
c
que determina si debea
yb
debe cambiarse (sic
es así1
, es hora de cambiar).Primero, la función escribe algo en la consola. Si
c
es así0
, escribe dos cadenas de ceros con una nueva línea intermedia. Comoc
se inicializa en0
, podemos aprovechar esto y configurar variables globalesf
yg
que contengan algunas cadenas que necesitamos a menudo (como0
yrepeat
).De lo contrario, crea una cadena con ceros y desventajas. Todas estas cadenas consisten en dos partes: primero algunos (llame a esta cantidad
A
) menos, luego algunos (llame a esta cantidadB
) ceros, luego una nueva línea, luego algunos (llame a esta cantidadD
) menos y finalmente algunos (llame a esta cantidadE
) ceros.Si la primera entrada es más pequeña que la segunda entrada, necesitamos eliminar los ceros de la segunda entrada, entonces
A
es cero,B
igual a la primera entrada,D
igual a la primera entrada eE
igual a la segunda entrada menos la primera entrada. Si la primera entrada no es más pequeña que la segunda entrada, se aplica lo contrario (A
es la segunda entrada,B
es la primera entrada menos la segunda entrada, etc.).Con estos nuevos valores para la entrada y una variable conmutada
c
, la función está programada para ser llamada nuevamente en1e3
milisegundos, lo que equivale a un segundo.Notas
alert
para salida0
y-
, al igual que en los ejemplosPruébalo en línea
Pruébalo aquí!
fuente
Python 2 ,
208204194 bytes-4 gracias a @math_junkie por el astuto truco con
time.sleep
-10 gracias a @busukxuan por aclarar la regla de "pantalla clara".
Pruébalo en línea!
Estoy bastante seguro de que esto podría ser más golf. Me duele duplicar el
print
y elfor
bucle para crear la pausa, pero no puedo encontrar una forma de evitarlo en este momento.Notas
fuente
import time
,s=time.sleep
y ens(1)
lugar de un bucle para la demoratime.sleep
pero perdí esa. Lo intentaré.perl,
161149 bytes... sin hendiduras y nuevas líneas:
Póngalo en un archivo gcd.pl y ejecútelo así:
fuente
-M5.010
marca de perl es gratuita, por lo que puede guardar algunos bytes si usasay
overprint…\n
. Además, estoy bastante seguro de que es terser darle un nombre a su subrutina anónima, en lugar de almacenarla en una variable.GNU Sed (con
e
extensión xec), 88La puntuación incluye +3 para las
-zrf
opcionessed
.La entrada se proporciona como dos enteros unarios separados de nueva línea, utilizando mayúsculas
O
como dígitos.Por ejemplo, el ejemplo 16, 42 se puede ejecutar como:
Según los últimos comentarios, no estoy limpiando la pantalla entre iteraciones.
fuente
V ,
4744 bytesPruébalo en línea!
El encabezado y el pie de página en TIO simplemente se modifican
gs
para copiar las dos líneas actuales en la parte inferior de la pantalla y luego se eliminan las dos primeras al final. Esto visualiza la operación para TIO, pero si lo ejecutó en V (sin el encabezado y el pie de página), solo esperaría un segundo entre cada operación.fuente
ò
?