Su tarea es, dada x
, salida 2*x
. Fácil, ¿verdad? Pero hay una trampa: x
se dará como una fracción continua (posiblemente infinita) , y la salida debe ser una fracción continua. Se garantiza que la entrada sea un número algebraico real cuyo grado sea como máximo 2.
Entrada : La fracción continua de x
. Esto se divide en 3 partes: la parte entera, el prefijo y la parte repetitiva. La parte entera consiste en un solo entero. El prefijo y la parte repetitiva son matrices (posiblemente vacías) de enteros positivos que describen el prefijo y la parte repetitiva de la fracción continua. Por ejemplo, la entrada (3, [1], [2, 4])
representa la fracción continua [3; 1, 2, 4, 2, 4, ...]
.
Si la parte que se repite está vacía, eso indica un número racional. Por ejemplo, (3, [1, 2], [])
representa [3; 1, 2] = 11/3
. Debe aceptar ambas formas de un número racional (es decir (3, [1, 1, 1], [])
, que [3; 1, 1, 1] = 11/3
también debe ser una entrada válida).
Salida : genera la fracción continua del doble de la entrada, en el mismo formato que la entrada. Si el resultado es racional, puede generar cualquiera de las formas de la fracción continua. Mientras la respuesta sea equivalente a la respuesta correcta, está bien; no es necesaria la "compresión", por lo que la parte infinita podría estar "desenrollada" un poco (por ejemplo, [1; 4, 2, 3, 2, 3...]
puede estar escrita (1, [4], [2, 3])
o (1, [4, 2, 3], [2, 3])
). Todas las respuestas deben ser exactas.
Casos de prueba : la columna de formulario exacto se proporciona por conveniencia.
Input Exact Form Output
(0, [] []) 0 (0, [] []) or (-1, [1], [])
(-5, [1, 1], []) -4.5 (-9, [], []) or (-10, [1], [])
(3, [1, 2], []) 11/3 (7, [3], []) or (7, [2, 1], [])
(1, [], [2]) sqrt(2) (2, [], [1, 4])
(-1, [2], [2, 1]) -1/sqrt(3) (-2, [1, 5], [2, 6])
Y finalmente un caso de prueba un poco más grande para asegurar la precisión: (0, [1], [6, 1, 3, 1, 42, 1, 3, 1, 6, 2]) --> (1, [], [1, 2, 1, 8, 1, 20, 1, 8, 1, 2, 1, 2])
.
¡El código más corto gana!
Sugerencia : puede realizar operaciones aritméticas de una manera bastante directa en fracciones continuas como se describe aquí . Duplicar una fracción continua es solo un caso especial de este algoritmo (aunque la parte difícil puede ser encontrar cuándo se repite la fracción continua).
fuente
Sqrt[2]
.[3; 1, 1, 1]
estaría(3, [1, 1, 1], [])
en el formato de entrada que estamos usando, por lo que la pregunta probablemente debería mencionarlo en ese formato (en el tercer párrafo), solo para garantizar la claridad.(-2, [1, 5, 2], [6, 2])
sería una salida aceptable para la entrada(-1, [2], [2, 1])
? ¿Qué tal(-2, [1, 5, 2, 6, 2, 6], [2, 6])
?Respuestas:
Wolfram Language (Mathematica) , 44 bytes
Pruébalo en línea!
Mathematica tiene un incorporado! ¡Hurra! La construcción de Mathematica es muy larga. Aww.
Las fracciones continuas de Mathematica se ven como
{integer, ...prefix, {...repeating}}
-1 gracias a JungHwan Min
fuente
*
porque el delimitador predeterminado de Mathematica, si no hay uno, esTimes
.JavaScript (ES6), 267 bytes
Acepta 3 argumentos (n = parte entera, f = prefijo, r = parte repetida). Emite las tres partes en una matriz. Pruébalo en línea!
Explicación
Es una implementación bastante directa del algoritmo para calcular aritmética de fracción continua vinculada en el desafío aquí . Los términos repetidos se manejan almacenando matrices intermedias en una tabla de búsqueda, esperando un duplicado y generando los términos hasta la próxima aparición de ese duplicado. Es poco elegante y casi duplica los bytes necesarios para manejar fracciones continuas, pero no puedo pensar en una mejor alternativa.
El término principal se calcula por separado para garantizar que las fracciones continuas negativas retengan valores positivos para todos los términos salvo el primero.
Para evitar falsos positivos cuando se espera un ciclo repetido, las tiendas de la tabla de conversión de los datos de la siguiente manera:
<index of input repeating part><delimiter><matrix values>
.Tenga en cuenta que la versión de golf utiliza
eval
para guardar 1 byte.fuente