Fizz-Buzzify una stringa


21

Ti verrà data una stringa che contiene solo lettere dell'alfabeto inglese, sia minuscole che maiuscole (ASCII 65-90 e 97-122). Il tuo compito è produrre la versione Fizz-Buzzified della String.

Come Fizz-Buzzify una stringa?

  • Ogni lettera che ha un indice pari nell'alfabeto inglese (l'alfabeto deve essere 1-indicizzato:) a->1,b->2,...,z->26verrà trasformata fizzse è minuscola e FIZZse è maiuscola ( f -> fizz, F -> FIZZ).

  • Ogni lettera che ha un indice dispari nell'alfabeto inglese verrà trasformata buzzse è minuscola e BUZZse è maiuscola ( e -> buzz, E -> BUZZ).

  • Facciamo un esempio, per illustrare l'algoritmo, usando la stringa CodeGolf(spazi aggiunti per maggiore chiarezza):

    "C o d e G o l f" ->  "BUZZ buzz fizz buzz BUZZ buzz fizz fizz"
     ^ ^ ^ ^ ^ ^ ^ ^
     1 1 0 1 1 1 0 0       (1 is odd index, 0 is even index)
    
  • Se è più conveniente per la tua lingua, puoi anche lasciare spazi singoli tra i gruppi ( fizz, buzz, FIZZ, BUZZ). Quindi, un risultato simile fizzBUZZbuzzbuzzpuò anche essere restituito come fizz BUZZ buzz buzz. Altri separatori non sono ammessi.


Casi test:

Ingresso -> Uscita 

"uovo" -> "buzzbuzzbuzz"
"CodeGolf" -> "BUZZbuzzfizzbuzzBUZZbuzzfizzfizz"
"Ripristina" -> "FIZZbuzzbuzzbuzzfizz"
"ATOM" -> "BUZZFIZZBUZZBUZZ"
"yOuArEgReAt" -> "buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz"

  • È possibile utilizzare qualsiasi metodo standard per l'I / O.

  • Si applicano le lacune predefinite .

  • Ti è consentito solo inserire input nel tipo di stringa nativo della tua lingua. Lo stesso vale per l'output.

  • Si può presumere che l'input non sarà vuoto.

  • Vince il codice più breve in byte in ogni lingua. Buona fortuna e Fizz-Buzz!


Risposte:


7

Carbone , 26 24 byte

FθF⎇﹪℅ι²buzz¦fizz⎇№αι↥κκ

Provalo online! Originariamente ispirato a @CarlosAlejo. Modifica: salvato 2 byte ripetendo ciclicamente le lettere di fizz / buzz invece di assegnarle a un temporaneo. Spiegazione:

Fθ          Loop over the input (i = loop variable)
  F         Choose and loop over the word (k = loop variable)
   ⎇        Ternary
    ﹪℅ι²    If i has an odd ASCII code
    buzz
    fizz
            Print (implicit)
  ⎇         Ternary
   №αι      If i is an uppercase letter
    ↥κ      Uppercase(k)
     κ      k

Finalmente ho capito la tua soluzione. Ho pensato che Ordinal(i)restituisse la posizione del icarattere nella sua stringa originale, ma restituisce il suo valore ASCII (codice carattere). Soluzione molto intelligente, ho ancora bisogno di migliorare molto le mie capacità di carbone!
Charlie,

Come si fa a carbone in soli 24 byte ...
Erik the Outgolfer,

In quale codifica sono questi 24 byte?
Ruslan,

@Ruslan Nella codepage personalizzata di Charcoal .
Neil,

6

C #, 92 byte

using System.Linq;a=>string.Concat(a.Select(x=>x%2<1?x<97?"FIZZ":"fizz":x<97?"BUZZ":"buzz"))

Pubblicato praticamente nello stesso momento, ma hai salvato un byte nella mia soluzione ordinando il ternario nel modo più breve +1
TheLethalCoder

@TheLethalCoder ahh, mi dispiace per quello.
Liefde:

Niente di cui dispiacersi di aver pubblicato a distanza di 12 secondi! E il tuo è più corto!
TheLethalCoder il

C # ti permetterà di usarlo x%2direttamente come booleano, senza bisogno della <1parte? In tal caso, potresti essere in grado di salvare alcuni byte in quel modo.
Brian J,

@BrianJ No, non lo fa implicitamente
LiefdeWen



4

Java (OpenJDK 8) , 105 100 94 91 90 byte

s->{for(int i:s.getBytes())System.out.print(i%2<1?i>90?"fizz":"FIZZ":i>90?"buzz":"BUZZ");}

Provalo online!

Molto giocabile, molto byte, quindi Java!

Molto golfato da @KevinCruijssen da 9 byte!


Ho pensato che forse i flussi avrebbero reso questo più breve, quindi ne ho scritto uno. s->s.join("",s.chars().mapToObj(i->i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ").toArray(String[]::new));Ahimè, è lungo 105 caratteri :( Se solo potessero aggiungere il joindirettamente sullo stream o integrare un toList, in realtà, qualsiasi cosa sensata sarebbe buona.
Olivier Grégoire,

1
La stampa diretta anziché la restituzione di una stringa è più breve di 6 byte e l'utilizzo getBytes()invece di toCharArray()un ulteriore 3 byte è più breve:s->{for(int i:s.getBytes())System.out.print(i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ");}
Kevin Cruijssen,

Hai dimenticato i 3 byte aggiuntivi cambiando toCharArray()in getBytes(). :)
Kevin Cruijssen il

1
Ho cliccato prima della tua modifica e non l'ho vista dopo;) Inoltre, ci ho pensato prima di vedere il tuo commento xD
Olivier Grégoire,

3

JavaScript (ES6), 79 77 byte

s=>s.replace(/./g,c=>['BUZZ','buzz','FIZZ','fizz'][parseInt(c,36)%2*2|c>'Z'])

Casi test


3

C #, 97 byte

using System.Linq;s=>string.Concat(s.Select(c=>"fizzbuzzFIZZBUZZ".Substring(c%2*4+(c>96?0:8),2)))

Non conosco C #, ma non puoi usarec%2>1?c>96?"fizz":"buzz":...
Mr. Xcoder il



3

Plain English , 820 632 610 byte

Il signor Xcoder ha suggerito di eliminare una trappola di errore non necessaria, che ha consentito di risparmiare 22 byte.

A fizzy string is a string.
To convert a s string to a z fizzy string:
Clear the z.
Slap a r rider on the s.
Loop.
If the r's source's first is greater than the r's source's last, exit.
Put the r's source's first's target in a b byte.
If the b is not any letter, bump the r; repeat.
Put "FIZZ" in a t string.
If the b is d, put "BUZZ" in the t.
If the b is _, lowercase the t.
Append the t to the z.
Bump the r.
Repeat.
To decide if a b byte is d:
Put the b in a n number.
If the n is odd, say yes.
Say no.
To decide if a b byte is _:
Put the b in a c byte.
Lowercase the c.
If the c is the b, say yes.
Say no.

Codice non golfato:

A fizzy string is a string.

To convert a string to a fizzy string:
  Clear the fizzy string.
  Slap a rider on the string.
  Loop.
    If the rider's source's first is greater than the rider's source's last, exit.
    Put the rider's source's first's target in a byte.
    If the byte is not any letter, bump the rider; repeat.
    Put "FIZZ" in another string.
    If the byte is odd, put "BUZZ" in the other string.
    If the byte is lower case, lowercase the other string.
    Append the other string to the fizzy string.
    Bump the rider.
  Repeat.

To decide if a byte is odd:
  Put the byte in a number.
  If the number is odd, say yes.
  Say no.

To decide if a byte is lower case:
  Privatize the byte.
  Lowercase the byte.
  If the byte is the original byte, say yes.
  Say no.

L'IDE inglese normale è disponibile su github.com/Folds/english . L'IDE funziona su Windows. Si compila in codice x86 a 32 bit.


1
"Puoi presumere che l'input non sarà vuoto." quindi penso che tu possa lasciar perdereIf the s is "", exit.
Mr. Xcoder il

@ Mr.Xcoder - Grazie. Si scopre che la trappola non era necessaria anche se s era vuota.
Jasper,

2

Carbone , 40 36 byte

Fθ¿№αι¿﹪⌕αι²FIZZ¦BUZZ¿﹪⌕βι²fizz¦buzz

Provalo online!

Spiegazione:

Fθ                                      for every char i in the input:
   ¿№αι                                    if i is found in the uppercase alphabet
       ¿﹪⌕αι²                             if i is an even uppercase char
              FIZZ¦BUZZ                    print "FIZZ" or else "BUZZ"
                       ¿﹪⌕βι²             if i is an even lowercase char
                              fizz¦buzz    print "fizz" or else "buzz"

Un'alternativa con lo stesso numero di byte:

AfizzφAbuzzχFθ¿№αι¿﹪⌕αι²↥φ↥χ¿﹪⌕βι²φχ

Provalo online! ( Versione dettagliata )

  • 4 byte salvati grazie a Neil!

1
Utilizzare Counto Ordinalrispettivamente invece di Findsalvare alcuni byte.
Neil,

L'intero ifconta come una singola istruzione, quindi non è necessario il {}s. Ho anche salvato un byte spostando l' Uppercaseinterno a Ternary: Provalo online!
Neil,

Meglio ancora, Fθ«A⎇﹪℅ι²buzz¦fizzχ⎇№αι↥χχper 26 byte. (A Deverbosifier non piace questa versione.)
Neil

@Neil Grazie mille, ma non riesco nemmeno a capire la tua ultima versione, quindi non posso prendermi il merito, mi sento come se non fosse la mia risposta. Sarei onorato di essere superato da te se scrivi il tuo post. :-)
Charlie,

2

> <> , 68 byte

<vv?("^"$%2:;?(0:i
v\?\"zzif"
v \\"zzub"
v \ "ZZIF"
v  \"ZZUB"
\oooo

Provalo online o guardalo nel parco giochi per pesci !

(Ma guarda la risposta di Aaron che è più corta di 13 byte!)

Se non hai familiarità con> <>, c'è un pesce che nuota attraverso il codice in 2D e i bordi si avvolgono. I simboli >, <, ^e vimpostare la direzione del pesce, /e \sono specchi che riflettono esso, e ?significa "fare la prossima istruzione, se la cosa in cima alla pila è diverso da zero, altrimenti saltare la prossima istruzione".

Nella prima riga, il pesce assume un carattere di input ( i); se è -1 per EOF, si ferma ( :0(?;); ottiene il charcode mod 2 ( :2%$); e inserisce uno o uno 0 nello stack a seconda che il codice char sia minore o maggiore del charcode di "^" ( "^"(). Le tre righe successive reindirizzano il pesce verso la giusta stringa di fizz / ronzio, quindi l'ultima riga lo stampa (uno oper ogni personaggio) e rimanda il pesce all'inizio.


@Aaron, è fantastico! Pensavo a quell'idea ma non riuscivo a farlo funzionare. Vorresti pubblicarlo come soluzione personale?
Non un albero il

@Aaron, hai anche trovato un bug in TIO o nell'interprete online - in quell'interprete !o ?seguito da uno spazio salta semplicemente lo spazio, ma TIO aspetta fino alla prossima cosa non spaziale per saltare ...
Non un albero

@Aaron, la tua richiesta è molto meglio della mia, quindi puoi postarla tu stesso e la eliminerò.
Non un albero il

!dovrebbe saltare gli spazi di AFAIK, ma l'interprete online riempie il suo spazio di codice di spazi, che è probabilmente quello che stai vedendo
Aaron


2

> <> , 55 byte

Basato sulla risposta di Non un albero .

<v%2$)"^":;?(0:i
 \?v"ZZIF"
~v >"ZZUB"!
^>{:}" "*+ol1=?

Invece di rappresentare i 4 possibili output nel codice, rappresento solo le loro versioni in maiuscolo e ne aggiungo 32 al codice del carattere per ottenere gli equivalenti minuscoli.

Provalo online!

Codice modificato per l' interprete online , che riempie il suo spazio dei codici con celle vuote:

<v%2$)"^":;?(0:i
 \?v"ZZIF"
~v >"ZZUB"     !
^>{:}" "*+o l1=?

2

Perl5 , 50 + 1 byte

perl -nE'say+((FIZZ,BUZZ)x48,(fizz,buzz)x16)[unpack"C*",$_]'

Crea un elenco di 128 elementi che associa i caratteri ASCII alla parola del codice corretta.


1

05AB1E , 22 byte

v‘FIZZÒÖ‘#yÇÉèAyåil}J?

Provalo online!

Spiegazione

v                        # for each char y of input string
 ‘FIZZÒÖ‘#               # push the list ['FIZZ','BUZZ']
          yÇÉ            # check if y has an odd character code
             è           # use this to index into the list
              Ayåi       # if y is a member of the lowercase alphabet
                  l}     # convert to lowercase
                    J?   # unwrap from list and print

Soluzione alternativa a 22 byte

ÇÉAISå·+‘FIZZÒÖ‘#Dl«èJ


1

F # , 154 153 145 byte

salvato 1 9 byte grazie a @Mr. Xcoder

let g s=
 Seq.map(fun c->match int c with
|x when x>64&&x<91->if x%2=0 then"FIZZ"else"BUZZ"
|x->if x%2=0 then"fizz"else"buzz")s
|>String.concat""

Provalo online!


Salva 1 byte rimuovendo lo spazio tra concate ""sull'ultima riga
Mr. Xcoder il


145 byte , rimuovi gli spazi bianchi non necessari
Mr. Xcoder il

Grazie @ Mr.Xcoder Mi sto ancora abituando a F # e quando il rientro è significativo!

1
E a proposito, benvenuto in PPCG! Non conosco affatto F #, ho appena rimosso roba per vedere cosa succede :)
Mr. Xcoder il

1

Mathematica, 134 byte

""<>{(s=Max@ToCharacterCode@#;If[96<s<123,If[EvenQ@s,c="fizz",c="buzz"]];If[64<s<91,If[EvenQ@s,c="FIZZ",c="BUZZ"]];c)&/@Characters@#}&

1

Java 8, 89 byte

s->s.chars().mapToObj(i->i%2<1?i>90?"fizz":"FIZZ":i>90?"buzz":"BUZZ").collect(joining());

Presuppone import static java.util.stream.Collectors.*;


1

q / kdb +, 48 byte

Soluzione:

raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$

Esempi:

q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"egg"
"buzzbuzzbuzz"
q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"CodeGolf"
"BUZZbuzzfizzbuzzBUZZbuzzfizzfizz"
q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"Reset"
"FIZZbuzzbuzzbuzzfizz"
q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"ATOM"
"BUZZFIZZBUZZBUZZ"
q)raze{@[($)`fizz`buzz x mod 2;(&)x<91;upper]}"i"$"yOuArEgReAt"
"buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz"

Spiegazione:

Abbastanza semplice, prendi la stringa di input, esegui il cast in valori ASCII, crea un elenco di 1 o 0 a seconda che sia dispari o pari (suggerimento A = 65 = dispari), quindi usa questo elenco per indicizzare in un elenco di fizze buzz. Trasmetti questo su una stringa e quindi per i casi in cui l'input è <91 (inferiore a una Z) applichiamo la upperfunzione per ottenere a FIZZo a BUZZ.

q viene interpretato da destra a sinistra:

raze{@[string `fizz`buzz x mod 2;where x < 91;upper]}"i"$ / ungolfed version
                                                     "i"$ / cast input to ascii values
    {                                               }     / anonymous lambda
     @[                         ;            ;     ]      / apply 
                                              upper       / upper-case
                                 where x < 91             / indices where input is less than 91 (ie uppercase)
                         x mod 2                          / returns 0 if even and 1 if odd
              `fizz`buzz                                  / 2 item list, which we are indexing into
       string                                             / cast symbols to strings `buzz -> "buzz"
raze                                                      / raze (merge) list into a single string

Non conosco questa lingua, ma puoi rimuovere lo spazio tra mode 2?
Mr. Xcoder,

Sfortunatamente no, potrebbe essere scritto come mod[x;2]se non volessimo spazi bianchi, ma finisce per essere 1 byte in più!
streetster,


1

Swift 4 , 144 135 byte

func f(s:String){print(s.map{let d=Int(UnicodeScalar("\($0)")!.value);return d%2<1 ?d>90 ?"fizz":"FIZZ":d>90 ?"buzz":"BUZZ"}.joined())}

Un-giocato a golf:

func f(s:String){
    print(
        s.map{
            let d=Int(UnicodeScalar("\($0)")!.value)
            return d%2 < 1 ? d > 90 ? "fizz" : "FIZZ" : d > 90 ? "buzz" : "BUZZ"
        }.joined()
    )
}

Quello che sto facendo è passare in rassegna ogni personaggio della stringa. Converto ciascuno nel suo valore ASCII, quindi controllo per vedere se è pari o dispari, quindi controllo per vedere se è maiuscolo o minuscolo e output il valore corrispondente dal loop. Quindi unisco tutti gli elementi dell'array risultante in un'unica stringa e lo stampo.

Questa soluzione utilizza Swift 4, quindi non è ancora possibile testarlo online facilmente.

Grazie a @ Mr.Xcoder per avermi salvato 9 byte!


error: value of type 'String' has no member 'map', poiché una stringa non viene automaticamente convertita in un elenco in fase di esecuzione.
Mr. Xcoder,

Inoltre, quel servizio non è gratuito. Devi aggiungere una carta di credito per testare l'invio se non lo copio. Valuta di cambiare il servizio di test.
Mr. Xcoder,

Per farlo funzionare, devi trasformarlo in$0.characters.map{...}
Mr. Xcoder il

@ Mr.Xcoder Cloud 9 ha un livello gratuito, in cui si ottiene solo un'area di lavoro privata e aree di lavoro pubbliche illimitate. Dovresti essere in grado di accedere tramite GitHub. Non ho mai condiviso nulla con esso, quindi non ero sicuro che avrebbe funzionato. Inoltre, avrei dovuto menzionare che sto usando Swift 4, in cui String è conforme a Collection. Ciò significa che ha una funzione mappa.
Caleb Kleveter,

1
Come posso vedere, la vecchia dichiarazione di funzione è ancora valida in Swift 4, come func f(s:String){...}, quindi è possibile salvare 9 byte utilizzando il seguente codice, che utilizza printinvece di return: pastebin.com/06kiiGaJ . Se non funziona, fammi sapere.
Mr. Xcoder,

1

R, 150 123 108 byte

i=ifelse
cat(i(sapply(el(strsplit(scan(,''),'')),utf8ToInt)>91,i(x%%2,'buzz','fizz'),i(x%%2,'BUZZ','FIZZ')))

Deve essere più breve usando ASCII? È stato più corto. Vedi la cronologia delle modifiche per la vecchia risposta, utilizzata letters.

Controlla ogni lettera per (1) se è maiuscola o meno ( >91) e se è a fizzo a buzz.


-3

Giava

str.chars().forEach(ch ->{
    if(ch >= 97)
        strb.append(ch % 2 == 0 ? "fizz" : "buzz");
    else
        strb.append(ch % 2 == 0 ? "FIZZ" : "BUZZ");
});

6
Ciao! Benvenuti in PPCG! Siamo una comunità di golf, quindi cerchiamo di rimuovere il maggior numero possibile di byte - questo include byte in nomi di variabili e spazi bianchi, che possono essere rimossi dalla tua risposta. Inoltre, gli invii devono essere un programma completo (incluso il tipo di boilerplate public static void main) o una funzione. Attualmente, il tuo è un frammento.
Stephen,
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.