Fracciones intermedias
El reto:
Deberá crear un código que tome al menos 3 entradas; 2 enteros y "una representación de fracción" - el tipo que se adapte a su idioma para representar los incrementos de fracción) es decir. Si elige una cadena, la entrada sería "1/4" o podría elegir 2 entradas enteras adicionales o una tupla o w / e.
La entrada puede ser razonable (STDIN, argumentos de función, desde un archivo, etc.) y, por lo tanto, puede salir (STDOUT, valor de retorno de función, a un archivo, etc.)
Reglas:
- La "fracción" de entrada siempre será una fracción válida, menor que 1; ejemplo "1/4"
- El segundo entero de entrada siempre tendrá un valor más alto que el primer entero. Es decir, el primer entero de entrada siempre tendrá un valor más bajo que el segundo.
- Los enteros de entrada pueden ser negativos.
- Las fracciones producidas deben reducirse tanto como sea posible (simplificado)
El código deberá generar cada "paso de fracción" entre los 2 números en incrementos de la fracción de entrada.
El código debe ser un programa o función como se indica aquí
Ejemplo 1:
Entrada: -2,3,"1/2"
Salida:
-2
-3/2
-1
-1/2
0
1/2
1
3/2
2
5/2
3
Ejemplo 2
Entrada: 1,2,"2/3"
Salida:
1
5/3
2
o
1
4/3
2
Nota: El conteo puede comenzar desde cualquier dirección (gracias @Mego)
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
fuente
Respuestas:
Octava,
3430 bytesAhora toma la fracción como una expresión numérica en lugar de un numerador y un denominador separados.
Muestra sobre ideona
fuente
@(a,b,c)rats(union([a:c:b],b))
?1/2
una entrada numérica en lugar de una cadena), pero esa no es la forma en que interpreté "una representación de fracción". Si el OP está de acuerdo, me complacerá eliminar 4 bytes.Mathematica, 16 bytes
Una función sin nombre que toma dos enteros y un número racional y devuelve una lista de números, por ejemplo:
Mathematica's
Range
hace exactamente lo que pide el desafío, excepto que omite el límite superior si la diferencia entre el límite inferior y el superior no es exactamente un múltiplo del tamaño del paso. Por lo tanto, tomamos elUnion
(usar⋃
) con la lista que contiene solo el límite superior, lo que garantiza que aparezca exactamente una vez. Tenga en cuenta queUnion
clasificará el resultado, pero queremos ordenarlo de todos modos, ya que el tamaño del paso siempre es positivo. Además, dado que estamos trabajando con racionales, se reducen automáticamente tanto como sea posible.fuente
T-SQL 2012+,
831535477270246240219 bytesTenga en cuenta que este es un trazador de líneas: sql no tiene una función integrada para reducir la fracción. Puede que no sea el mejor idioma para este tipo de preguntas. Es legible para los humanos (más o menos, en comparación con algunos de los otros idiomas).
Pruébalo en línea
fuente
@n
o@d
de llanura@
. Su consulta CTE para N podría serN AS(SELECT N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N))
oN AS(SELECT 1N FROM sys.all_views)
. Dado que es casi seguro que haya unos pocos cientos en esta vista, también podría reducir las uniones cruzadas.ISNULL
es más corto queCOALESCE
y debería funcionarPython 2, 81 bytes
Pruébalo en línea
fuente
Haskell,
3126 bytesEvaluación perezosa FTW! Manifestación:
(Inicialmente me sentí tentado por la
[a,a+c..b]
notación de Haskell , pero tiene algunas peculiaridades que requieren algo así comof a b c|l<-[a,a+c..b-c/2]=l++[b|last l<b]
41 bytes of a b c=[x|x<-[a,a+c..],x<b]++[b]
33).fuente
import Data.Ratio
en tu recuento de bytes, creo que no puedes usarlof
sin eso, ¿verdad?Data.Ratio
paraf
sí mismo, porque es polimórfico para todos los tipos numéricos. Sin embargo, cuando desea llamarlo con valores de tipoRatio
, necesita importar. El desafío solo requiere "crear código que ...", no usarlo. Creo que está bien sin la importación.%
operador cree las fracciones de prueba1 % 2
y2 % 3
. No estoy haciendo trampa aquí: realmente puedes poner esos 26 bytes en un archivo, ejecutar el intérprete en ese módulo y tener la interacción que mostré. (Incluso podría evitar escribirimport Data.Ratio
en la interacción de demostración, si en su lugar se deletrea%
comoData.Ratio.%
.)MAT ,
1615 bytesEsto puede fallar para denominadores muy grandes. Espero que el formato de salida sea aceptable.
Pruébalo en línea!
fuente
Ruby ,
325448 bytesEsta solución se basa en la respuesta Python de Mego y supone que
c
siempre será unRational
formato de fracción de Ruby. Pruébalo en línea!Editar: se corrigió un error por el cual los enteros no se presentaban como enteros. -6 bytes gracias a Not That Charles y MegaTom.
Las funciones se llaman de esta manera:
fuente
Rational
forma más simple de3
en Ruby es(3/1)
.step(b,c).map
debería reducir el recuento de bytes aquí(a==a.to_i)
puede sera%1==0
de -4 bytes.-2,3,1/2r
(ejemplo 1) imprime el último3
dos veces.Julia, 14 bytes
Esto es similar a la respuesta de Mathematica, excepto que los rangos de Julia ya están en el formato deseado, por lo que es aún más corto. También devuelve una colección de números. Salida de ejemplo:
Tenga en cuenta que los enteros se muestran con 1 en el denominador, y se utiliza una barra doble para las fracciones. Para obtener el resultado exactamente como se define en la pregunta, se requiere más código:
fuente
Matlab con caja de herramientas simbólica / octava con SymPy, 27 bytes
Gracias a @sanchises por señalar un error, ahora corregido
Esta es una función anónima. Para llamarlo, asígnelo a una variable o use
ans
.Ejemplo:
fuente
c
que puede usar, cito, el tipo que se adapte a su idioma para representar los incrementos de fracción o w / e . Creo que está bastante claro quesymbolic
es una opción lógica y permitida (@VisualBean podría querer confirmar esto). El resultado del operador de dos puntos se 'actualiza' a unasymbolic
matriz, lo que significa que puede deshacerse delsym()
llamada por completo.Javascript,
108 90 8681 bytesUna función anónima. Después de la asignación a una variable con nombre con espacio en blanco:
Ejemplos de prueba:
Un enfoque imperativo que utiliza JavaScript, sin recursividad, biblioteca o programación funcional.
fuente
Smalltalk - 89 bytes
¡Por una vez Smalltalk es casi competitivo!
Llama así:
fuente
R - 71 bytes
Asume que ya ha instalado el
MASS
paquetefuente
Pyret, 56 bytes
Toma en principio (b), final (e), numerador (n) y denominador (d). Crea un rango de enteros, los divide y agrega el final a la lista (al vincular y luego ordenar).
fuente