EDITAR: Recibo muchos comentarios acerca de que esto no termina: le daré la etiqueta de "respuesta correcta" a la primera persona que me dé FF(3)
(como lo proporciona en su respuesta) o prueba que FF(3)
realmente explota indefinidamente.
Tarea:
Su tarea es hacer posible el programa más pequeño que genere la lista de recíprocos de la función Fraction Frenzy ( FF(n)
) dado un entero positivo n
.
Introducción:
Antes de poder introducir la función FF, primero tengo que explicar las fracciones egipcias.
Fracciones Egipcias:
Las fracciones egipcias son una forma de expresar fracciones como la suma de fracciones unitarias distintas, por lo que una forma de expresar la fracción 5/8
es 1/2 + 1/8
. No es otra suma de fracciones como
1/4 + 1/4 + 1/8
1/2 + 1/16 + 1/16
porque no todas sus fracciones son distintas ( 1/4
se repite en el primer ejemplo y 1/16
en el segundo).
En nuestra definición de fracciones egipcias, también incluimos el uso de denominadores negativos en las fracciones unitarias.
Función FF:
La función FF (Fraction Frenzy) se describe así:
FF(1)
es la fracción egipcia 1/2 + 1/3 + 1/5 + 1/-30
.
FF(2)
es igual a FF(1)
"multiplicado" por sí mismo ( FF(1)
"cuadrado"):
(1/2 + 1/3 + 1/5 + 1/-30)(1/2 + 1/3 + 1/5 + 1/-30)
= 1/4 + 1/6 + 1/10 + 1/-60 + 1/6 + 1/9 + 1/15 + 1/-90 +
1/10 + 1/15 + 1/25 + 1/-150 + 1/-60 + 1/-90 + 1/-150 + 1/900
Esta no es una fracción egipcia totalmente reducida todavía, porque hay "repeticiones" en las fracciones. Para reducirlos, se realiza el siguiente procedimiento:
- Suma todas las fracciones unitarias "me gusta" juntas.
- Reduzca las sumas a sus formas más simples, por ejemplo, si una suma del paso
1
es2/6
, eso se puede reducir a1/3
. - Repita 1 y 2 hasta que todos los denominadores sean distintos: por ejemplo
1/2 + 2/3 + 1/5
, en oposición a1/2 + 1/3 + 1/3
, que tiene un denominador repetitivo3
. - Si hay un par de una fracción positiva y una negativa que tienen un valor absoluto igual, elimine ambas (por ejemplo,
1/-5
y1/5
ambas deben eliminarse). - Si las fracciones no son unidades y no se pueden reducir aún más, divídalas en fracciones unitarias con un denominador igual y mantenga una fracción como está. Con los otros, multiplican por
FF(1)
:(1/2 + 1/3 + 1/5 + 1/-30)
. - Repita los pasos del 1 al 5 hasta que la suma de la fracción final sea una fracción egipcia válida, es decir, todas las fracciones son distintas entre sí y todas son fracciones unitarias.
Esta es la reducción de FF(2)
:
1/4 + 1/6 + 1/10 + 1/-60 + 1/6 + 1/9 + 1/15 + 1/-90 +
1/10 + 1/15 + 1/25 + 1/-150 + 1/-60 + 1/-90 + 1/-150 + 1/900
= 1/4 + 2/6 + 1/9 + 2/10 + 2/15 + 1/25 + 2/-60 + 2/-90 + 2/-150 + 1/900 (step 1)
= 1/4 + 1/3 + 1/9 + 1/5 + 2/15 + 1/25 + 1/-30 + 1/-45 + 1/-75 + 1/900 (step 2)
= 1/3 + 1/4 + 1/5 + 1/9 + 1/15 + 1/15(1/2 + 1/3 + 1/5 + 1/-30) + (step 5)
1/25 + 1/-30 + 1/-45 + 1/-75 + 1/900
= 1/3 + 1/4 + 1/5 + 1/9 + 1/15 + 1/30 + 1/45 + 1/75 + 1/-450 +
1/25 + 1/-30 + 1/-45 + 1/-75 + 1/900
= 1/3 + 1/4 + 1/5 + 1/9 + 1/15 + 1/25 + 1/-450 + 1/900 (step 4)
Para todos n
(excepto para 1
), FF(n)
se define por "cuadratura" FF(n-1)
.
Entrada y salida:
Dado un número entero n
, debe generar una lista de todos los recíprocos de FF(n)
, ordenados en orden ascendente de sus valores absolutos:
1 -> [2, 3, 5, -30]
# 1/2 + 1/3 + 1/5 + 1/-30 = FF(1), reciprocals = [2, 3, 5, -30]
2 -> [3, 4, 5, 9, 15, 25, -450, 900]
Se le permite usar una cadena con cualquier delimitador, o la interpretación de una lista de su idioma, por lo que estas salidas son aceptables con la entrada 1
:
2 3 5 -30 (Space-delimited)
2,3,5,-30 (Comma-delimited)
[2 3 5 -30] (Lisp-like lists)
etc. etc.
Especificaciones:
- Debe generar los resultados de la
FF(n)
función exactamente como se especificó anteriormente. - Se le garantiza que la entrada será un número entero positivo: nunca estará por debajo de cero y nunca será un decimal (o fracción).
Este es el código de golf , por lo que gana el código más corto en bytes.
fuente
Respuestas:
Haskell , 365 bytes
Pruébalo en línea!
fuente
(1%)<$>[2,4,6,12]
como 1 simplemente posterga la no determinación de FF (3) a FF (4) 😠(1%)<$>[2,3,10,15]
o(1%)<$>[3,4,6,8,12,24]
no produce ninguna mejora en absoluto 🤔