Bir “BizzFuzz” programı oluşturun


18

Geleneksel FizzBuzz'da, 1'den 100'e kadar olan sayıları yazdırmanız istenir, ancak 3'ün her katını "Fizz", 5'in her katını "Buzz" ve her 3 ve 5'in (katları) her birini " FizzBuzz".

Bununla birlikte, kötü bir görüşmeci olarak, BizzFuzz adını vermeye ve size bir kodlama röportajında ​​vermeye karar verdiğim FizzBuzz'ın kendi bükülmüş versiyonumu icat ettim.

Oyunun kuralları:

  • Sayının aşağıdaki koşullardan birini karşılaması dışında her sayıyı 1'den 100'e kadar yazdırın.

    • Sayı 4'e bölünebiliyorsa, "Fizz" yazdırın.
    • Sayı 5'e bölünebilirse, "Buzz" yazdırın.

    • Sayı 4 ile bölünebilir, ancak hemen ardından sayı 5 ile bölünebilirse, "Fizz" yerine "FizzBuzz" yazdırın ve sonraki sayıyı düzenli olarak yazdırın.

    • Sayı 5'e bölünebilir, ancak hemen ardından sayı 4'e bölünebilirse, "Buzz" yerine "BuzzFizz" yazdırın ve sonraki sayıyı düzenli olarak yazdırın.

    • Numara hemen ise önce 4 ve 5 hem bir sayı bölünebilir, "Bizz" yazdırmak.

    • Sayı hem 4 hem de 5'e bölünebilen bir sayının hemen arkasındaysa , "Fuzz" yazdırın.

    • Sayı hem 4 hem de 5'e bölünebiliyorsa, "BizzFuzz" yazdırın.

Tüm bu kuralları herhangi bir dilde uygulamak için en kısa kod kazanır.

Yanıtlar:


4

GolfScript ( 83 80 karakter)

(NB Howard'ın yorumlardaki önerisi 78 karaktere düşmesine izin veriyor, ancak bazı satırlarda arka boşluklar var).

Bu karakteri kullanır \0, bu yüzden burada xxd biçimindedir:

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}/.

ve base64:

MTAwLHspLjIwJSdCaUZ1CgBGdQoAAABGaUJ1CgAAAABGaQoAAEJ1CgAARmkKAAAAQnVGaQoAAAAA
QmkKJzEsLz0yLyd6eicqXG4rb3J9Lwo=

Kullanılması ^ için stand-a olarak \0, bu kadar

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

Yine de özellikle ilginç bir sorun değil.


Bir açıklama istendi:

Kapsayıcı değerler 0için 99:

100,{
...
}/

(İstediğimiz değeri artırmak 1için 100) ve aynı zamanda arttırılmış değer ne olduğunu bulmak mod 20:

).20%

Sihirli dizeyi \0karakterlerin etrafına böl :

MAGIC_STRING 1,/

(Al x mod 20) inci , o dizinin elemanının 2 karakterli parçalar halinde bölünmüş ve bir araya ile tutkal zz. Not: dize boştur (bu durumda yığın yoktur, bu nedenle boş dize ile biteriz) veya bir [BF][iu]önek dizisi ve ardından bir yeni satır gelir.

=2/'zz'*

Yığında tuttuğumuz artan sayının diğer kopyasını alın ve bir satırsonu ekleyin. Şimdi hangi dizgeyi tutsak bir satırsonu ile biter.

\n+

Bir geri dönüş işlemi uygulayın. (Bu ||JavaScript veya COALESCESQL ile benzerdir ).

or

@minitech, yazım hatası yapmamakla ortaya çıkan yazım hatası çünkü herşeyi hatırlatmak boyunda bir acıdır. Sabit.
— Peter Taylor

2
her şeyi hatırlatmak = CTRL + K
— John Dvorak

Bunu açıklayabilir misin?
— Johannes Kuhn

"Çok ilginç bir sorun değil." Evet, gönderdiğimde bir önsezim vardı. Yine de, bu bir varyasyon.
— Joe Z.

Ayrıca, bir programlama zorluğu yerine arkadaşlarla bir salon oyunu olarak daha ilginç hale gelir. Çalışırken sırayla demek sırayla numaralar. Diziyi önceden ezberlemiyorsanız, temel olarak FizzBuzz Hardcore Edition'dır.
— Joe Z.

16

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

Orijinal çözüm ( 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]

6

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
A) Yazdırmak için ifade üzerinde mantıksal kısa devre, b) rdaha az karakterle hesaplamanın anlamını tersine çevirerek, bunu 154'e kadar golf oynayabilirsiniz , c) her şeyi tek bir satıra koyarak: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
— Monica

@WolframH: Teşekkürler! 143 yapmak için bazı değişikliklerle bunları uyguladım.
— Ry-

Tamam bu beni dövdü, etkileyici bir çalışma. print 1!=a+b!=4Şeytani olduğunu seviyorum !

1
@LegoStormtroopr: Hayır. exec/ evalKombo şeytani olduğu;)
— Ry-

Evet, yenmek zor olacak. Baskı bölümünü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'da her kuralı tam anlamıyla uygulayan ungolfed referans uygulaması (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
Hey. Python'umda parantez var.
— Ry-

Ben kullandığım IDE varsayılan onları ekledi düşünüyorum. Bir Windows makinesindeydim ve Windows'ta bir metin editörü kullanarak kod yazmaya çalışmak acımasız.
— Joe Z.

1

Python, 150

Bu minitech (daha önce) cevabının bir türevidir, ancak kendim yapmak için yeterince sıktım:

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 versiyonu çok daha okunaklı değildir, ancak rminitech'in kullandığı, yalnızca bir sonraki yinelemede a,bya ya 1,0da 0,4eşdeğer olması durumunda toplamın tetiklenmesi durumunda tetiklenir i%4 or i%5 == 0. Bunun mümkün olduğuna Yani atama ve hesaplamasını kaldırmak rve geçerli değeri türetmeye ikullanarak ave 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)

Ayrıca @ WolframH'ın önerilerini de içerir.


Ee, gerçekten farklı değil. Her neyse, etrafındaki boşlukları alın [1,4](ve kullanın (1,4)ya da {1,4}yanı sıra) ve öncesi {.
— Ry-

Farklı değil hayır, sadece bir girişe değer olduğunu düşündüm yeterince değişti.

Tamam, ama boşluk için golf oynamalısın.
— Ry-

@ minitech endişelenmeyin. Boşluktaki uç için şerefe []. {}Orijinal cevabınızda neden kullandığınızı merak ediyordum .

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

1

Javascript 127 bayt

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)

açıklama

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

Bazen baytları kurtarmak için whiledöngüler timeyapılarla değiştirilebilir
— sergiol
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.