Hoje seu objetivo é encontrar inteiros um e b dado inteiro não negativo n tal que:
Você deve escrever um programa ou uma função que leva parâmetro n e gera um e b em um formato de sua escolha.
Aplicam-se brechas padrão. Além disso, você pretende implementar o problema acima usando aritmética básica. Portanto, você não pode usar a funcionalidade exata da álgebra, os racionais ou as funções que implementam construções matemáticas não triviais (por exemplo, a sequência de Lucas ).
O menor código em bytes vence.
Exemplo de entrada / saída:
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
fonte
[3 5;1 3]**input('')*[1;0]
é de 26 bytes, e não 41.@(n)[3 5;1 3]^n*[1;0]
(identificador de função) economizaria cinco caracteres, mude a ideia!Python 2, 50
Multiplica-se
3+sqrt(5)
repetidamente por sua ação no par que(a,b)
representaa+b*sqrt(5)
. Equivale a começar com o vetor da coluna[1,0]
e osn
tempos de multiplicação à esquerda pela matriz[[3,5],[1,3]]
.fonte
Julia,
2220 bytesIsso cria uma função lambda que recebe um único inteiro como entrada e retorna um vetor de 2 elementos com números inteiros correspondentes à solução [a, b]. Para chamá-lo, dê um nome, por exemplo
f=n->...
.Comece multiplicando
Podemos então traduzir o lado direito dessa equação em uma matriz de 2 colunas, onde a primeira corresponde ao coeficiente de a e a segunda ao coeficiente de b :
Multiplique esta matriz por si mesma n vezes, depois multiplique à direita pelo vetor da coluna (1, 0) e POOF! Out aparece o vetor da solução.
Exemplos:
fonte
J, 20 bytes
Multiplique o vetor
[1 0]
pelos[[3 5] [1 3]]
n
tempos da matriz .2 bytes salvos graças a @algorithmshark.
Uso e teste:
fonte
+/ .*(3 5,:1 3&)&1 0
.(+/@:*&(3 5,.1 3)&1 0)
funciona e(+/@:*&1 0&(3 5,.1 3))
não? O segundo não deveria se relacionar corretamente e o primeiro trocar?&
faz a alimentação / looping, para que você modifique a entrada do lado esquerdo durante a alimentação (oposta à modificação normal do lado direito).Pitão, 20 bytes
u
que é reduzir em geral, é usado aqui como um loop aplicar repetidamente. A função de atualização éG
->,+*3sGyeG+sGyeG
, ondeG
é uma tupla de 2. Essa função se traduz em3*sum(G) + 2*G[1], sum(G) + 2*G[1]
.s
ésum
,y
é*2
.fonte
APL (22)
Explicação:
{
...}⍣⎕⍨2↑1
: leia um número e execute a seguinte função várias vezes, usando[1,0]
como entrada inicial.2 2⍴3 5 1
: o Matrix[[3,5],[1,3]]
⍵+.×⍨
: multiplique o primeiro número em ⍵ por 3, o segundo por 5 e some-os, esse é o novo primeiro número; então multiplique o primeiro número em ⍵ por 1, o segundo por 3 e some esses, que é o novo segundo número.fonte
Gelatina , 13 bytes
Experimente online!
Como funciona
fonte
Mathematica, 31
fonte
CJam, 21 bytes
Experimente online.
Como funciona
fonte
Javascript,
6361 bytesEstou usando uma avaliação recursiva do binômio: (x + y) ^ n = (x + y) (x + y) ^ {n-1}
Novo (graças a @ edc65)
Velho
fonte
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]
mesmo comprimentoC, 114 bytes
Isso implementa a multiplicação de matrizes da maneira chata. Para uma solução de 238 bytes mais divertida (citação: "incrivelmente horrível"), não precisa procurar mais!
Desvendado:
Provavelmente isso poderia ser reduzido. Experimente um programa de teste online !
fonte
k2 - 22 car
Função tendo um argumento.
_mul
é a multiplicação de matrizes, então a curry com a matriz(3 5;1 3)
e, em seguida, a atingimos com o advérbio de poder funcional:f/[n;x]
aplicaf
- se ax
,n
times. Mais uma vez, o curry, desta vez com o vetor inicial1 0
.Isso não vai funcionar em Kona, porque por algum motivo
f/[n;x]
não foi implementado corretamente. Somente an f/x
sintaxe funciona, portanto, a correção mais curta é de{x _mul[(3 5;1 3)]/1 0}
23 caracteres.fonte
25 bytes (20 caracteres)
Eu esperava melhor, mas existem muitas chaves necessárias para torná-la competente, a precedência do operador não é ideal para o golfe.
Ele espera que a entrada esteja no slot de memória de $ 1, portanto, isso funciona:
Para n = 0, o zero é ignorado (gera 1, em vez de 1 0). Se isso for um problema, substitua a final
1
por~[2]
.fonte
Sério, 32 bytes, não concorrente
Hex Dump:
Experimente-o Onlline
Obviamente, não é um candidato pelo menor tempo, mas pelo menos o método é original. (Observando que esse problema indica necessariamente uma sequência de Lucas, conforme mencionado na descrição, este programa gera termos sucessivos das sequências usando a relação de recorrência
a_n = 6 * a_ {n-1} - 4 * a_ {n-2}.)
fonte
Haskell, 41 bytes
Exemplo de uso:
(iterate(\(a,b)->(3*a+5*b,a+3*b))(1,0)!!) 8
->(282496,126336)
.fonte
C / C ++ 89 bytes
Formatado:
Mesmo conceito:
O banco de ensaio:
A saída:
fonte
K, 37 bytes
ou
Ambos são a mesma coisa.
fonte
Python 3, 49 bytes
embora na minha máquina, isso só dê a resposta correta para entradas na faixa
0 <= n <= 18
.Isso implementa a fórmula de formulário fechado
e aproveita o fato de que a
v ** n
peça é pequena e pode ser calculada por arredondamento, em vez de cálculo direto.fonte
Esquema, 97 bytes
fonte
C 71 bytes (60 com variáveis pré-inicializadas)
Escopo para o golfe ainda, mas apenas para provar que C não precisa ser "terrivelmente horrível".
Se os valores em a forem inicializados em {1,0}, faremos melhor.
Isso é iterativamente usando os mapeamentos a-> 3a + 5b, b-> a + 3b, mas evitando uma variável temporária calculando a a partir do novo valor de b.
fonte
a[*a=1]=0
vez de*a=1,a[1]=0
(não concorrente) Gelatina, 10 bytes
Experimente online!
Usa matriz. Calcula ([[3,1], [5,3]] ** entrada ()) [0].
fonte