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.