Zbuduj program „BizzFuzz”

18

W tradycyjnym FizzBuzz użytkownik jest proszony o wydrukowanie liczb od 1 do 100, ale zamienia każdą wielokrotność 3 na „Fizz”, każdą wielokrotność 5 na „Buzz” i każdą wielokrotność zarówno 3, jak i 5 (tj. 15) na „ FizzBuzz ”.

Jednak jako ankieter zła wymyśliłem własną pokręconą wersję FizzBuzz, którą postanowiłem nazwać BizzFuzz i dać wam w wywiadzie kodowym.

Zasady gry są następujące:

  • Wydrukuj każdy numer od 1 do 100, chyba że numer spełnia jeden z poniższych warunków.

    • Jeśli liczba jest podzielna przez 4, wydrukuj „Fizz”.
    • Jeśli liczba jest podzielna przez 5, wydrukuj „Buzz”.

    • Jeśli liczba jest podzielna przez 4, ale liczba bezpośrednio po jest podzielna przez 5, wydrukuj „FizzBuzz” zamiast „Fizz” i regularnie drukuj następny numer.

    • Jeśli liczba jest podzielna przez 5, ale liczba bezpośrednio po jest podzielna przez 4, wydrukuj „BuzzFizz” zamiast „Buzz” i regularnie drukuj następny numer.

    • Jeśli liczba znajduje się bezpośrednio przed liczbą podzielną przez 4 i 5, wydrukuj „Bizz”.

    • Jeśli numer jest natychmiast po liczbowo zarówno podzielna przez 4 i 5 print „Fuzz”.

    • Jeśli liczba jest podzielna przez 4 i 5, wydrukuj „BizzFuzz”.

Wygrywa najkrótszy kod implementujący wszystkie te reguły w dowolnym języku.

Joe Z.
źródło

Odpowiedzi:

4

GolfScript ( 83 80 znaków)

(Uwaga: sugestia Howarda w komentarzach pozwala zmniejszyć do 78 znaków, ale z końcowymi spacjami w niektórych wierszach).

Używa tego znaku \0, więc tutaj jest w formacie 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}/.

i base64:

MTAwLHspLjIwJSdCaUZ1CgBGdQoAAABGaUJ1CgAAAABGaQoAAEJ1CgAARmkKAAAAQnVGaQoAAAAA
QmkKJzEsLz0yLyd6eicqXG4rb3J9Lwo=

Używając ^ jako stand-in \0, to

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

Nadal nie jest to szczególnie interesujący problem.


Poproszono o wyjaśnienie:

Dla wartości 0do 99włącznie:

100,{
...
}/

Zwiększyć wartość (chcemy 1się 100), a także dowiedzieć się, jaka jest wartość inkrementowany jest mod 20:

).20%

Podziel magiczny ciąg na \0postacie:

MAGIC_STRING 1,/

Take ( x mod 20) th element tej tablicy, podzielić go na kawałki 2-znakowych i skleić je razem z zz. Uwaga: ciąg jest albo pusty (w takim przypadku nie ma żadnych fragmentów, więc kończymy na pustym ciągu) lub jest sekwencją [BF][iu]prefiksów, po których następuje nowa linia.

=2/'zz'*

Weź drugą kopię zwiększonej liczby, którą trzymaliśmy na stosie, i dodaj nową linię. Teraz dowolny ciąg znaków zakończy się nową linią.

\n+

Zastosuj operację zastępczą. (Jest to podobne do ||w JavaScript lub COALESCESQL).

or
Peter Taylor
źródło
@minitech, literówka wprowadzona przez nie kopiowanie-wklejanie, ponieważ ponowne wciskanie wszystkiego jest bólem w szyi. Naprawiony.
Peter Taylor
2
reindenting all = CTRL + K
John Dvorak
Czy możesz to wyjaśnić?
Johannes Kuhn
„Niezbyt interesujący problem”. Tak, miałem przeczucie, że tak było, kiedy to opublikowałem. Mimo to jest to wariacja.
Joe Z.
Staje się również bardziej interesująca jako gra towarzyska z przyjaciółmi, niż wyzwanie programistyczne. Na zmianę staraj się wymawiać liczby w kolejności. Zasadniczo jest to FizzBuzz Hardcore Edition, jeśli wcześniej nie zapamiętasz sekwencji.
Joe Z.
15

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

Oryginalne rozwiązanie ( 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]
grc
źródło
4
Naprawdę piękne nadużycie 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)
Ry-
źródło
1
Możesz zagrać w golfa do 154 za pomocą a) zwarcia logicznego w wyrażeniu do wydrukowania, b) odwrócenia znaczenia robliczania go mniejszą liczbą znaków, c) umieszczenia wszystkiego w jednym wierszu: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
Przywróć Monikę
@WolframH: Dzięki! Zastosowałem je z pewnymi zmianami, aby zrobić 143.
Ry-
Ok, to mnie pobiło, imponująca robota. Uwielbiam print 1!=a+b!=4to diabelskie!
1
@LegoStormtroopr: Nah. exec/ evalKombi jest diaboliczny;)
RY-
Tak, będzie ciężko pokonać. Udało mi się jednak ścisnąć kilka dodatkowych postaci, zmieniając sekcję drukowania naprint{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

Niespełniona implementacja referencyjna w Pythonie, która implementuje dosłownie każdą regułę (420 znaków):

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
Joe Z.
źródło
3
Hej. Masz nawiasy w moim Pythonie.
Ry-
Myślę, że IDE, którego używałem, domyślnie je wstawiło. Byłem na komputerze z systemem Windows, a próby kodowania za pomocą edytora tekstu w systemie Windows są brutalne.
Joe Z.
1

Python, 150

To jest pochodna odpowiedzi minitech (wcześniejszej), ale wycisnąłem z niej wystarczająco dużo, aby stworzyć własną:

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)

Wersja z degolfem nie jest o wiele bardziej czytelna, ale ten, rktórego używał minitech, jest uruchamiany tylko wtedy, gdy przy następnej iteracji suma jest równa lub a,balbo , co jest równoważne, więc pojawi się tylko w tych okolicznościach. Możliwe było więc usunięcie przypisania i obliczenia oraz wyprowadzenie go z bieżącej wartości użycia i :1,00,4i%4 or i%5 == 0riab

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)

Zawiera także sugestie @ WolframH.


źródło
Eee, to naprawdę nie jest inaczej. W każdym razie zabierz przestrzenie wokół [1,4](i użyj (1,4)lub {1,4}oprócz) i wcześniej {.
Ry-
Nie inaczej nie, po prostu zmieniłem się na tyle, że myślałem, że warto było wejść.
Okej, ale powinieneś zagrać w golfa w celu uzyskania białych znaków.
Ry-
@minitech nie martw się. Pozdrawiam wskazówkę dotyczącą []odstępów. Zastanawiałem się, dlaczego użyłeś {}swojej oryginalnej odpowiedzi.
1

R: 170 znaków

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])
plannapus
źródło
1

JavaScript 127 bajtów

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)

Wyjaśnienie

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);
Sebastián Mestre
źródło
0

Tcl, 185 znaków

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}]}
Johannes Kuhn
źródło
Czasami whilepętle można zastąpić timekonstruktami zapisującymi bajty
sergiol