Erstellen Sie ein "BizzFuzz" -Programm

17

In herkömmlichen FizzBuzz werden Sie aufgefordert, die Zahlen von 1 bis 100 zu drucken, wobei Sie jedoch jedes Vielfache von 3 durch "Fizz", jedes Vielfache von 5 durch "Buzz" und jedes Vielfache von 3 und 5 (dh 15) durch "ersetzen. FizzBuzz ".

Als böser Interviewer habe ich jedoch meine eigene verdrehte Version von FizzBuzz erfunden, die ich BizzFuzz nennen und Ihnen in einem Coding-Interview geben möchte.

Die Spielregeln sind:

  • Drucken Sie jede Zahl von 1 bis 100, es sei denn, die Zahl erfüllt eine der folgenden Bedingungen.

    • Wenn die Zahl durch 4 teilbar ist, drucken Sie "Fizz".
    • Wenn die Zahl durch 5 teilbar ist, drucken Sie "Buzz".

    • Wenn die Zahl durch 4 teilbar ist, die Zahl jedoch unmittelbar danach durch 5 teilbar ist, drucken Sie "FizzBuzz" anstelle von "Fizz" und drucken Sie die nächste Zahl regelmäßig aus.

    • Wenn die Zahl durch 5 teilbar ist, die Zahl jedoch unmittelbar danach durch 4 teilbar ist, drucken Sie "BuzzFizz" anstelle von "Buzz" und drucken Sie die nächste Zahl regelmäßig aus.

    • Wenn die Zahl unmittelbar vor einer durch 4 und 5 teilbaren Zahl steht , drucken Sie "Bizz".

    • Wenn die Zahl unmittelbar nach einer durch 4 und 5 teilbaren Zahl steht , drucken Sie "Fuzz".

    • Wenn die Zahl sowohl durch 4 als auch durch 5 teilbar ist, drucken Sie "BizzFuzz".

Der kürzeste Code, um alle diese Regeln in einer Sprache zu implementieren, gewinnt.

Joe Z.
quelle

Antworten:

4

GolfScript ( 83 80 Zeichen)

(NB Howards Vorschlag in den Kommentaren erlaubt es, auf 78 Zeichen zu reduzieren, jedoch mit Leerzeichen in einigen Zeilen).

Dies verwendet das Zeichen \0, also ist es hier im xxd-Format:

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

und base64:

MTAwLHspLjIwJSdCaUZ1CgBGdQoAAABGaUJ1CgAAAABGaQoAAEJ1CgAARmkKAAAAQnVGaQoAAAAA
QmkKJzEsLz0yLyd6eicqXG4rb3J9Lwo=

Mit ^ als Stand-in für \0, es ist

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

Immer noch kein besonders interessantes Problem.


Eine Erklärung wurde angefordert:

Für Werte 0bis 99einschließlich:

100,{
...
}/

Erhöhen Sie den Wert (wir wollen 1auf 100) und auch herausfinden, was der erhöhte Wert ist mod 20:

).20%

Teilen Sie die magische Kette um \0Zeichen:

MAGIC_STRING 1,/

Nehmen Sie das ( x mod 20) -te Element dieses Arrays, teilen Sie es in 2-stellige Stücke auf und kleben Sie sie wieder zusammen mit zz. Hinweis: Die Zeichenfolge ist entweder leer (in diesem Fall gibt es keine Abschnitte, sodass wir die leere Zeichenfolge erhalten) oder besteht aus einer Folge von [BF][iu]Präfixen, gefolgt von einer neuen Zeile.

=2/'zz'*

Nehmen Sie die andere Kopie der erhöhten Zahl, die wir auf dem Stapel behalten haben, und fügen Sie eine neue Zeile hinzu. Welche Zeichenfolge wir auch behalten, sie endet mit einem Zeilenumbruch.

\n+

Wenden Sie eine Fallback-Operation an. (Dies ist ähnlich wie ||in JavaScript oder COALESCEin SQL).

or
Peter Taylor
quelle
@minitech, Tippfehler, der durch das Nicht-Einfügen von Texten verursacht wird, da das erneute Einfügen von Texten Schmerzen im Nacken verursacht. Fest.
Peter Taylor
2
Alles neu einrücken = STRG + K
John Dvorak
Kannst du das erklären?
Johannes Kuhn
"Kein sehr interessantes Problem." Ja, ich hatte eine Ahnung, wie es der Fall war, als ich es gepostet habe. Trotzdem ist es eine Variation.
Joe Z.
Es wird auch interessanter als ein Gesellschaftsspiel mit Freunden, als eine Programmierherausforderung. Abwechselnd versucht zu sagen , die Zahlen in Ordnung. Es ist im Grunde genommen FizzBuzz Hardcore Edition, wenn Sie sich die Sequenz nicht vorher merken.
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

Ursprüngliche Lösung ( 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
quelle
3
Ein wirklich schöner Missbrauch von 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-
quelle
1
Sie können dies auf 154 reduzieren, indem Sie a) den zu druckenden Ausdruck logisch kurzschließen, b) die Bedeutung von umkehren r, um ihn in weniger Zeichen zu berechnen, c) alles auf eine Zeile setzen: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: Danke! Ich habe diese mit einigen Änderungen angewendet, um 143 zu machen.
Ry-
Ok das hat mich geschlagen, beeindruckende Arbeit. Ich liebe print 1!=a+b!=4das ist teuflisch!
1
@LegoStormtroopr: Nein. Die exec/ evalCombo ist teuflisch;)
Ry-
Ja, das wird schwer zu schlagen sein. Ich war in der Lage, einige von Ihnen zu pressen und zu 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

Eine unbenutzte Referenzimplementierung in Python, die jede Regel buchstäblich implementiert (420 Zeichen):

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.
quelle
3
Hallo. Du hast Klammern in meinem Python.
Ry
Ich denke, die IDE, die ich verwendete, fügte sie standardmäßig ein. Ich war auf einem Windows-Computer und der Versuch, mit einem Texteditor unter Windows zu programmieren, ist brutal.
Joe Z.
1

Python, 150

Dies ist eine Ableitung der (früheren) Antwort von Minitechs, aber ich habe genug herausgedrückt, um meine eigene zu machen:

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)

Die entgolfte Version ist nicht viel lesbarer, aber die von rdieser Minitech verwendete wird nur ausgelöst, wenn bei der nächsten Iteration die Summe if a,bentweder 1,0oder war 0,4, was äquivalent ist, i%4 or i%5 == 0so dass sie nur unter diesen Umständen erscheinen würde. So war es möglich, die Zuordnung und Berechnung von zu entfernen und raus dem aktuellen Wert von iusing aund abzuleiten 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)

Es enthält auch @ WolframHs Vorschläge.


quelle
Äh, das ist nicht wirklich anders. Wie auch immer, nehmen Sie die Räume um [1,4](und verwenden (1,4)oder {1,4}neben) und vor {.
Ry
Nicht anders, nein, nur so verändert, dass ich dachte, es wäre einen Eintrag wert.
Okay, aber Sie sollten es für Leerzeichen Golf spielen.
Ry
@ Minitech keine Sorgen. Prost auf den Tipp zum []Abstand. Ich habe mich gefragt, warum Sie {}in Ihrer ursprünglichen Antwort verwendet haben.
1

R: 170 Zeichen

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
quelle
0

Tcl, 185 Zeichen

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
quelle
Manchmal können whileSchleifen durch timeKonstrukte ersetzt werden , um Bytes zu sparen
sergiol