สร้างโปรแกรม“ BizzFuzz”


17

ใน FizzBuzz แบบดั้งเดิมคุณจะถูกขอให้พิมพ์ตัวเลขจาก 1 ถึง 100 แต่แทนที่ทุก ๆ 3 ด้วย "Fizz" ทุก ๆ 5 จาก "Buzz" และทุก ๆ ทั้ง 3 และ 5 (เช่น 15) ด้วย " FizzBuzz"

อย่างไรก็ตามในฐานะผู้สัมภาษณ์ที่ชั่วร้ายฉันได้คิดค้น FizzBuzz เวอร์ชันบิดเบี้ยวของฉันเองซึ่งฉันได้ตัดสินใจตั้งชื่อ BizzFuzz และมอบให้คุณในการสัมภาษณ์ที่เข้ารหัส

กฎของเกมคือ:

  • พิมพ์แต่ละหมายเลขตั้งแต่ 1 ถึง 100 ยกเว้นว่าตรงตามเงื่อนไขข้อใดข้อหนึ่งด้านล่าง

    • หากจำนวนหารด้วย 4 ให้พิมพ์ "Fizz"
    • หากจำนวนหารด้วย 5 ให้พิมพ์ "Buzz"

    • หากจำนวนหารด้วย 4 แต่จำนวนทันทีหลังจากหารด้วย 5 ให้พิมพ์ "FizzBuzz" แทน "Fizz" และพิมพ์หมายเลขถัดไปเป็นประจำ

    • หากจำนวนหารด้วย 5 แต่จำนวนทันทีหลังจากหารด้วย 4 ให้พิมพ์ "BuzzFizz" แทน "Buzz" และพิมพ์หมายเลขถัดไปเป็นประจำ

    • หากตัวเลขนั้นอยู่ก่อนจำนวนหารด้วย 4 และ 5 ให้พิมพ์ "Bizz"

    • หากตัวเลขอยู่หลังจำนวนที่หารด้วย 4 และ 5 ให้พิมพ์ "Fuzz"

    • หากจำนวนหารด้วย 4 และ 5 ให้พิมพ์ "BizzFuzz"

รหัสที่สั้นที่สุดในการใช้กฎเหล่านี้ในภาษาใดก็ได้ที่ชนะ

คำตอบ:


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
 ^ Fu
 ^ ^ ^ FiBu
 ^ ^ ^ ^ Fi
 ^ ^ Bu
 ^ ^ Fi
 ^ ^ ^ BuFi
 ^ ^ ^ ^ Bi Bi
'1 / = 2 /' ZZ '* \ n + หรือ} /

ยังไม่เป็นปัญหาที่น่าสนใจโดยเฉพาะ


ขอคำอธิบาย:

สำหรับค่าที่0จะ99รวม:

100,{
...
}/

เพิ่มค่า (เราต้องการ1ที่จะ100) และยังพบว่าสิ่งที่มูลค่าเพิ่มขึ้นเป็นmod 20:

).20%

แยกสตริงมายากลรอบ\0ตัวละคร:

MAGIC_STRING 1,/

ใช้ ( x mod 20) THองค์ประกอบของอาร์เรย์ที่แยกเป็นชิ้น 2 zzตัวอักษรและกาวพวกเขากลับมารวมกันด้วย หมายเหตุ: สตริงว่างเปล่า (ในกรณีที่ไม่มีชิ้นส่วนดังนั้นเราจึงลงท้ายด้วยสตริงว่าง) หรือเป็นลำดับของส่วน[BF][iu]นำหน้าตามด้วย newline

=2/'zz'*

ใช้สำเนาอื่นของจำนวนที่เพิ่มขึ้นซึ่งเราเก็บไว้ในสแต็กและผนวกบรรทัดใหม่ ตอนนี้สิ่งที่สตริงเราจะจบลงด้วยการขึ้นบรรทัดใหม่

\n+

ใช้การดำเนินการทางเลือก (คล้ายกับ||ใน JavaScript หรือCOALESCEใน SQL)

or

@minitech ผิดพลาดที่แนะนำโดยไม่คัดลอกวางเพราะ reindenting ทุกอย่างเป็นอาการปวดคอ แก้ไขแล้ว.
Peter Taylor

2
การรวมใหม่ทุกอย่าง = CTRL + K
John Dvorak

คุณอธิบายได้ไหม
Johannes Kuhn

"ไม่ใช่ปัญหาที่น่าสนใจมาก" ใช่ฉันมีลางสังหรณ์ที่เป็นกรณีเมื่อฉันโพสต์มัน ถึงกระนั้นก็เป็นรูปแบบ
Joe Z.

นอกจากนี้ยังได้รับความสนใจมากขึ้นในฐานะเกมห้องนั่งเล่นกับเพื่อน ๆ มากกว่าความท้าทายในการเขียนโปรแกรม ผลัดกันพยายามพูดตัวเลขตามลำดับ มันเป็นพื้นFizzBuzz Hardcore Edition ถ้าคุณไม่จำลำดับก่อนหน้า
Joe Z.

13

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]

3
การละเมิด eval ที่สวยงามอย่างแท้จริง

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 โดยใช้ก) การลัดวงจรแบบลอจิกเพื่อพิมพ์ 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
Reinstate Monica

@ Wolfram: ขอบคุณ! ฉันใช้ผู้ที่มีการเปลี่ยนแปลงบางอย่างที่จะทำให้ 143
Ry-

ตกลงฉันมีจังหวะงานที่น่าประทับใจ ฉันรักprint 1!=a+b!=4ที่โหดร้าย!

1
@LegoStormtroopr: ไม่ The 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 chars):

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)

เวอร์ชัน degolfed นั้นไม่สามารถอ่านได้มากขึ้น แต่rminitech ที่ใช้นั้นถูกเรียกใช้ในกรณีที่มีการวนซ้ำครั้งต่อไปเท่านั้นหากa,bเป็นอย่างใดอย่างหนึ่ง1,0หรือ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


เอ้อมันไม่แตกต่างกันจริงๆ Anyways จะไปช่องว่างรอบ[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])

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.