ความจริง259 , 193 , 181 , 179 ไบต์
L(g,n,f)==>[g for i in 1..n|f]
h(a)==(n:=#a;n=1=>a;c:=h(L(a.i,n,odd? i));d:=h(L(a.i,n,even? i));n:=n/2;t:=1>0;v:=L(d.i*%i^(-2*(i-1)/n),n,t);append(L(c.i+v.i,n,t),L(c.i-v.i,n,t)))
แม้ว่า h (ก) สามารถผ่านการทดสอบทั้งหมดและจะ ok เป็นรายการสำหรับการนี้การแข่งขัน 'หนึ่งที่มีการเรียก h () หรือ HLP () ผ่าน FFT () ด้านล่างเพื่อตรวจสอบข้อโต้แย้ง ฉันไม่รู้ว่าซอฟต์แวร์นี้สามารถใช้ได้หรือไม่เพราะฉันเพิ่งเห็นสิ่งที่คนอื่นเขียนและค้นหาวิธีที่มันสามารถทำงานใน Axiom เพื่อให้ได้ผลลัพธ์ที่ถูกต้อง ด้านล่างโค้ด ungolfed มีความคิดเห็นเล็กน้อย:
-- L(g,n,f)==>[g for i in 1..n|f]
-- this macro L, build one List from other list, where in g, there is the generic element of index i
-- (as a.i, or a.i*b.i or a.i*4), n build 1..n that is the range of i, f is the condition
-- for insert the element in the list result.
hlp(a)==
n:=#a;n=1=>a
-- L(a.i,n,odd? i) it means build a list getting "even indices i of a.i as starting from index 0" [so even is odd and odd is even]
-- L(a.i,n,even? i) it means build a list getting "odd indices i of a.i as starting from index 0"
c:=hlp(L(a.i,n,odd? i));d:=hlp(L(a.i,n,even? i))
n:=n/2;t:=1>0
v:=L(d.i*%i^(-2*(i-1)/n),n,t)
append(L(c.i+v.i,n,t),L(c.i-v.i,n,t))
-- Return Fast Fourier transform of list a, in the case #a=2^n
fft(a)==(n:=#a;n=0 or gcd(n,2^30)~=n=>[];hlp(a))
(5) -> h([1,1,1,1])
(5) [4,0,0,0]
Type: List Expression Complex Integer
(6) -> h([1,2,3,4])
(6) [10,- 2 + 2%i,- 2,- 2 - 2%i]
Type: List Expression Complex Integer
(7) -> h([5.24626,3.90746,3.72335,5.74429,4.7983,8.34171,4.46785,0.760139])
(7)
[36.989359, - 6.2118552150 341603904 + 0.3556612739 187363298 %i,
1.85336 - 5.744741 %i, 7.1077752150 341603904 - 1.1333387260 812636702 %i,
- 0.517839, 7.1077752150 341603904 + 1.1333387260 812636702 %i,
1.85336 + 5.744741 %i,
- 6.2118552150 341603904 - 0.3556612739 187363298 %i]
Type: List Expression Complex Float
(8) -> h([%i+1,2,%i-2,9])
(8) [10 + 2%i,3 + 7%i,- 12 + 2%i,3 - 7%i]
Type: List Expression Complex Integer
ในไม่กี่ที่ฉันเคยเห็น h () หรือ fft () จะกลับมาแก้ปัญหาที่แน่นอน แต่ถ้าการทำให้เข้าใจง่ายไม่ดีเหมือนใน:
(13) -> h([1,2,3,4,5,6,7,8])
(13)
+--+ +--+
(- 4 + 4%i)\|%i - 4 + 4%i (- 4 - 4%i)\|%i - 4 + 4%i
[36, --------------------------, - 4 + 4%i, --------------------------, - 4,
+--+ +--+
\|%i \|%i
+--+ +--+
(- 4 + 4%i)\|%i + 4 - 4%i (- 4 - 4%i)\|%i + 4 - 4%i
--------------------------, - 4 - 4%i, --------------------------]
+--+ +--+
\|%i \|%i
Type: List Expression Complex Integer
มากกว่าที่จะพอเปลี่ยนประเภทขององค์ประกอบเพียงหนึ่งรายการตามที่เขียนด้านล่าง 8 (ลอย) เพื่อค้นหาวิธีแก้ปัญหาโดยประมาณ:
(14) -> h([1,2,3,4,5,6,7,8.])
(14)
[36.0, - 4.0000000000 000000001 + 9.6568542494 923801953 %i, - 4.0 + 4.0 %i,
- 4.0 + 1.6568542494 92380195 %i, - 4.0, - 4.0 - 1.6568542494 92380195 %i,
- 4.0 - 4.0 %i, - 4.0 - 9.6568542494 923801953 %i]
Type: List Expression Complex Float
ฉันเขียนไปแล้วเห็นคำตอบอื่น ๆ ทั้งหมดเพราะในลิงค์หน้ามันยากเกินไปดังนั้นฉันไม่รู้ว่ารหัสนี้ถูกต้องหรือไม่ ฉันไม่ใช่ผู้เชี่ยวชาญ fft หนึ่งคนดังนั้นทั้งหมดนี้สามารถ (เป็นไปได้) ผิด
FFT
(3 ตัวอักษร): อยู่ในไลบรารีมาตรฐาน" หรือไม่ บางกรณีทดสอบก็จะดีเช่นกัน