Hoy su objetivo es encontrar los números enteros a y b entero no negativo dado n tal que:
Usted debe escribir un programa o una función que toma el parámetro n y da salida a una y B en un formato de su elección.
Se aplican lagunas estándar. Además, se pretende que implemente el problema anterior utilizando la aritmética básica usted mismo. Por lo tanto, no puede utilizar la funcionalidad de álgebra exacta incorporada, los racionales o las funciones que implementan construcciones matemáticas no triviales (por ejemplo, la secuencia de Lucas ).
El código más corto en bytes gana.
Ejemplo de entrada / salida:
0 → 1, 0
1 → 3, 1
2 → 14, 6
3 → 72, 32
4 → 376, 168
5 → 1968, 880
6 → 10304, 4608
7 → 53952, 24128
8 → 282496, 126336
9 → 1479168, 661504
fuente
[3 5;1 3]**input('')*[1;0]
es 26 bytes, no 41.@(n)[3 5;1 3]^n*[1;0]
(manejador de funciones) le ahorraría cinco caracteres, ¡buena idea!Pitón 2, 50
Multiplica por
3+sqrt(5)
repetidamente por su acción sobre el par que(a,b)
representaa+b*sqrt(5)
. Equivalente a comenzar con el vector de columna[1,0]
y multiplicar a la izquierdan
por la matriz[[3,5],[1,3]]
.fuente
Julia,
2220 bytesEsto crea una función lambda que toma un entero entero como entrada y devuelve un vector de enteros de 2 elementos correspondiente a la solución [a, b]. Para llamarlo, dale un nombre, por ejemplo
f=n->...
.Comienza multiplicando
Luego podemos traducir el lado derecho de esta ecuación en una matriz de 2 columnas, donde la primera corresponde al coeficiente de a y la segunda al coeficiente de b :
Multiplique esta matriz por sí misma n veces, luego multiplique a la derecha por el vector de columna (1, 0) y ¡POOF! Fuera aparece el vector solución.
Ejemplos:
fuente
J, 20 bytes
Multiplica el vector
[1 0]
con los[[3 5] [1 3]]
n
tiempos de la matriz .2 bytes guardados gracias a @algorithmshark.
Uso y prueba:
fuente
+/ .*(3 5,:1 3&)&1 0
.(+/@:*&(3 5,.1 3)&1 0)
funciona y(+/@:*&1 0&(3 5,.1 3))
no? ¿No debería el segundo enlace correctamente y el primero intercambiado?&
hace la alimentación / bucle para que modifique la entrada del lado izquierdo durante el encendido (opuesto a la modificación normal del lado derecho).Pyth, 20 bytes
u
que se reduce en general, se usa aquí como un ciclo de aplicación repetida. La función de actualización esG
->,+*3sGyeG+sGyeG
, dondeG
hay una tupla 2. Esa función se traduce en3*sum(G) + 2*G[1], sum(G) + 2*G[1]
.s
essum
,y
es*2
.fuente
APL (22)
Explicación:
{
...}⍣⎕⍨2↑1
: lea un número y ejecute la siguiente función muchas veces, utilizando[1,0]
como entrada inicial.2 2⍴3 5 1
: la matriz[[3,5],[1,3]]
⍵+.×⍨
: multiplique el primer número en ⍵ por 3, el segundo por 5, y sume, este es el nuevo primer número; luego multiplique el primer número en ⍵ por 1, el segundo por 3, y sume esos, ese es el nuevo segundo número.fuente
Jalea , 13 bytes
Pruébalo en línea!
Cómo funciona
fuente
Mathematica, 31
fuente
CJam, 21 bytes
Pruébalo en línea.
Cómo funciona
fuente
Javascript,
6361 bytesEstoy usando una evaluación recursiva del binomio: (x + y) ^ n = (x + y) (x + y) ^ {n-1}
Nuevo (gracias a @ edc65)
Antiguo
fuente
F=n=>{for(i=y=0,x=1;i++<n;)[x,y]=[3*x+5*y,x+3*y];return[x,y]}
n=>[...Array(n)].map(_=>[x,y]=[3*x+5*y,x+3*y],y=0,x=1)[n-1]
misma longitudC, 114 bytes
Esto implementa la multiplicación de matrices de forma aburrida. Para una solución más divertida (cita: "increíblemente horrible") de 238 bytes, ¡no busques más!
Desenredado:
Esto probablemente podría acortarse un poco. ¡Pruebe un programa de prueba en línea !
fuente
k2 - 22 char
Función tomando un argumento.
_mul
es la multiplicación de matrices, así que de curry con la matriz(3 5;1 3)
y luego golpearlo con el adverbio potencia funcional:f/[n;x]
se aplicaf
ax
,n
veces. Nuevamente lo curry, esta vez con el vector de inicio1 0
.Esto no funcionará en Kona, porque por alguna razón
f/[n;x]
no se implementa correctamente. Solo funciona lan f/x
sintaxis, por lo que la solución más corta es{x _mul[(3 5;1 3)]/1 0}
en 23 caracteres.fuente
ised, 25 bytes (20 caracteres)
Esperaba mejorar, pero se necesitan demasiados aparatos en ised para que sea competente, la prioridad del operador no es óptima para jugar al golf.
Espera que la entrada esté en la ranura de memoria de $ 1, por lo que esto funciona:
Para n = 0, se omite el cero (salidas 1, en lugar de 1 0). Si eso es un problema, reemplace el final
1
con~[2]
.fuente
En serio, 32 bytes, no competitivos
Hex Dump:
Pruébalo en línea
Obviamente no es un contendiente por el más corto, pero al menos el método es original. (Notando que tal problema necesariamente indica una secuencia de Lucas, como se menciona en la descripción, este programa genera términos sucesivos de las secuencias usando la relación de recurrencia
a_n = 6 * a_ {n-1} - 4 * a_ {n-2}.)
fuente
Haskell, 41 bytes
Ejemplo de uso:
(iterate(\(a,b)->(3*a+5*b,a+3*b))(1,0)!!) 8
->(282496,126336)
.fuente
C / C ++ 89 bytes
Formateado:
Mismo concepto:
El banco de pruebas:
La salida:
fuente
K, 37 bytes
o
Ambos son lo mismo.
fuente
Python 3, 49 bytes
aunque en mi máquina, esto solo da la respuesta correcta para las entradas en el rango
0 <= n <= 18
.Esto implementa la fórmula de forma cerrada
y aprovecha el hecho de que la
v ** n
pieza es pequeña y puede calcularse mediante redondeo en lugar de cálculo directo.fuente
Esquema, 97 bytes
fuente
C 71 bytes (60 con variables preinicializadas)
Alcance para jugar al golf todavía, pero solo para demostrar que C no tiene que ser "horriblemente horrible".
Si los valores en a se inicializan a {1,0}, lo hacemos mejor.
Esto está utilizando iterativamente las asignaciones a-> 3a + 5b, b-> a + 3b pero evitando una variable temporal calculando a a partir del nuevo valor de b.
fuente
a[*a=1]=0
lugar de*a=1,a[1]=0
(no competitiva) Jelly, 10 bytes
Pruébalo en línea!
Utiliza matriz. Calcula ([[3,1], [5,3]] ** input ()) [0].
fuente