建立一个“ BizzFuzz”程序


18

在传统的FizzBu​​zz中,系统会要求您打印1到100之间的数字,但用“ Fizz”替换3的每一个倍数,用“ Buzz”替换5的每一个倍数,而将3和5(即15)的每一个倍数都用“ FizzBu​​zz”。

但是,作为一个邪恶的面试官,我发明了自己的FizzBu​​zz版本,我决定将其命名为BizzFuzz,并通过编码面试提供给您。

游戏规则是:

  • 打印从1到100的每个数字,除非该数字满足以下条件之一。

    • 如果数字可被4整除,则打印“ Fizz”。
    • 如果数字可被5整除,则打印“嗡嗡声”。

    • 如果数字可被4整除,但紧随其后的数字可被5整除,请打印“ FizzBu​​zz”而不是“ Fizz”,并定期打印下一个数字。

    • 如果数字可被5整除,但紧随其后的数字可被4整除,则打印“ BuzzFizz”而不是“ Buzz”,并定期打印下一个数字。

    • 如果该数量是立即通过两个4和5的数整除,打印“BIZZ”。

    • 如果该数字紧接 4和5可除的数字之后,则打印“ Fuzz”。

    • 如果数字可以同时用4和5整除,则打印“ BizzFuzz”。

以任何语言实现所有这些规则的最短代码胜出。

Answers:


4

GolfScript(83 80个字符)

(NB Howard在评论中的建议允许减少到78个字符,但在某些行上带有尾随空格)。

它使用字符\0,所以这里是xxd格式:

0000000: 3130 302c 7b29 2e32 3025 2742 6946 750a  100,{).20%'BiFu.
0000010: 0046 750a 0000 0046 6942 750a 0000 0000  .Fu....FiBu.....
0000020: 4669 0a00 0042 750a 0000 4669 0a00 0000  Fi...Bu...Fi....
0000030: 4275 4669 0a00 0000 0042 690a 2731 2c2f  BuFi.....Bi.'1,/
0000040: 3d32 2f27 7a7a 272a 5c6e 2b6f 727d 2f0a  =2/'zz'*\n+or}/.

和base64:

MTAwLHspLjIwJSdCaUZ1CgBGdQoAAABGaUJ1CgAAAABGaQoAAEJ1CgAARmkKAAAAQnVGaQoAAAAA
QmkKJzEsLz0yLyd6eicqXG4rb3J9Lwo=

使用^作为替代\0,它是

100,20 {)。%'BiFu
 ^^ ^ ^ FiBu
 ^ ^ ^ ^连接
 ^ ^^ ^连接
 ^ ^ ^ BuFi
 ^ ^ ^ ^毕
'1,/ = 2 /'zz'* \ n + or} /

仍然不是一个特别有趣的问题。


要求作出解释:

对于值0,以99包容:

100,{
...
}/

增加值(我们要1100),并找出递增值是什么mod 20

).20%

在字符周围分割魔术字符串\0

MAGIC_STRING 1,/

取该数组的x mod 20元素,将其拆分为2个字符的块,然后将其与重新粘在一起zz。注意:字符串为空(在这种情况下没有块,因此我们以空字符串结尾),或者是[BF][iu]前缀序列,后跟换行符。

=2/'zz'*

取另一个保留在堆栈中的递增编号的副本,并添加换行符。现在,无论我们保留哪个字符串,都将以换行符结尾。

\n+

应用后备操作。(这类似于||JavaScript或COALESCESQL)。

or

@minitech,由于没有复制粘贴而引入错别字,因为重新缩进所有内容会让人头疼。固定。
彼得·泰勒

2
重新缩进一切= CTRL + K
John Dvorak

你能解释一下吗?
Johannes Kuhn

“这不是一个非常有趣的问题。” 是的,我有预感,这是我发布时的预感。不过,这是一个变化。
Joe Z.

作为与朋友的客厅游戏,它也变得更加有趣,而不是编程挑战。轮流尝试按顺序说出数字。如果您不事先记住序列,则基本上是FizzBu​​zz Hardcore Edition。
Joe Z.

15

Python,114

a='Fizz'
b='Buzz'
c='Bizz'
d='Fuzz'
e=c+d
f=a+b
g=b+a
i=1
exec"print eval('ediifiiiaibiaiigiiic'[i%20]);i+=1;"*100

原始解决方案(131):

f='Fizz'
for i in range(1,101):x=i%20;print('Bizz'*(x%19<1)+'Fuzz'*(x<2)or(i%4<1)*f+'Buzz'*(i%5<1or x==4)+f*(x==15)or i,i)[x%11==5]

4
评估的真正美丽滥用

3

Python 2 131

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):print{5:Z,19:I,i%4:B,i%5*4:F,3:B+F,16:F+B,0:I+Z,1:i,4:i}.get(i%4+i%5*4,i)

1
您可以通过以下方式将其降低到154:a)在表达式上进行逻辑短路以打印,b)反转r用更少的字符进行计算的含义,c)将所有内容放在一行上:r,F,B,Z,I=1,'Fizz','Buzz','Fuzz','Bizz'\nfor i in range(1,101):a,b=i%4,i%5*4;print~-r and i or{5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i);r=3!=a+b!=16
恢复莫妮卡

@WolframH:谢谢!我将这些更改应用到了
143。– Ry-

好的,这使我拍得很棒 我爱print 1!=a+b!=4那是恶魔般的!

1
@LegoStormtroopr:不。的exec/ eval组合是恶魔;)
Ry-

是的,这很难被击败。通过将打印部分更改为print{5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z,1:i,4:i}.get(a+b,i)

1

Python中没有引用的引用实现,它按字面意义(420个字符)实现每个规则:

n = 1
while(n <= 100):
    if(n % 20 == 0):
        print "BizzFuzz"
    elif((n - 1) % 20 == 0):
        print "Fuzz"
    elif((n + 1) % 20 == 0):
        print "Bizz"
    elif(n % 5 == 0 and (n + 1) % 4 == 0):
        print "BuzzFizz"
        print n + 1
        n += 1
    elif(n % 4 == 0 and (n + 1) % 5 == 0):
        print "FizzBuzz"
        print n + 1
        n += 1
    elif(n % 4 == 0):
        print "Fizz"
    elif(n % 5 == 0):
        print "Buzz"
    else:
        print n
    n += 1

3
嘿。在我的Python中有括号。
Ry-

我认为我使用的IDE默认情况下会插入它们。我当时在Windows计算机上,尝试在Windows上使用文本编辑器进行编码是残酷的。
Joe Z.

1

Python,150

这是minitechs(较早的)答案的派生词,但我已经挤出了足够多的内容来制作自己的答案:

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):a,b=i%4,i%5*4;print i if a+b in [1,4] else {5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i)

去golfed版本的可读性不高,但是r只有在下一次迭代中总和if a,b1,0or 时才触发minitech所使用的版本0,4,这等于或i%4 or i%5 == 0因此仅在这种情况下出现。这样就可以删除和的赋值和计算,r并从i使用a和的当前值中推导出来b

F,B,Z,I='Fizz','Buzz','Fuzz','Bizz'
for i in range(1,101):
 a,b=i%4,i%5*4;
 print i if a+b in [1,4] else {5:Z,19:I,a:B,b:F,3:B+F,16:F+B,0:I+Z}.get(a+b,i)

它还包括@WolframH的建议。


嗯,没什么不同。无论如何,请删除周围[1,4](以及使用(1,4){1,4}旁边)和之前的空间{
Ry-

没什么不同,只是做了足够的修改,我认为值得一读。

好的,但是您应该打高尔夫以获取空白。
Ry-

@minitech不用担心。为[]间距上的提示加油。我想知道为什么您要使用{}原始答案。

1

R:170个字符

a=b=1:100
o=!a%%4
i=!a%%5
w=o&i
a[o]="Fizz"
a[i]="Buzz"
a[c(i,F)&c(F,o)]="FizzBuzz"
a[c(F,i)&c(o,F)]="BuzzFizz"
a[w[-1]]="Bizz"
a[c(F,w)]="Fuzz"
a[w]="BizzFuzz"
cat(a[b])

1

Javascript 127个字节

f='Fizz';b='Buzz';F='Fuzz';B='Bizz';z=n=>(n?z(n-1):0,console.log([f,b,B,F,B+F,f+b,b+f,n]["43775777071707767772"[n%20]]));z(100)

说明

f = 'Fizz';
b = 'Buzz';
F = 'Fuzz';
B = 'Bizz';

z = n => (
    n?z(n-1):0,  // If n is greater than 0, we keep going downwards, this happens before printing.
    console.log(
        // These are the values that we a want to print, it is
        // very important that it is written inline inside the
        // function, otherwise, we couldn't have 'n' in it
        [f,b,B,F,B+F,f+b,b+f,n][
          // The game cycles every 20 steps, so we can build a
          // look up table that we'll use to index into the other
          // table. We take advantage of implicit string -> Number
          // conversion inside the index operator, and use a
          // string instead of an array, saving 1 byte per entry
          "43775777071707767772"[n%20]])
);

z(100);

0

Tcl,185个字符

while {[incr i]<101} {puts [expr {$i%4?$i%5?($i-1)%4|($i-1)%5?($i+1)%4|($i+1)%5?$i:"Fuzz":"Bizz":($i-1)%4?($i+1)%4?"Buzz":"BuzzFizz":$i:($i-1)%5?($i+1)%5?$i%5?"Fizz":"FizzBuzz":$i:$i}]}

有时while可以用time结构替换循环以节省字节
sergiol
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.