El reto
Escribir un programa o función que toma dos números enteros de entrada, i
y j
, y da salida a su máximo común divisor; calculado utilizando el algoritmo euclidiano (ver más abajo).
Entrada
De entrada puede ser tomado como una representación de cadena delimitada por espacios de i
y j
o como dos enteros separados. Puede suponer que los enteros serán menores o iguales a 10,000. También puede suponer que los enteros de entrada no serán primos entre sí.
Desglose Euclidiano
El número mayor entre i
y j
se divide por el menor tantas veces como sea posible. Luego, se agrega el resto. Este proceso se repite con el resto y el número anterior, hasta que el resto se convierta 0
.
Por ejemplo, si la entrada fue 1599 650
:
1599 = (650 * 2) + 299
650 = (299 * 2) + 52
299 = (52 * 5) + 39
52 = (39 * 1) + 13
39 = (13 * 3) + 0
El número final 13
, es el máximo común divisor de los dos enteros de entrada. Se puede visualizar así:
Salida
Su salida debe ser el desglose en el formulario anterior, seguido de una nueva línea y el MCD. Se puede emitir a través de cualquier medio.
Ejemplos
Entradas
18 27
50 20
447 501
9894 2628
Salidas
27 = (18 * 1) + 9
18 = (9 * 2) + 0
9
50 = (20 * 2) + 10
20 = (10 * 2) + 0
10
501 = (447 * 1) + 54
447 = (54 * 8) + 15
54 = (15 * 3) + 9
15 = (9 * 1) + 6
9 = (6 * 1) + 3
6 = (3 * 2) + 0
3
9894 = (2628 * 3) + 2010
2628 = (2010 * 1) + 618
2010 = (618 * 3) + 156
618 = (156 * 3) + 150
156 = (150 * 1) + 6
150 = (6 * 25) + 0
6
Nota: Las salidas no tienen que estar espaciadas como están arriba. El espacio es solo para mayor claridad. Se requieren paréntesis.
Prima
Si su producción está espaciada como se indica arriba, puede agregar un bono de -10% a su puntaje.
Respuestas:
Pyth, 33 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
Explicación:
fuente
CJam,
464339 bytesPruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
Pitón 2, 70
Una función recursiva que devuelve una cadena multilínea. La función crea la primera línea, luego la agrega al resultado recursivo con el siguiente par de números en el algoritmo euclidiano. Una vez que el segundo número es cero, tomamos la cadena del otro número como el caso base, haciendo que se imprima en su propia línea al final.
El formateo se realiza mediante la sustitución de cadenas, utilizando la división de enteros para obtener el multiplicando.
Un problema es comenzar con el número más grande que se toma del número más pequeño. Convenientemente, si los números están en el orden incorrecto, el primer paso del algoritmo euclidiano los voltea. Para evitar que se muestre este paso, solo agregue la línea actual si el primer número es al menos el segundo (se necesita igualdad para, por ejemplo
f(9,9)
).fuente
awk,
7877Ordenar la entrada por tamaño requiere muchos bytes: /
Se reduce a esto:
Salida
Solo por diversión, también hice una versión correctamente espaciada, dándome una puntuación de 233 * 0.9 == 209.7 bytes.
Actualización Pude acortar esto de 285 bytes y ahora funciona para números arbitrariamente largos si llama a gawk4 con la
-M
opción.Pero aún tengo la sensación de que me encontré con algún bloqueo mental allí en alguna parte ...
Salida (gawk4 llamado con
awk -M -f code.awk
)Se agregaron algunas líneas nuevas y pestañas
Al principio puedo guardar las longitudes de los valores iniciales para x, y y x% y, porque solo pueden acortarse cada paso. Pero por el factor que tengo que determinar la longitud máxima antes de imprimir cualquier cosa, porque su longitud puede variar. Lo uso
$i
como una matriz aquí, porque guarda dos caracteres en comparación con el uso de [i] cada vez.fuente
C ++, compilador GCC, 171 bytes (-10%, 154 bytes)
está bien así que mi primer intento ..
consejos para codificar golf apreciados.
PD ¿Es necesario contar bytes de archivos de encabezado estándar e int main mientras se usa c ++? Excluirlo reduce 50 bytes
fuente
T-SQL (2012+), 268 bytes
Implementado como una función de tabla en línea que ejecuta un CTE recursivo. Puede valer la pena intentar dar formato al bono del 10%, pero eso tendrá que esperar.
Explicación y uso:
fuente
Rev 1: Rubí, 86
Algoritmo recursivo, gracias al consejo de Doorknob.
Rev 0: Rubí, 93
Esto realmente no ha funcionado bien en absoluto. El
while
bucle ocupa demasiados caracteres, especialmente con elend
. No puedo ver una forma de evitarlo. La recursión requeriría una función con nombre en lugar de una lambda, que también consumiría muchos caracteres.Llámalo así:
fuente
a=->i,j{...}
y llamara
víaa[1,2]
, aunque no estoy seguro de si esto le salvaría a los caracteres.f.call
). En realidad, es bastante más corta, pero aún está muy lejos de Python.PowerShell, 84
Un bloque de código recursivo, almacenado en una variable. Invocarlo con
& $e num1 num2
, por ejemplo:En una forma más legible, hace lo siguiente (nota: para un código más claro, puse los nombres completos de los comandos, más espacios en la cadena e hice explícitos los comandos de salida de la tubería):
Una molestia desde el punto de vista del codegolf; PoSh no tiene división de enteros, 10/3 devuelve un Doble, pero arroja el resultado a un entero y no siempre se redondea hacia abajo, redondea N.5 al número par más cercano - hacia arriba o hacia abajo. Asi que
[int](99/2) == 50
.Eso deja dos opciones incómodas:
Es por eso que tengo que quemar algunos personajes haciendo:
Aparte de eso, es el número de
También tengo una versión iterativa que, bastante bien, también tiene 84 caracteres:
Codeblock completamente anónimo, así que ejecútelo con
fuente
PHP, 118 bytes
Pruébalo en línea!
PHP, 131 bytes
Pruébalo en línea!
-4 Bytes reemplazar
list(,$n,$m)=$argv
con[,$n,$m]=$argv
necesidades PHP> = 7.1fuente
Japt ,
434241 bytes¡Mis nuevas "habilidades" de Japt parecen empeorar, no mejorar!
Pruébalo en línea
fuente
JavaScript (ES6),
7450626155 bytesIntentalo
Explicación
fuente
JS, 151
fuente
C, 83 bytes
prueba y resultados
fuente
Java 133
No hace el algoritmo euclidiano regular. En cambio, usa un módulo y luego calcula el segundo número para multiplicarlo cuando se imprime. También puede hacer esto más corto convirtiéndolo en una expresión lambda, pero no estoy seguro de cómo.
fuente
public
, cambie el segundoprintln
aprint
, y el cambiod!=0
ad>0
. Además, actualmente está dando una salida incorrecta para las primeras filas. Esto se puede solucionar agregandoif(d!=i)
delante deSystem.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);
. En total:void z(int i,int j){for(int d=1;d>0;i=j,j=d){d=i%j;if(d!=i)System.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);}System.out.print(i);}
( 131 bytes y corrección de errores)