【问题标题】:Can FizzBuzz be done using arithmetic only?FizzBu​​zz 可以仅使用算术来完成吗?
【发布时间】:2016-10-27 15:13:39
【问题描述】:

我正在尝试找到一种方法来解决 FizzBu​​zz 问题(打印 1 到 100 之间的所有数字,如果它是 3 的倍数,则打印 Fizz,如果它是 5 的倍数,则打印 Buzz,如果两者都是,则打印 FizzBu​​zz)使用算术仅限。

如果你使用传统的 3 和 5 来做这件事相当容易,因为如果它是 3 的倍数,你可以使用这个方法返回 0:

(i*i)%3

这可以实现打印“FizzBu​​zz”的第一部分

print("FizzBuzz"[((i*i)%3)*4:4] or i)
#It's multiplied by 4 so that if it isn't a mutliple of 3 it tries to print
#"FizzBuzz"[4:4] which is blank, so it print i instead.

5的倍数也可以做类似的方法

(i^4)%5

为了使它成为一个函数式 FizzBu​​zz,我们需要通过以下方式将 0 转换为 8 和 1 转换为 4:

8 - ((-i^4)%5)

这现在是 python 中的一个函数式 FizzBu​​zz:

for i in range(1,101):
    print("FizzBuzz"[((i*i)%3)*4:8 - ((-i**4)%5)] or i)

我发现有一种方法可以得到 0 或 1,具体取决于数字是否是所需数字的倍数,如下所示:

result = (number ^ (desired_number - 1)) % desired_number

但是这个规则只适用于素数,如果你用任何其他数字尝试这个,整个想法就会崩溃。 是否可以为非素数制作类似的功能,还是仅适用于素数?

【问题讨论】:

  • 只需将if i % 3 == 0 替换为while i % 3 == 0?或者这很容易?
  • 你可以设置一个字典d = {(True, True): "Fizzbuzz", ...},然后做print(d[x%3,x%5])。那不是更容易吗?
  • 哇,bias_k 的好答案
  • 另外,你不是在你的问题本身中回答你自己的问题(如果没有的话可以做到)吗?还是真正的问题是“这可以以更短(且可读性更低)的方式完成吗?”
  • 虽然我没有解释为什么我觉得 int(i%(non_prime)>0) 有点作弊。

标签: python math primes fizzbuzz


【解决方案1】:

这确实是费马小定理。

其中有一个使用 Euler Totient 函数 phi 的概括

a^phi(m) ==1 mod m

如果 a 和 m 互质。

作为phi(15)=phi(3)*phi(5)=(3-1)*(5-1)=8a^8 mod 15a=0,1,2,...,14 的余数是

0,1,1,6,1,10,6,1,1,6,10,1,6,1,1.

【讨论】:

  • 那么是否有任何函数: f(6) for a=1,2,3,..15 是 1,1,1,1,1,0,1,1,1, 1,1,0,1,1,1
  • 这并不能真正回答问题,是吗?您只是在评论这一点,以及为什么 OP 想到的一种方式行不通。
  • 这是对问题数学部分的回答/评论。
【解决方案2】:

作为替代方案,这是一种非常不同的方法。我不会写 Python,所以这是伪代码,没有明确的 if 语句:

method FizzBuzz

  array Fizz3 = ["", "", "Fizz"];          // 3 elements.
  array Buzz5 = ["", "", "", "", "Buzz"];  // 5 elements.

  for i = 0 to 99
    print((i+1) + ": " + Fizz3[i % 3] + Buzz5[i % 5]);
  end for

end method FizzBuzz

我假设基于零的数组。

【讨论】:

  • 没关系;我想起来很开心。 :)
  • 这也会打印每个数字,它不会只打印 Fizz 或 Buzz,它会打印 3:Fizz, 5:Buzz, 15:FizzBu​​zz,这是不应该的。
  • 我刚刚测试了这个,你实际上把它复杂化了。只要将 fizz 或 buzz 作为数组的第一个元素,您甚至不需要旋转数组。 (因为您引用 i%3 或 i%5 作为数组中的位置)如果您希望数组旋转,则每次都需要引用数组中的最后一个位置。
  • 我也意识到了同样的事情。请参阅我的编辑。英雄所见略同。傻瓜很少有不同。任你选。 :)
猜你喜欢
  • 2016-10-15
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2012-02-21
  • 2018-07-18
  • 2012-11-04
  • 1970-01-01
  • 2016-12-12
相关资源
最近更新 更多