Crea un programma "BizzFuzz"


17

In FizzBuzz tradizionale, ti viene chiesto di stampare i numeri da 1 a 100, ma sostituendo ogni multiplo di 3 con "Fizz", ogni multiplo di 5 con "Buzz" e ogni multiplo di 3 e 5 (ovvero 15) con " FizzBuzz".

Tuttavia, come un malvagio intervistatore, ho inventato la mia versione contorta di FizzBuzz, che ho deciso di nominare BizzFuzz e darti in un'intervista di programmazione.

Le regole del gioco sono:

  • Stampa ogni numero da 1 a 100, tranne se il numero soddisfa una delle condizioni seguenti.

    • Se il numero è divisibile per 4, stampa "Fizz".
    • Se il numero è divisibile per 5, stampa "Buzz".

    • Se il numero è divisibile per 4, ma il numero immediatamente successivo è divisibile per 5, stampa "FizzBuzz" anziché "Fizz" e stampa il numero successivo regolarmente.

    • Se il numero è divisibile per 5, ma il numero immediatamente dopo è divisibile per 4, stampa "BuzzFizz" anziché "Buzz" e stampa il numero successivo regolarmente.

    • Se il numero è immediatamente prima di un numero divisibile per 4 e 5, stampa "Bizz".

    • Se il numero è immediatamente dopo un numero divisibile per 4 e 5, stampare "Fuzz".

    • Se il numero è divisibile per 4 e 5, stampa "BizzFuzz".

Vince il codice più breve per implementare tutte queste regole in qualsiasi lingua.

Risposte:


4

GolfScript ( 83 80 caratteri)

(NB Il suggerimento di Howard nei commenti consente di ridurre a 78 caratteri, ma con spazi finali su alcune righe).

Questo utilizza il personaggio \0, quindi eccolo in formato 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}/.

e base64:

MTAwLHspLjIwJSdCaUZ1CgBGdQoAAABGaUJ1CgAAAABGaQoAAEJ1CgAARmkKAAAAQnVGaQoAAAAA
QmkKJzEsLz0yLyd6eicqXG4rb3J9Lwo=

Usando ^ come supporto \0, lo è

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

Non è ancora un problema particolarmente interessante.


È stata richiesta una spiegazione:

Per valori 0da 99includere:

100,{
...
}/

Incrementare il valore (che vogliamo 1a 100) e anche scoprire che cosa il valore incrementato è mod 20:

).20%

Dividi la stringa magica attorno ai \0personaggi:

MAGIC_STRING 1,/

Prendi l' elemento ( x mod 20) th di quell'array, suddividilo in blocchi di 2 caratteri e incollali insieme zz. Nota: la stringa è vuota (nel qual caso non ci sono blocchi, quindi finiamo con la stringa vuota) o è una sequenza di [BF][iu]prefissi seguita da una nuova riga.

=2/'zz'*

Prendi l'altra copia del numero incrementato che abbiamo tenuto in pila e aggiungi una nuova riga. Ora qualunque stringa stringiamo finirà con una nuova riga.

\n+

Applicare un'operazione di fallback. (Questo è simile a ||JavaScript o COALESCESQL).

or

@minitech, refuso introdotto dal non copiare e incollare perché reindirizzare tutto è un dolore al collo. Fisso.
Peter Taylor,

2
riferendosi a tutto = CTRL + K
John Dvorak,

Puoi spiegarlo?
Johannes Kuhn,

"Non è un problema molto interessante." Sì, ho avuto la sensazione che fosse il caso quando l'ho pubblicato. Tuttavia, è una variazione.
Joe Z.

Diventa anche più interessante come gioco di società con gli amici, piuttosto che una sfida di programmazione. A turno, cercando di dire i numeri in ordine. Fondamentalmente è FizzBuzz Hardcore Edition se non memorizzi la sequenza in anticipo.
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

Soluzione originale ( 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]

3
Un bellissimo abuso di 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
Puoi golfare fino a 154 usando a) un corto circuito logico sull'espressione da stampare, b) invertendo il significato di rcalcolarlo in meno caratteri, c) mettendo tutto su una riga: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
Ripristina Monica

@WolframH: grazie! Ho applicato quelli con alcune modifiche per fare 143.
Ry

Ok questo mi ha battuto, lavoro impressionante. Adoro print 1!=a+b!=4che sia diabolico!

1
@LegoStormtroopr: Nah. La combo exec/ evalè diabolica;)
Ry-

Sì, sarà difficile da battere. Sono stato in grado di spremere e pochi extra dalla tua cambiando la sezione di stampa inprint{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

Un'implementazione di riferimento non modificata in Python che implementa letteralmente ogni regola (420 caratteri):

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. Hai le parentesi nel mio Python.
Ry,

Penso che l'IDE che stavo usando li abbia inseriti per impostazione predefinita. Ero su un computer Windows e provare a programmare usando un editor di testo su Windows è brutale.
Joe Z.

1

Python, 150

Questo è un derivato della risposta di minitech (precedente), ma ne ho spremuto abbastanza per crearne uno mio:

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)

La versione degolfata non è molto più leggibile, ma quella rche Minitech stava usando è innescata solo se alla successiva iterazione la somma se a,bera o 1,0o 0,4, il che equivale a i%4 or i%5 == 0quindi apparirà solo in quelle circostanze. Quindi è stato possibile rimuovere l'assegnazione e il calcolo re ricavarlo dal valore corrente di iutilizzo ae 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)

Include anche i suggerimenti di @ WolframH.


Ehm, non è molto diverso. Ad ogni modo, togli gli spazi intorno [1,4](e usa (1,4)o {1,4}oltre) e prima {.
Ry-

Non diverso no, appena cambiato abbastanza che ho pensato che valesse la pena entrare.

Va bene, ma dovresti giocare a golf per gli spazi bianchi.
Ry-

@minitech non preoccuparti. Saluti per la punta sulla []spaziatura. Mi chiedevo perché hai usato la {}tua risposta originale.

1

R: 170 caratteri

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

0

Tcl, 185 caratteri

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

A volte i whileloop possono essere sostituiti da timecostrutti per salvare byte
sergiol
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.