Xây dựng chương trình BizzFuzz trực tiếp


17

Trong FizzBuzz truyền thống, bạn được yêu cầu in các số từ 1 đến 100, nhưng thay thế mọi bội số của 3 bằng "Fizz", mỗi bội số 5 bằng "Buzz" và mọi bội số của cả 3 và 5 (tức là 15) bằng " FizzBuzz ".

Tuy nhiên, là một người phỏng vấn độc ác, tôi đã phát minh ra phiên bản FizzBuzz xoắn của riêng mình, tôi đã quyết định đặt tên BizzFuzz và đưa cho bạn trong một cuộc phỏng vấn mã hóa.

Luật chơi là:

  • In mỗi số từ 1 đến 100, trừ khi số đó đáp ứng một trong các điều kiện dưới đây.

    • Nếu số chia hết cho 4, hãy in "Fizz".
    • Nếu số chia hết cho 5, hãy in "Buzz".

    • Nếu số chia hết cho 4, nhưng số ngay sau số đó chia hết cho 5, hãy in "FizzBuzz" thay vì "Fizz" và in số tiếp theo thường xuyên.

    • Nếu số chia hết cho 5, nhưng số ngay sau số đó chia hết cho 4, hãy in "BuzzFizz" thay vì "Buzz" và in số tiếp theo thường xuyên.

    • Nếu số ngay trước một số chia hết cho cả 4 và 5, hãy in "Bizz".

    • Nếu số ngay sau một số chia hết cho cả 4 và 5, hãy in "Fuzz".

    • Nếu số này chia hết cho cả 4 và 5, hãy in "BizzFuzz".

Mã ngắn nhất để thực hiện tất cả các quy tắc này trong bất kỳ ngôn ngữ nào sẽ thắng.

Câu trả lời:


4

GolfScript ( 83 80 ký tự)

(Gợi ý của NB Howard trong các bình luận cho phép giảm xuống còn 78 ký tự, nhưng có dấu cách ở một số dòng).

Cái này sử dụng ký tự \0, vì vậy ở đây nó có định dạng 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}/.

và cơ sở64:

MTAwLHspLjIwJSdCaUZ1CgBGdQoAAABGaUJ1CgAAAABGaQoAAEJ1CgAARmkKAAAAQnVGaQoAAAAA
QmkKJzEsLz0yLyd6eicqXG4rb3J9Lwo=

Sử dụng ^ như là một thay thế cho \0, nó

100, {). 20% 'BiFu
 ^ Fu
 ^ ^ ^ FiBu
 ^ ^ ^ ^ Fi
 ^ ^ Bu
 ^ ^ Fi
 ^ ^ ^ BuFi
 ^ ^ ^ ^ Bi
'1, / = 2 /' zz '* \ n + hoặc} /

Vẫn không phải là một vấn đề đặc biệt thú vị.


Một lời giải thích đã được yêu cầu:

Đối với các giá trị 0để 99bao gồm:

100,{
...
}/

Tăng giá trị (chúng tôi muốn 1đến 100) và cũng có thể tìm hiểu những gì giá trị tăng lên là mod 20:

).20%

Chia chuỗi ma thuật xung quanh các \0nhân vật:

MAGIC_STRING 1,/

Lấy ( x mod 20) thứ nguyên tố của mảng đó, chia nó thành những phần 2 ký tự, và keo dán chúng lại với nhau với zz. Lưu ý: chuỗi là trống (trong trường hợp không có khối, vì vậy chúng tôi kết thúc bằng chuỗi trống) hoặc là một chuỗi các [BF][iu]tiền tố theo sau là một dòng mới.

=2/'zz'*

Lấy bản sao khác của số tăng mà chúng tôi giữ trên ngăn xếp và nối thêm một dòng mới. Bây giờ bất kỳ chuỗi nào chúng tôi giữ sẽ kết thúc với một dòng mới.

\n+

Áp dụng một hoạt động dự phòng. (Điều này tương tự như ||trong JavaScript hoặc COALESCEtrong SQL).

or

@minitech, lỗi đánh máy được giới thiệu bằng cách không dán sao chép vì nhắc lại mọi thứ là một nỗi đau ở cổ. Đã sửa.
Peter Taylor

2
giới thiệu lại mọi thứ = CTRL + K
John Dvorak

Bạn có thể giải thích điều này?
Julian Kuhn

"Không phải là một vấn đề rất thú vị." Vâng, tôi đã có một linh cảm đó là trường hợp khi tôi đăng nó. Tuy nhiên, nó là một biến thể.
Joe Z.

Nó cũng trở nên thú vị hơn khi là một trò chơi với bạn bè, hơn là một thử thách lập trình. Thay phiên nhau cố gắng nói các số theo thứ tự. Về cơ bản, đó là FizzBuzz Hardcore Edition nếu bạn không ghi nhớ trình tự trước.
Joe Z.

13

Con trăn, 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

Giải pháp gốc ( 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
Một lạm dụng thực sự đẹp của eval

3

Con trăn 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
Bạn có thể đánh golf xuống còn 154 bằng cách sử dụng a) ngắn mạch logic trên biểu thức để in, b) đảo ngược ý nghĩa của rviệc tính toán nó trong ít ký tự hơn, c) đặt mọi thứ trên một dòng: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
Phục hồi lại

@WolframH: Cảm ơn! Tôi đã áp dụng những thay đổi với một số thay đổi để thực hiện 143.
Ry-

Ok này có tôi đánh bại, công việc ấn tượng. Tôi yêu print 1!=a+b!=4đó là ma quỷ!

1
@LegoStormtroopr: Không. Các exec/ evalcombo là ma quỷ;)
Ry-

Vâng, đó sẽ là khó để đánh bại. Tôi đã có thể ép và thêm một vài mẫu của bạn mặc dù bằng cách thay đổi phần in thànhprint{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

Một triển khai tham chiếu vô căn cứ trong Python thực hiện mọi quy tắc theo nghĩa đen (420 ký tự):

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
Chào. Bạn có dấu ngoặc đơn trong Python của tôi.
Ry-

Tôi nghĩ rằng IDE tôi đã sử dụng chèn chúng theo mặc định. Tôi đã ở trên một máy Windows và cố gắng viết mã bằng trình soạn thảo văn bản trên Windows là rất tàn bạo.
Joe Z.

1

Con trăn, 150

Đây là dẫn xuất của câu trả lời minitech (trước đó), nhưng tôi đã vắt đủ từ nó để làm cho riêng mình:

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)

Phiên bản khử lỗi không dễ đọc hơn nhiều, nhưng r minitech đang sử dụng chỉ được kích hoạt nếu ở lần lặp tiếp theo, tổng nếu a,b1,0hoặc 0,4, tương đương với i%4 or i%5 == 0nó sẽ chỉ xuất hiện trong những trường hợp đó. Vì vậy, có thể loại bỏ việc gán và tính toán rvà lấy nó từ giá trị hiện tại của iviệc sử dụng ab:

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)

Nó cũng bao gồm các đề xuất của @ WolframH.


Er, nó không thực sự khác biệt. Dù sao, lấy đi các không gian xung quanh [1,4](và sử dụng (1,4)hoặc {1,4}bên cạnh) và trước đó {.
Ry-

Không khác không, chỉ thay đổi đủ để tôi nghĩ rằng nó là giá trị một mục.

Được rồi, nhưng bạn nên chơi golf cho khoảng trắng.
Ry-

@minitech không phải lo lắng. Chúc mừng cho các mẹo trên []khoảng cách. Tôi đã tự hỏi tại sao bạn sử dụng {}trong câu trả lời ban đầu của bạn.

1

R: 170 ký tự

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 ký tự

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}]}

Đôi khi whilecác vòng lặp có thể được thay thế bằng các timecấu trúc để lưu byte
sergiol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.