Hacker News 中文摘要

RSS订阅

用余弦函数解决Fizz Buzz问题 -- Solving Fizz Buzz with Cosines

文章摘要

这篇文章探讨了如何用余弦函数和傅里叶级数来实现Fizz Buzz游戏。Fizz Buzz是一个简单的编程测试,要求根据数字是否被3或5整除输出不同结果。作者通过数学方法,将四种输出情况编码为一个闭合表达式,最终构建出一个有限傅里叶级数来选择要打印的文本。这种方法虽然复杂,但展示了数学在编程中的创造性应用。

文章总结

用余弦函数解决Fizz Buzz问题

作者:Susam Pal
日期:2025年11月20日

Fizz Buzz是一个计数游戏,在编程领域常被用作基础编程能力的测试。游戏规则很简单:玩家从1开始按顺序报数,当数字能被3整除时说"Fizz",能被5整除时说"Buzz",同时能被3和5整除时则说"FizzBuzz"。

传统实现方式

典型的Python实现如下: python for n in range(1, 101): if n % 15 == 0: print('FizzBuzz') elif n % 3 == 0: print('Fizz') elif n % 5 == 0: print('Buzz') else: print(n)

数学建模与优化

作者通过数学方法将问题转化为闭式表达式,主要步骤如下:
1. 定义符号函数
- ( s0(n) = n )
- ( s
1(n) = \text{Fizz} )
- ( s2(n) = \text{Buzz} )
- ( s
3(n) = \text{FizzBuzz} )

  1. 构建选择函数
    通过二进制编码思想,将条件判断转化为数学表达式:
    [ f(n) = 2 \cdot I5(n) + I3(n) ] 其中,( I_m(n) )是指示函数,当( m )整除( n )时为1,否则为0。

  2. 三角函数的应用
    利用欧拉公式和余弦函数,将指示函数表示为:
    [ I3(n) = \frac{1}{3} + \frac{2}{3} \cos\left(\frac{2\pi n}{3}\right) ] [ I5(n) = \frac{1}{5} + \frac{2}{5} \cos\left(\frac{2\pi n}{5}\right) + \frac{2}{5} \cos\left(\frac{4\pi n}{5}\right) ] 最终得到:
    [ f(n) = \frac{11}{15} + \frac{2}{3} \cos\left(\frac{2\pi n}{3}\right) + \frac{4}{5} \cos\left(\frac{2\pi n}{5}\right) + \frac{4}{5} \cos\left(\frac{4\pi n}{5}\right) ]

最终实现

基于上述数学推导,Python代码简化为:
python from math import cos, pi for n in range(1, 101): i = round(11/15 + (2/3)*cos(2*pi*n/3) + (4/5)*(cos(2*pi*n/5) + cos(4*pi*n/5))) print([n, 'Fizz', 'Buzz', 'FizzBuzz'][i])

总结

通过有限傅里叶级数,作者将简单的Fizz Buzz问题转化为复杂的三角函数表达式,展示了数学在编程中的巧妙应用。虽然这种方法在实际应用中并不高效,但它体现了数学建模的创造性和趣味性。

评论总结

这篇评论主要围绕一篇关于用数学方法解决FizzBuzz问题的文章展开讨论,观点可分为三类:

  1. 赞赏数学方法的创新性
  • "This is very nice." (ivan_ah)
  • "Very cool! There's definitely some similarity to Ramanujan Sums" (siegelzero)
  • "What a neat trick. I'm thinking you can abuse polynomials similarly" (isoprophlex)
  1. 对方法严谨性的质疑
  • 指出"closed-form expression"定义不明确:"without precisely defining what that means" (tantalor)
  • 认为方法存在计算限制:"will break down around 2^50 or so" (layer8)
  • 指出实现效率问题:"extremely inefficient...introduces floating point multiplications and cos()" (burnt-resistor)
  1. 提出替代解决方案
  • 建议傅里叶变换方法:"Fourier transform gives us a periodic signal" (nine_k)
  • 提到多项式解法:"a 99-degree polynomial would do just fine" (isoprophlex)
  • 分享类似尝试:"used the FFT to determine...regular 2D grid" (ok123456)

其他: - 有用户提到该话题的传播性:"saw on USENET...conversation about fizzbuzz" (jmclnx) - 有人分享相关链接展示更极端案例:"Where the madness leads" (throwaway81523)