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,4puede ser representada por las líneas adyacentes000y0000Convierta los primeros
length(short_line)caracteres en la línea más larga en otro carácter, digamos-
ahora que parece000y---0Elimina los primeros
length(short_line)caracteres en la línea más larga.
ahora000,0Repite 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 0y -, 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-terminalpero 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 uso1donde la pregunta usa0, y2en 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
cque determina si debeaybdebe cambiarse (sices así1, es hora de cambiar).Primero, la función escribe algo en la consola. Si
ces así0, escribe dos cadenas de ceros con una nueva línea intermedia. Comocse inicializa en0, podemos aprovechar esto y configurar variables globalesfygque contengan algunas cadenas que necesitamos a menudo (como0yrepeat).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
Aes cero,Bigual a la primera entrada,Digual a la primera entrada eEigual 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 (Aes la segunda entrada,Bes 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 en1e3milisegundos, lo que equivale a un segundo.Notas
alertpara salida0y-, 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
printy elforbucle para crear la pausa, pero no puedo encontrar una forma de evitarlo en este momento.Notas
fuente
import time,s=time.sleepy ens(1)lugar de un bucle para la demoratime.sleeppero 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.010marca de perl es gratuita, por lo que puede guardar algunos bytes si usasayoverprint…\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
eextensión xec), 88La puntuación incluye +3 para las
-zrfopcionessed.La entrada se proporciona como dos enteros unarios separados de nueva línea, utilizando mayúsculas
Ocomo 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
gspara 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
ò?