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.

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

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

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)

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

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.


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

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

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

Czasami whilepętle można zastąpić timekonstruktami zapisującymi bajty
— sergiol
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.