Inspirado em http://xkcd.com/1331/
Nesta história em quadrinhos do xkcd, existem vários gifs que piscam com frequência diferente. Quero saber qual seria o período se fosse um único GIF. Dada uma lista de números que representam as frequências individuais, imprima o período do GIF geral.
Definição formal
Entrada:
N
f1
f2
.
.
.
fN
Resultado:
P
Onde N é o número de frequências, fi é a i-ésima frequência e P é o período resultante do GIF total.
Você pode optar por usar qualquer caractere delimitante que desejar (em vez de \ n) e excluir o N, se desejar, e isso será deduzido pelo número de delímetros.
Algumas especificidades
As frequências são a representação de ponto flutuante de precisão dupla mais próxima dos números fornecidos como entrada.
O período de saída é um número inteiro não assinado de 64 bits, arredondado (acima de 0,5) para o todo mais próximo. Qualquer entrada que produza um período maior que 2 ^ 64-1 é considerado comportamento indefinido.
Da mesma forma, qualquer entrada <= 0 é considerada comportamento indefinido.
Condição da vitória
Código de golfe para ganhar o menor código!
Respostas:
APL, 4
∧
é LCM lógico e numérico (com domínio sobre números inteiros, flutuantes, complexos, racionais, qualquer pilha de números suportada pela implementação da APL), assim∧/
como a redução pelo LCM ou a computação do LCM de uma matriz.Monádico
÷
é inverso numérico. Portanto, a composição∧/∘÷
é o LCM dos inversos dos números fornecidos.A outra fórmula, inversa do GCD, seria
÷∘(∨/)
onde os parênteses são necessários para fixar a precedência entre∘
e/
.Você pode experimentá-lo online em http://tryapl.com/
Exemplos
fonte
Holy bananas!
Mathematica
4328Segunda tentativa
Minha primeira tentativa não foi correta, embora tivesse alguns dos ingredientes necessários (LCM, Racionalize). A solução completa requer levar em consideração o numerador e o denominador de cada frequência (expressa como uma fração comum).
l
é a lista de frequências.A racionalização de 2,35 o converte na fração comum 235/100.
Suponha que todos os GIFs sejam disparados em t = 0.
A abordagem a seguir não exige que as frequências sejam expressas como "números reais", ou seja. como frações decimais. Eles podem ser outro tipo de frações. O exemplo abaixo é um caso em que as frações estão em quintos, terços, centésimos e sétimos.
Se duas ou mais frequências são incomensuráveis (nesse caso, pelo menos uma deve ser um número irracional), não há solução. Em outras palavras, não haverá um ponto no tempo, t> 0, no qual todos os componentes serão acionados ao mesmo tempo.
Exemplo 1
Exemplo 2
Se multiplicarmos o menor período geral por cada uma das frequências, encontraremos um número inteiro de ciclos em cada caso:
(1344 saltos de 16/5 unidades) chegam a 420. (280 saltos de 2/3 unidades) chegam a 420. (987 saltos de 2,35 unidades) chegam a 420. (60 saltos de 7 unidades) chegam a 420.
fonte
Javascript: 191 caracteres
O formato de entrada que eu escolhi (dentro das regras) são os números de frequência separados por vírgulas. Não são permitidos espaços nem novas linhas. O N inicial não deve ser fornecido. Cada número deve ser apenas uma série de pelo menos um [0-9] dígitos com um ponto opcional em algum lugar. Se a entrada estiver malformada, o comportamento será indefinido.
Como funciona:
O código:
Testando:
fonte
(⊃x÷z)×∨/z←{⍵×10}⍣{⍵≡⌈⍵}x←⎕
g/d
parad/g
. Vou adicionar alguns casos de teste.