Desafío
Dado un entero positivo N
, genera la suma de los primeros N
recíprocos como una fracción exacta, que se representa como un par de enteros en un orden consistente que representa numerador y denominador.
Reglas
La salida debe ser exacta.
La salida debe ser como un par de enteros en un orden consistente que represente numerador y denominador.
Se prohíbe el uso de tipos numéricos no enteros (integrados o de biblioteca).
- Aclaración / excepción: los tipos numéricos no enteros están bien si y solo si todos los valores utilizados, calculados y devueltos son enteros (es decir, su idioma usa números racionales por defecto, pero solo usa aritmética de enteros en su respuesta)
La producción debe ser lo más reducida posible. (
3/2
está bien,6/4
no está)Las lagunas estándar están prohibidas.
Los envíos deben funcionar para entradas de al menos hasta 20, o este meta , lo que sea mayor.
Casos de prueba
1: 1/1
2: 3/2 (1/1 + 1/2)
3: 11/6 (1/1 + 1/2 + 1/3)
4: 25/12 etc.
5: 137/60
6: 49/20
20: 55835135/15519504
56: 252476961434436524654789/54749786241679275146400
226: 31741146384418617995319820836410246588253008380307063166243468230254437801429301078323028997161/5290225078451893176693594241665890914638817631063334447389979640757204083936351078274058192000
Generación de casos de prueba (Python 3)
import fractions
def f(x):
return sum(fractions.Fraction(1,i) for i in range(1,x+1))
Similar a este desafío y este desafío .
Los numeradores son OEIS A001008 , y los denominadores son OEIS A002805 .
code-golf
math
rational-numbers
pizzapants184
fuente
fuente
gcd
una "función incorporada" si su idioma lo proporciona?gcd
y otras funciones integradas están bien. Los tipos racionales / fraccionarios no están permitidos.Respuestas:
Python 2 ,
8079 bytesPruébalo en línea!
Imprime el numerador y el denominador.
¡Hurra! Soporte MathJax !!!! Uno observa:
Luego, pensando en la recursividad, para positivo, en el umerador:n
N
y uno no puede evitar pensar en eln!
D
enominador recursivamente también; así el .exec
Debemos pagar el Piper de fracción reducida con un cálculo de GCD en el
while
bucle; y luego terminamos.fuente
Jalea , 10 bytes
Pruébalo en línea!
Cómo funciona
fuente
J , 16 bytes
Pruébalo en línea!
Ejecutar ejemplos
Cómo funciona
J , 9 bytes, usando el tipo de fracción
Pruébalo en línea!
J da fracciones para la división int-int si no es divisible.
fuente
2 x:1#.1%1+i.
Contaría como una respuesta válida o es un uso no válido de un tipo racional?05AB1E , 10 bytes
Pruébalo en línea!
Utiliza el mismo método que todas las demás entradas. La salida está en el formulario
[denominator, numerator]
.fuente
Wolfram Language (Mathematica) , 30 bytes
Pruébalo en línea!
14 bytes si se permiten tipos fraccionales incorporados
Pruébalo en línea!
fuente
InputForm@HarmonicNumber
(24 bytes) da salida en el formato dado por OP.JavaScript (ES6), 60 bytes
Las devoluciones
[numerator, denominator]
.Pruébalo en línea!
¿Cómo?
El método es similar a la respuesta de Python de @ ChasBrown .
fuente
Perl 6 ,
5753 bytesPruébalo en línea!
Un bloque de código anónimo que toma un número entero y devuelve una tupla de
denominator, numerator
.Si se nos permitiera usar tipos fraccionarios, sería el byte 32 mucho más simple:
Pruébalo en línea!
fuente
Octava , 29 bytes
Pruébalo en línea!
fuente
C ++ 17 (gcc) , 108 bytes
Solo use aritmética de enteros:
Pruébalo en línea!
C ++ 17 (gcc) , 108 bytes
Pruébalo en línea!
Igual que a continuación, pero usa C ++ 17
std::gcd
.C ++ (gcc) , 109 bytes
Pruébalo en línea!
Debido a que C ++ no tiene soporte nativo para bigint, esto definitivamente se desbordará
n>20
.Exigir:
import
declaración obsoleta de gcc .std::__gcd
.-O0
(Creo que sí) de lo contrario el compilador optimizarád/=a
.long
.Explicación:
a*d
al entero más cercano lanzandoa*d+.5
along
y asigna an
. Ahoran/d
es la salida.std::__gcd
.fuente
auto a=0.
lugar dedouble a=0
(1 char menos)?Pari / GP , 34 bytes
Pruébalo en línea!
17 bytes si se permiten tipos fraccionales incorporados
Pruébalo en línea!
fuente
MATL, 13 bytes
Pruébalo en MATL Online
El mismo método que el utilizado en @Dennis 'Jelly answer .
(Salida implícita, imprime el denominador primero y luego el numerador).
Las imprecisiones de punto flotante significan que esto no funciona para n = 20, porque los valores intermedios son demasiado grandes.Parece que la salida del caso de prueba fue un error tipográfico, esto devuelve la misma respuesta que las otras respuestas para n = 20.Aquí hay una versión de preservación de tipo entero (25 bytes) que intenté mientras tanto, antes de descubrir esto:
25 bytes, entrada hasta 43
Pruébalo en línea!
Lanza los números a
uint64
antes de operar con ellos, realiza la aritmética explícitamente en un bucle (sin usarprod
osum
). Más importante aún, divide los numeradores y denominadores parciales por su MCD en cada paso del camino, al final de cada iteración. Esto aumenta el rango de entrada para permitirn
hasta 43. Parte del código se basa en la respuesta Python de @Chas Brown.Método alternativo (original) usando LCM en lugar de factorial:
1615 bytesPruébalo en MATL Online
fuente
Excel VBA, 141 bytes
Toma entradas
[A1]
y salidas de la consola.No golfista y comentado
fuente
cc , 87 bytes
Pruébalo en línea!
Esto deja el numerador y el denominador en la parte superior de la pila en ese orden, como lo permite este valor predeterminado de salida. Como
dc
no tienegcd
incorporado, esto utiliza el algoritmo euclidiano para calcular elgcd
.fuente
Stax , 11 bytes
Ejecutar y depurarlo
Explicación:
Queremos calcular:
Entonces tenemos:
fuente
APL (NARS), 56 caracteres, 112 bytes
prueba:
En pocas palabras, reduzca la "función de suma en 2 números de fracción" (un número de fracción es una lista de 2 enteros) en el conjunto:
esto a continuación parece incorrecto:
pero si cambio el tipo de entrada que:
fuente
APL (Dyalog Unicode) ,
1512 bytesPruébalo en línea!
Función tácita, tomando un solo argumento
⍵
. Guarda un byte eliminando⌽
si se nos permite imprimir el denominador primero.Gracias @dzaima por 3 bytes.
Cómo:
fuente