Implémentez la transformation de Fourier rapide dans le moins de caractères possible.
Règles:
- La solution la plus courte gagne
- On peut supposer que l'entrée est un tableau 1D dont la longueur est une puissance de deux.
- Vous pouvez utiliser l’algorithme de votre choix, mais la solution doit en réalité être une transformation de Fourier rapide, et pas seulement une transformation de Fourier discrète naïve (c’est-à-dire qu’elle doit avoir un coût de calcul asymptotique de ).
Modifier:
le code doit implémenter la transformée de Fourier rapide vers l'avant standard, dont on peut voir la forme dans l'équation (3) de cet article de Wolfram ,
- L'utilisation d'une fonction FFT à partir d'une bibliothèque standard préexistante ou d'un package de statistiques n'est pas autorisée. Le défi consiste ici à implémenter succinctement l’algorithme FFT lui-même.
code-golf
math
complex-numbers
jakevdp
la source
la source
FFT
(3 caractères): c'est dans la bibliothèque standard"? Certains cas de test seraient bien aussi.Réponses:
Mathematica, 95 octets
Une autre implémentation de la FFT Cooley – Tukey avec l'aide de @ chyaong .
Ungolfed
la source
#[[;;;;2]]==#[[1;;N;;2]]
et[[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 octets
Une amélioration après quelques années. Utilise toujours l'algorithme FFT de Cooley-Tukey.
Sauvegardé 4 octets en utilisant e πi = -1, grâce à @ Leaky Nun .
Essayez-le en ligne!
Usage
Explication
la source
Python,
166151150 caractèresCeci utilise l'algorithme FFT de radix-2 Cooley-Tukey
Tester le résultat
la source
from x import*
, etsum(([x for x in y] for y in z),[])
est plus long que[x for y in z for x in y]
.Python 3:
140134113 caractèresVersion courte - courte et douce, s'inscrit dans un tweet (avec des miles ):
(En Python 2, la
/
division est tronquée lorsque les deux côtés sont des entiers. Nous remplaçons donc(i*4/n)
par(i*4.0/n)
, ce qui réduit la longueur à 115 caractères.)Version longue - plus de clarté dans les éléments internes du classique FFT Cooley-Tukey:
la source
e^(-2j * pi * i / n) = (-1)^(2 * i / n) = (1j)^(4 * i / n)
R:
1421339995 octetsMerci à @ Giuseppe de m'avoir aidé à réduire de
32 à36 octets!Une astuce supplémentaire consiste à utiliser les arguments par défaut de la fonction principale pour instancier certaines variables.
L'utilisation est toujours la même:
Version 4 ans à 133 octets:
Avec indentations:
Il utilise également l'algorithme de Cooley-Tukey. Les seules astuces ici sont l'utilisation de la fonction
Recall
qui permet la récursivité et l'utilisation de la vectorisation R qui raccourcit considérablement le calcul réel.Usage:
la source
Recall
cette fonction, mais bon, c'est facile de jouer au golf avec le recul! :) +1, très sympa.Recall
est maintenant inutile, en effet. J'ai remarqué cela il y a quelques mois mais j'étais trop paresseux pour le changer :) Je vais le modifier.y
y aller mais je n’ai pas remarqué que cela pourrait également être utileexp(...)
.Python, 134
Ceci emprunte beaucoup à la solution de jakevdp, je l'ai donc définie sur un wiki de communauté.
Changements:
-12 caractères: tuer
t
.-1 caractère: astuce de l'exposant,
x*y**-z == x/y**z
(cela pourrait aider d'autres)-2 caractères: remplacer
and
par*
+1 personnage:
lambda
ize, tuerN
-2 caractères: utiliser
enumerate
au lieu dezip(range(len(
la source
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
avecfor s in 1,-1for
ou même, si l' ordre n'a pas d' importance,for s in-1,1for
.C, 259
Le problème est que de telles implémentations sont inutiles et qu'un algorithme simple est BEAUCOUP plus rapide.
la source
step < n
peut être changé enstep<n
etstep * 2
peut être changé enstep*2
.Matlab,
1281181071021019493 octetsEDIT6: merci @algmyr pour un autre octet!
EDIT5: Toujours plus court :) grâce à @sanchises
EDIT4: Yay, -1 caractère de plus (aurait également pu se passer de
k
):EDIT2 / 3: Merci pour les @sanchises pour d'autres améliorations!
EDIT: Pourrait apporter quelques améliorations, et a remarqué que la constante de mise à l'échelle n'est pas requise.
Ceci est la version développée, le nombre de caractères est valide si vous supprimez les nouvelles lignes / espaces. (Fonctionne uniquement pour les vecteurs de colonne.)
la source
d=
lignes en une seule:m=n/2;d=f(Y(2:2:n)).*exp(-pi*i*(0:m-1)/m).';
. En outre, envisager de changery=f(Y)
pourY=f(Y)
et supprimer la ligne 3 (et la promesse que vous ne serez jamais le faire en dehors du code de golf)function Y = f(Y)
-il des inconvénients autres que l’illisibilité?m=n/2
pourrait être enlevé, etm
remplacé à la place parn/2
etn*2
respectivement. Et puis, je crois fermement, le programme est aussi court que ce que pourrait être MATLAB.Jelly,
31302826 octets , non en compétitionJelly a été créée après ce défi, elle est donc non compétitive.
Ceci utilise l'algorithme récursif de Cooley-Tukey radix-2. Pour une version sans jeu, voir ma réponse dans Mathematica.
Essayez-le en ligne ou vérifiez plusieurs scénarios de test .
Explication
la source
C (gcc) ,
188 186 184183 octetsEssayez-le en ligne!
Légèrement golfé moins
la source
Pari / GP, 76 caractères
Usage
la source
Octave ,
109 103 101100 octetsEssayez-le en ligne!
Ooooo mes yeux saignent de ce lambda maudit
récursif. De grandes parties de ceci ont été retirées de la réponse de @ flawr.la source
APL (NARS), 58 caractères, 116 octets
tester
la source
Axiome,
259,193,181, 179 octetsMême si h (a) pourrait passer tout le test et serait acceptable, comme entrée pour ce «concours», il faut appeler h () ou hlp () à travers fft () ci-dessous, pour vérifier les arguments . Je ne sais pas si ce logiciel peut fonctionner, car j’ai seulement vu ce que les autres ont écrit et j’ai cherché comment il pourrait fonctionner dans Axiom pour obtenir un résultat correct. Ci-dessous du code non-golfé avec quelques commentaires:
dans quelques-uns que j'avais vu h () ou fft () renverrait la solution exacte, mais si la simplification n'est pas bonne comme dans:
qu’il suffit d’en changer le type d’un seul élément de la liste, comme dans l’écriture ci-dessous 8. (Float) pour trouver la solution approximative:
Je l'ai écrit, vu toutes les autres réponses car dans le lien, la page était trop difficile, donc je ne sais pas si ce code peut être correct. Je ne suis pas un expert, donc tout cela peut (il est probable) se tromper.
la source