Inspirado en http://xkcd.com/1331/
En este cómic xkcd, hay varios gifs que parpadean con diferente frecuencia. Quiero saber cuál sería el período si todo fuera un solo GIF. Dada una lista de números que representan las frecuencias individuales, genera el período del GIF general.
Definicion formal
Entrada:
N
f1
f2
.
.
.
fN
Salida:
P
Donde N es el número de frecuencias, fi es la frecuencia i-ésima y P es el período resultante del GIF total.
Puede elegir usar cualquier carácter de delimitación que desee (en lugar de \ n), y puede excluir la N si lo desea, y se deducirá por la cantidad de delimitadores.
Algunos detalles
Las frecuencias son la representación de coma flotante de precisión doble más cercana de los números proporcionados como entrada.
El período de salida es un entero sin signo de 64 bits, redondeado (hasta 0.5) al entero más cercano. Cualquier entrada que produzca un período mayor de 2 ^ 64-1 se considera comportamiento indefinido.
Del mismo modo, cualquier entrada <= 0 se considera comportamiento indefinido.
Condición de victoria
¡Golf de código para que el código más corto gane!
Respuestas:
APL, 4
∧
es un LCM lógico AND y numérico (con dominio sobre enteros, flotantes, complejos, racionales, cualquier pila de números que sea compatible con la implementación de APL), por lo que∧/
es la reducción por LCM o el cálculo del LCM de una matriz.Monadic
÷
es inversa numérica. Entonces, la composición∧/∘÷
es el MCM de los inversos de los números suministrados.La otra fórmula, inversa al GCD, sería
÷∘(∨/)
, donde los paréntesis son necesarios para fijar la precedencia entre∘
y/
.Puedes probarlo en línea en http://tryapl.com/
Ejemplos
fuente
Holy bananas!
Mathematica
4328Segundo intento
Mi primer intento no fue correcto, aunque tenía algunos de los ingredientes necesarios (LCM, Rationalize). La solución completa requiere tener en cuenta tanto el numerador como el denominador de cada frecuencia (expresada como una fracción común).
l
es la lista de frecuenciasRacionalizar 2.35 lo convierte en la fracción común 235/100.
Suponga que todos los GIF se disparan en t = 0.
El siguiente enfoque no requiere que las frecuencias se expresen como "números reales", es decir. como fracciones decimales Pueden ser otro tipo de fracciones. El siguiente ejemplo es un caso donde las fracciones están en quintos, tercios, centésimos y séptimos.
Si dos o más frecuencias son inconmensurables (en cuyo caso al menos una debe ser un número irracional), entonces no hay solución. En otras palabras, no habrá un punto en el tiempo, t> 0, en el que todos los componentes se disparen al mismo tiempo.
Ejemplo 1
Ejemplo 2
Si multiplicamos el período general mínimo por cada una de las frecuencias, encontramos un número entero de ciclos en cada caso:
(1344 saltos de 16/5 unidades) aterriza en 420. (280 saltos de 2/3 unidades) aterriza en 420. (987 saltos de 2.35 unidades) aterriza en 420. (60 saltos de 7 unidades) aterriza en 420.
fuente
Javascript: 191 caracteres
El formato de entrada que elegí (dentro de las reglas) son los números de frecuencia separados por comas. No se permiten espacios ni líneas nuevas. No se debe dar la N inicial. Cada número debe ser solo una serie de al menos un [0-9] dígitos con un punto opcional en algún lugar dentro. Si la entrada tiene un formato incorrecto, el comportamiento no está definido.
Cómo funciona:
El código:
Probándolo:
fuente
(⊃x÷z)×∨/z←{⍵×10}⍣{⍵≡⌈⍵}x←⎕
g/d
ad/g
. Agregaré algunos casos de prueba.