Ganador: la respuesta de Ian D. Scott , ¡por un byte (48 bytes)! ¡Soberbio!
Su programa debe aceptar la entrada de una fracción que se puede simplificar, luego simplificarla.
Reglas:
- Si la fracción ya está en su forma más simplificada, debe informar al usuario
- No hay funciones integradas para hacer esto
- El usuario debe escribir el número en algún momento, sin embargo, el método que lea el programa no importa. Puede ser con stdin, console.readline, etc. Siempre que el usuario escriba
9/18
(por ejemplo) en algún momento, es válido - La salida debe hacerse con stdout, console.writeline, etc.
- La fracción se pondrá como
x/y
, y debe salir comoa/b
- La fracción debe generar la forma más simplificada. Por ejemplo, 8/12 -> 6/9 no es válido , la única solución válida es 2/3.
- Este concurso finaliza el 9 de agosto de 2014 (7 días desde su publicación)
- Esta es una pregunta de código de golf , por lo que gana el código más corto
Respuestas:
Python -
6948Lo primero que debe hacer es representarlo en el formato nativo de Python para almacenar fracciones, es decir, la clase Fraction.
Ahora simplificamos ... ¡pero mira! Ya está simplificado.
¿Cuenta esto como usar una función incorporada? No está diseñado específicamente para simplificar, y Fraction es una clase de todos modos, no una función.
No llamé a ninguna función de simplificación, por lo que no es mi culpa si Python decide hacerlo por sí mismo.
fuente
type(fractions.Fraction.__init__)
regresa enwrapper_descriptor
lugar defunction
, por lo que se podría decir que no es una función. En realidad, esto solo significa que se implementa en c, pero cualquier cosa que no esté en la función de clase no es una función, ¿verdad?> <> (92)
Sé que puedo bajar esto, lo jugaré un poco más por la mañana.
Explicación básica: las dos primeras líneas y la segunda mitad de la tercera son para leer números. Lamentablemente,> <> no tiene forma de hacerlo, por lo que el análisis ocupa la mitad del programa.
La cuarta línea es un simple cálculo de GCD iterativo. Me sorprende cuán bien> <> le fue en el recuento de bytes para el algoritmo real. Si no fuera por la terrible E / S, en realidad podría ser un lenguaje de golf razonable.
Las últimas dos líneas son solo para imprimir el resultado y dividir los números originales por el mcd.
fuente
GolfScript, 49 caracteres
Ejecute las dos cajas de prueba aquí :
fuente
JavaScript 101
Por una vez, una solución que no usa EcmaScript 6
Pero con E6 podría ser 93
fuente
for([a,b]=[c,d]=prompt().split('/');b;[a,b]=[b,a%b]);alert(a-1?c/a+'/'+d/a:'Reduced');
86 espero que sea matemáticamente correcto ...Python 2.7, 124
Solución muy simple, aunque sé que sería más corta en muchos otros idiomas.
Utilicé un importado,
gcd
pero si cuenta como un reductor de fracción incorporado, podría implementarse directamente.fuente
Pitón 2 (82)
Imprime un booleano después para decir si el original estaba en la forma más simple. Simplemente hace el algoritmo GCD habitual. La mayoría de los caracteres se gastan en entrada / salida.
fuente
input()
?print
, elmap
desempaquetado y tal vez un número entero en lugar de una división flotante.map
ser desempacado?a,b=map(int,...)
no requiere caracteres adicionales ya que sea,b=...
desempaqueta automáticamente. El problema que a veces te encuentras con Python 3 es quemap
no produce una lista sino un objeto de mapa que requiere convertirse en una lista antes de que puedas hacer algo como cortarla. En su lugar,*l,=map(...)
se necesita una expresión como para asignarl
como una lista.PHP> = 7.1, 76 bytes (no competitivos)
Versión en línea
fuente
C, 94
Solo adivine y verifique la fuerza bruta, para GCD que comienza en a | b hasta 1;
fuente
c;d;f(a,b){b?f(b,a%b):printf("%d/%d",c/a,d/a);}main(){scanf("%d/%d",&c,&d);f(c,d);}
Rebmu (104 caracteres)
Sin purgar:
fuente
PHP 156
meh
Correr:
Aquí hay una versión no protegida con algunas pruebas (modificada en forma de función):
fuente
Java,
361349329 (gracias @Sieg por elint
consejo)Sé que no es corto, pero estoy hipnotizado por lo que hice.
Para usarlo, compile el código y ejecútelo pasando los argumentos a través de la línea de comandos.
doubles
y la tarea no lo requiere).Sin golf (si alguien quiere ver este desastre):
fuente
int
lugar deInteger
, incluso en el código de producción. Int se asigna desde la pila, mientras que el entero es del montón.new Integer(str)
tendrá el mismo resultado queInteger.parseInt(str)
. Además, ¿por qué no usarString f=""
(siempre)?new Integer(str)
crea unaInteger
cadena, pero ¿noInteger.parseInt(str)
hace lo mismo? Y lo que pasaString f=""
es que sé que debería usarloString f=new String()
, pero no sé por qué no, tal vez sea un mal hábito: PInteger.parseInt
de hecho hace lo mismo, pero con algunos valores en caché para una búsqueda más rápida.Ruby - 112 caracteres
g
es una lambda auxiliar que calcula el MCD de dos enteros.f
toma una fracción como una cadena, por ejemplo'42/14'
, y genera la fracción reducida osimplest
si el numerador y el denominador son relativamente primos.Algunos casos de prueba:
Salida:
Tenga en cuenta que, aunque contra las reglas, Ruby tiene
Rational
soporte incorporado, por lo que podríamos hacerfuente
JavaScript
(91)(73)Devuelve '/' cuando la fracción ya está en su forma más simple. La función g calcula el mcd. Por cierto: ¿Hay alguna forma más corta para '1 == algo' donde algo es un entero no negativo?
function s(f){[n,m]=f.split(b='/');g=(u,v)=>v?g(v,u%v):u;return 1==(c=g(n,m))?b:n/c+b+m/c;}
Gracias a @bebe por una versión aún más corta:
fuente
s=f=>...
luego asigne g cuando lo use,(g=...)(n,m)
luego páselo a c y pruebe si es igual a 1 porc-1?not_equals:equals
e intente evitar usar return. resultado:s=f=>([n,m]=f.split(b='/'),c=(g=(u,v)=>v?g(v,u%v):u)(n,m))-1?n/c+b+m/c:f;
73 (devuelve la forma más simple (f) si no se puede reducir)function
yreturn
. Y gracias por el-1
=)Lua -
130115 caracteres10/10 realmente lo intenté
Aproveché al máximo la capacidad de Lua para convertir automáticamente una cadena en un número al realizar operaciones aritméticas en una cadena. Tuve que agregar "+0" en lugar de tonumber para algún código de comparación.
Lo siento, no tengo una versión sin golf, lo anterior es en realidad cómo la escribí
fuente
Lote - 198
De entrada se divide como
a/b
, a continuación, para cadac
enb,b-1,...1
comprobamos sia
yb
son divisibles porc
, y dividirlos porc
si lo son. Luego volvemosa/b
fuente
Befunge 93 (192)
fuente
C 135
Acepta entradas para 2 enteros separados por espacios. Sigue dividiendo por un mínimo de a & b hasta 1 para encontrar el MCD.
fuente
Java (200)
La mejor solución anterior en Java todavía tenía> 300 bytes, esta tiene 200:
Esto usa el módulo (más rápido) para determinar el mcd en lugar de iterar todos los números.
fuente
class M