Sua tarefa é, dada x
, saída 2*x
. Fácil né !? Mas há um problema: x
será dado como uma fração contínua (possivelmente infinita) e a saída deve ser uma fração contínua. A entrada é garantida como um número algébrico real, cujo grau é no máximo 2.
Entrada : a fração continuada de x
. Isso é dividido em 3 partes: a parte inteira, o prefixo e a parte repetida. A parte inteira consiste em um único inteiro. O prefixo e a parte de repetição são (possivelmente vazios) matrizes de números inteiros positivos que descrevem o prefixo e a parte de repetição da fração continuada. Por exemplo, a entrada (3, [1], [2, 4])
representa a fração continuada [3; 1, 2, 4, 2, 4, ...]
.
Se a parte repetida estiver vazia, isso indica um número racional. Por exemplo, (3, [1, 2], [])
representa [3; 1, 2] = 11/3
. Você deve aceitar as duas formas de um número racional (ou seja (3, [1, 1, 1], [])
, que [3; 1, 1, 1] = 11/3
também deve ser uma entrada válida).
Saída : gera a fração contínua de duas vezes a entrada, no mesmo formato da entrada. Se a saída for racional, você poderá gerar uma das formas da fração continuada. Contanto que a resposta seja equivalente à resposta correta, tudo bem; nenhuma "compressão" é necessária; portanto, a parte infinita pode ser "desenrolada" um pouco (por exemplo, [1; 4, 2, 3, 2, 3...]
pode ser escrita (1, [4], [2, 3])
ou (1, [4, 2, 3], [2, 3])
). Todas as respostas devem ser exatas.
Casos de teste : a coluna exata do formulário é fornecida por conveniência.
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])
E, finalmente, um caso de teste um pouco maior para assegurar a precisão: (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])
.
O menor código vence!
Dica : Você pode executar aritmética de maneira bastante direta nas frações contínuas, conforme descrito aqui . Dobrar uma fração continuada é apenas um caso especial desse algoritmo (embora a parte mais complicada seja encontrar quando a fração continuada se repete).
fonte
Sqrt[2]
.[3; 1, 1, 1]
estaria(3, [1, 1, 1], [])
no formato de entrada que estamos usando - portanto, a pergunta provavelmente deve mencioná-la nesse formato (no terceiro parágrafo), apenas para garantir clareza.(-2, [1, 5, 2], [6, 2])
uma saída aceitável para entrada(-1, [2], [2, 1])
? Que tal(-2, [1, 5, 2, 6, 2, 6], [2, 6])
?Respostas:
Wolfram Language (Mathematica) , 44 bytes
Experimente online!
O Mathematica possui um builtin! Yay! O builtin do Mathematica é super longo. Aww.
As frações contínuas do Mathematica parecem
{integer, ...prefix, {...repeating}}
-1 graças a JungHwan Min
fonte
*
porque o delimitador padrão do Mathematica, se não houver um, éTimes
.JavaScript (ES6), 267 bytes
Aceita 3 argumentos (n = parte inteira, f = prefixo, r = parte repetida). Produz as três partes em uma matriz. Experimente online!
Explicação
É uma implementação bastante direta do algoritmo para calcular a aritmética de fração contínua vinculada no desafio aqui . Termos repetidos são tratados armazenando matrizes intermediárias em uma tabela de pesquisa, aguardando uma duplicata e produzindo os termos até a próxima aparição dessa duplicata. É deselegante e quase dobra os bytes necessários para lidar com frações contínuas, mas não consegui pensar em uma alternativa melhor.
O termo inicial é calculado separadamente para garantir que frações contínuas negativas retenham valores positivos para todos os termos, exceto o primeiro.
Para evitar falsos positivos quando aguardando um ciclo repetido, as lojas tabela de pesquisa de dados da seguinte forma:
<index of input repeating part><delimiter><matrix values>
.Observe que a versão golfed usa
eval
para salvar 1 byte.fonte