Bangun program "BizzFuzz"


17

Dalam FizzBuzz tradisional, Anda diminta untuk mencetak angka dari 1 hingga 100, tetapi mengganti setiap kelipatan 3 dengan "Fizz", setiap kelipatan 5 dengan "Buzz", dan setiap kelipatan dari 3 dan 5 (yaitu 15) dengan " FizzBuzz ".

Namun, sebagai pewawancara yang jahat, saya telah menemukan versi FizzBuzz saya yang bengkok, yang telah saya putuskan untuk memberi nama BizzFuzz dan berikan kepada Anda dalam wawancara kode.

Aturan mainnya adalah:

  • Cetak setiap angka dari 1 hingga 100, kecuali jika jumlahnya memenuhi salah satu kondisi di bawah ini.

    • Jika angkanya dapat dibagi 4, cetak "Fizz".
    • Jika nomornya dapat dibagi 5, cetak "Buzz".

    • Jika angkanya dapat dibagi 4, tetapi angkanya segera setelah dibagi menjadi 5, cetak "FizzBuzz" bukan "Fizz", dan cetak nomor berikutnya secara teratur.

    • Jika angkanya dapat dibagi 5, tetapi angkanya segera setelah dibagi 4, cetak "BuzzFizz", bukan "Buzz", dan cetak nomor berikutnya secara teratur.

    • Jika nomornya segera sebelum nomor dapat dibagi oleh 4 dan 5, cetak "Bizz".

    • Jika nomor segera setelah angka habis dibagi 4 dan 5, cetak "Fuzz".

    • Jika angkanya dapat dibagi dengan 4 dan 5, cetak "BizzFuzz".

Kode terpendek untuk menerapkan semua aturan ini dalam bahasa apa pun menang.

Jawaban:


4

GolfScript ( 83 80 karakter)

(Saran NB Howard dalam komentar memungkinkan untuk mengurangi hingga 78 karakter, tetapi dengan spasi tambahan pada beberapa baris).

Ini menggunakan karakter \0, jadi ini dia dalam format 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}/.

dan base64:

MTAwLHspLjIwJSdCaUZ1CgBGdQoAAABGaUJ1CgAAAABGaQoAAEJ1CgAARmkKAAAAQnVGaQoAAAAA
QmkKJzEsLz0yLyd6eicqXG4rb3J9Lwo=

Menggunakan ^ sebagai pengganti \0, itu

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

Masih bukan masalah yang sangat menarik.


Sebuah penjelasan diminta:

Untuk nilai-nilai 0ke 99inklusif:

100,{
...
}/

Kenaikan nilai (kami ingin 1untuk 100) dan juga mencari tahu apa nilai bertambah adalah mod 20:

).20%

Pisahkan string ajaib di sekitar \0karakter:

MAGIC_STRING 1,/

Ambil elemen ( x mod 20) th dari array itu, pisahkan menjadi 2 karakter, dan rekatkan kembali zz. Catatan: string kosong (dalam hal ini tidak ada potongan, jadi kita berakhir dengan string kosong) atau merupakan urutan [BF][iu]awalan diikuti oleh baris baru.

=2/'zz'*

Ambil salinan lain dari nomor yang ditambahkan yang kita simpan di tumpukan, dan tambahkan baris baru. Sekarang string apa pun yang kita simpan akan diakhiri dengan baris baru.

\n+

Terapkan operasi mundur. (Ini mirip dengan ||JavaScript atau COALESCEdalam SQL).

or

@minitech, kesalahan ketik yang diperkenalkan dengan tidak menyalin karena menempelkan kembali semuanya adalah rasa sakit di leher. Tetap.
Peter Taylor

2
reindenting everything = CTRL + K
John Dvorak

Bisakah Anda menjelaskan ini?
Johannes Kuhn

"Bukan masalah yang sangat menarik." Ya, saya punya firasat seperti itu ketika saya mempostingnya. Namun, ini adalah variasi.
Joe Z.

Ini juga menjadi lebih menarik sebagai permainan ruang tamu dengan teman-teman, daripada tantangan pemrograman. Bergantian mencoba mengucapkan angka secara berurutan. Ini pada dasarnya FizzBuzz Hardcore Edition jika Anda tidak menghafal urutan sebelumnya.
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

Solusi asli ( 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
Penyalahgunaan eval yang benar-benar indah

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
Anda dapat memasukkan ini ke 154 dengan menggunakan a) hubung singkat logika pada ekspresi untuk dicetak, b) membalikkan makna runtuk menghitungnya dalam karakter yang lebih sedikit, c) meletakkan semuanya pada satu baris: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: Terima kasih! Saya menerapkannya dengan beberapa perubahan untuk menghasilkan 143.
Ry-

Ok ini membuat saya mengalahkan, pekerjaan yang mengesankan. Saya suka print 1!=a+b!=4itu jahat!

1
@LegoStormtroopr: Tidak. The exec/ evalcombo setan;)
Ry-

Ya, itu akan sulit dikalahkan. Saya dapat memeras dan menambah beberapa bentuk milik Anda dengan mengubah bagian cetak menjadiprint{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

Implementasi referensi yang tidak disatukan dalam Python yang mengimplementasikan setiap aturan secara harfiah (420 karakter):

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
Hei. Anda punya tanda kurung di Python saya.
Ry-

Saya pikir IDE yang saya gunakan memasukkan mereka secara default. Saya menggunakan mesin Windows, dan mencoba kode menggunakan editor teks pada Windows adalah brutal.
Joe Z.

1

Python, 150

Ini adalah turunan dari jawaban minitech (sebelumnya), tapi saya sudah cukup memerasnya untuk membuatnya sendiri:

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)

Versi degolfed tidak jauh lebih mudah dibaca, tetapi ryang menggunakan minitech hanya dipicu jika pada iterasi berikutnya jumlah jika a,bsalah 1,0atau 0,4, yang setara dengan i%4 or i%5 == 0sehingga hanya akan muncul dalam keadaan tersebut. Jadi itu mungkin untuk menghapus penugasan dan perhitungan rdan menurunkannya dari nilai saat ini imenggunakan adan 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)

Ini juga termasuk saran @ WolframH.


Eh, itu tidak terlalu berbeda. Bagaimanapun, ambil ruang di sekitar [1,4](dan gunakan (1,4)atau di {1,4}samping) dan sebelumnya {.
Ry-

Tidak berbeda tidak, hanya cukup berubah yang saya pikir layak masuk.

Oke, tetapi Anda harus golf itu untuk spasi.
Ry-

@minitech jangan khawatir. Sorakan untuk tip pada []spasi. Saya bertanya-tanya mengapa Anda menggunakan {}jawaban asli Anda.

1

R: 170 karakter

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 karakter

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

Kadang whileloop dapat diganti dengan timekonstruk untuk menghemat byte
sergiol
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.