Implemente la Transformada rápida de Fourier en la menor cantidad de caracteres posible.
Reglas:
- La solución más corta gana
- Se puede suponer que la entrada es una matriz 1D cuya longitud es una potencia de dos.
- Puede usar el algoritmo de su elección, pero la solución debe ser una Transformada rápida de Fourier, no solo una ingenua Transformada discreta de Fourier (es decir, debe tener un costo de cálculo asintótico de )
Editar:
el código debe implementar la Transformación rápida rápida de Fourier estándar, cuya forma se puede ver en la ecuación (3) de este artículo de Wolfram ,
- El uso de una función FFT de una biblioteca estándar preexistente o un paquete de estadísticas no está permitido. El reto aquí es sucinta aplicar el algoritmo FFT en sí.
code-golf
math
complex-numbers
jakevdp
fuente
fuente
FFT
(3 caracteres): está en la biblioteca estándar"? Algunos casos de prueba también serían buenos.Respuestas:
Mathematica, 95 bytes
Otra implementación de Cooley – Tukey FFT con la ayuda de @ chyaong .
Sin golf
fuente
#[[;;;;2]]==#[[1;;N;;2]]
y[[2;;;;2]]==[[2;;N;;2]]
.With[{L=Length@#},If[L>1,Join[+##,#-#2]&[#0@#[[;;;;2]],#0@#[[2;;;;2]]E^(-2I*Pi(Range[L/2]-1)/L)],#]]&
J, 37 bytes
Una mejora después de unos años. Todavía usa el algoritmo Cooley-Tukey FFT.
Guardado 4 bytes usando e πi = -1, gracias a @ Leaky Nun .
Pruébalo en línea!
Uso
Explicación
fuente
Pitón,
166151150 caracteresEsto usa el algoritmo radix-2 Cooley-Tukey FFT
Probar el resultado
fuente
from x import*
, ysum(([x for x in y] for y in z),[])
es más largo que[x for y in z for x in y]
.Python 3:
140134113 caracteresVersión corta: corta y dulce, cabe en un tweet (gracias a las millas ):
(En Python 2,
/
se trunca la división cuando ambos lados son enteros. Por lo tanto, reemplazamos(i*4/n)
por(i*4.0/n)
, lo que aumenta la longitud a 115 caracteres).Versión larga: más claridad en la parte interna del clásico Cooley-Tukey FFT:
fuente
e^(-2j * pi * i / n) = (-1)^(2 * i / n) = (1j)^(4 * i / n)
R:
1421339995 bytes¡Gracias a @Giuseppe por ayudarme a reducir
3236 bytes!Un truco adicional aquí es usar los argumentos predeterminados de la función principal para instanciar algunas variables.
El uso sigue siendo el mismo:
Versión de 4 años de antigüedad en 133 bytes:
Con hendiduras:
Utiliza también el algoritmo Cooley-Tukey. Los únicos trucos aquí son el uso de la función
Recall
que permite la recursividad y el uso de la vectorización R que acorta en gran medida el cálculo real.Uso:
fuente
Recall
ya que es una función con nombre, pero bueno, ¡es fácil jugar al golf en retrospectiva! :) +1, muy agradable.Recall
ahora es innecesario, de hecho. Me di cuenta de eso hace unos meses pero era demasiado vago para cambiarlo :) Lo modificaré.y
allí, pero no me di cuenta de que también podría usarse para laexp(...)
parte.Python, 134
Esto toma mucho prestado de la solución de jakevdp, por lo que configuré este en una wiki comunitaria.
Cambios:
-12 caracteres: matar
t
.-1 char: truco de exponente,
x*y**-z == x/y**z
(esto podría ayudar a otros)-2 caracteres: reemplazar
and
con*
+1 char:
lambda
ize, matandoN
-2 char: usar en
enumerate
lugar dezip(range(len(
fuente
f=lambda x:x*(len(x)<2)or[u+v/1j**(4*i/len(x))for i,(u,v)in enumerate(zip(f(x[::2])*2,f(x[1::2])*2))]
for s in(1,-1)for
confor s in 1,-1for
o incluso, si el orden no importa,for s in-1,1for
.C, 259
El problema es que tales implementaciones son inútiles, y el algoritmo directo es MUCHO más rápido.
fuente
step < n
se puede cambiar astep<n
ystep * 2
se puede cambiar astep*2
.Matlab,
1281181071021019493 bytesEDIT6: ¡gracias @algmyr por otro byte!
EDIT5: Todavía se está acortando :) gracias a @sanchises
EDITAR4: Sí, -1 carácter más (también podría haberlo hecho sin el
k
):EDIT2 / 3: ¡Gracias por @sanchises por nuevas mejoras!
EDITAR: podría hacer algunas mejoras, y noté que la constante de escala no es necesaria.
Esta es la versión ampliada, el recuento de caracteres es válido si elimina las nuevas líneas / espacios. (Funciona solo para vectores de columna).
fuente
d=
líneas en una sola:m=n/2;d=f(Y(2:2:n)).*exp(-pi*i*(0:m-1)/m).';
. Además, considere cambiary=f(Y)
aY=f(Y)
y quitar la línea 3 (y promete que nunca se va a hacer que fuera de código de golf)function Y = f(Y)
Tiene alguna desventaja aparte de la imposibilidad de leer?m=n/2
podría eliminarse ym
reemplazarse porn/2
yn*2
respectivamente. Y luego, creo firmemente, que el programa es tan corto como podría ser en MATLAB.Gelatina,
31302826 bytes , no competitivaJelly fue creada después de este desafío, por lo que no es competitiva.
Esto usa el algoritmo recursivo Cooley-Tukey radix-2. Para una versión sin golf, vea mi respuesta en Mathematica.
Pruébelo en línea o Verifique múltiples casos de prueba .
Explicación
fuente
C (gcc) ,
188 186 184183 bytesPruébalo en línea!
Ligeramente menos golf
fuente
Pari / GP, 76 caracteres
Uso
fuente
Octava ,
109103101100bytesPruébalo en línea!
Ooooo, ¿me sangran los ojos de esta lambda maldita
recursiva? Grandes partes de esto fueron extraídas de la respuesta de @ flawr.fuente
Axioma,
259,193,181, 179 bytesIncluso si h (a) pudiera pasar toda la prueba y estaría bien como entrada para esta 'competencia', uno debe llamar h () o hlp () a través de fft () a continuación, para verificar los argumentos . No sé si este software puede estar bien porque solo había visto lo que otros escribieron, y busqué la forma en que podría ejecutarse en Axiom para devolver algún posible resultado correcto. Debajo del código sin golf con algunos comentarios:
en los pocos que había visto h () o fft () devolvería la solución exacta, pero si la simplificación no es buena como en:
de lo que es suficiente cambiar el tipo de un solo elemento de la lista, como se muestra a continuación en la escritura 8. (Flotante) para encontrar la solución aproximada:
Lo escribí, vi todas las otras respuestas porque en el enlace, la página era demasiado difícil, así que no sé si este código puede ser correcto. No soy un experto experto, así que todo esto puede (es probable) estar equivocado.
fuente
APL (NARS), 58 caracteres, 116 bytes
prueba
fuente