Fizz-Buzzify eine Zeichenfolge

21

Sie erhalten eine Zeichenfolge, die nur Buchstaben des englischen Alphabets in Klein- und Großbuchstaben enthält (ASCII 65-90 und 97-122). Ihre Aufgabe ist es, die Fizz-Buzzified-Version des Strings auszugeben.

Wie lässt sich eine Zeichenfolge mit einem Fizz-Buzz-Effekt versehen?

  • Jeder Buchstabe mit einem geraden Index im englischen Alphabet (das Alphabet muss 1-indiziert a->1,b->2,...,z->26sein:) wird in fizzKleinbuchstaben und FIZZin Großbuchstaben umgewandelt ( f -> fizz, F -> FIZZ).

  • Jeder Buchstabe mit einem ungeraden Index im englischen Alphabet wird in buzzKleinbuchstaben und BUZZin Großbuchstaben umgewandelt ( e -> buzz, E -> BUZZ).

  • Ein Beispiel zur Veranschaulichung des Algorithmus anhand der Zeichenfolge CodeGolf(Leerzeichen zur Verdeutlichung hinzugefügt):

    "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)
    
  • Wenn es für Ihre Sprache praktischer ist, können Sie auch einzelne Leerzeichen zwischen den Gruppen lassen ( fizz, buzz, FIZZ, BUZZ). Daher kann ein Ergebnis wie fizzBUZZbuzzbuzzauch als zurückgegeben werden fizz BUZZ buzz buzz. Andere Trennzeichen sind nicht zulässig.


Testfälle:

Eingabe -> Ausgabe 

"egg" -> "buzzbuzzbuzz"
"CodeGolf" -> "BUZZbuzzfizzbuzzBUZZbuzzfizzfizz"
"Zurücksetzen" -> "FIZZbuzzbuzzbuzzfizz"
"ATOM" -> "BUZZFIZZBUZZBUZZ"
"yOuArEgReAt" -> "buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz"

  • Jede Standardmethode für E / A kann verwendet werden.

  • Es gelten Standardlücken .

  • Sie dürfen nur Eingaben in der systemeigenen Zeichenfolge Ihrer Sprache vornehmen. Gleiches gilt für die Ausgabe.

  • Sie können davon ausgehen, dass die Eingabe nicht leer sein wird.

  • Kürzester Code in Bytes in jeder Sprache gewinnt. Viel Glück und Fizz-Buzz!

Mr. Xcoder
quelle
Sandkasten.
Mr. Xcoder

Antworten:

7

Holzkohle , 26 24 Bytes

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

Probieren Sie es online! Ursprünglich inspiriert von @CarlosAlejo. Bearbeiten: Speichert 2 Bytes, indem die Buchstaben von Fizz / Buzz durchlaufen werden, anstatt sie einem temporären zuzuweisen. Erläuterung:

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
Neil
quelle
Ich muss endlich deine Lösung verstehen. Ich dachte, dass Ordinal(i)die Position des iZeichens in seiner ursprünglichen Zeichenfolge zurückgegeben, aber es gibt seinen ASCII-Wert (Zeichencode) zurück. Sehr clevere Lösung, ich muss noch viel an meinen Kohlefähigkeiten verbessern!
Charlie
Wie Sie dies in Holzkohle in nur 24 Bytes tun ...
Erik der Outgolfer
In welcher Codierung sind das 24 Bytes?
Ruslan
@ Ruslan In Charcoals benutzerdefinierter Codepage .
Neil
6

C #, 92 Bytes

using System.Linq;a=>string.Concat(a.Select(x=>x%2<1?x<97?"FIZZ":"fizz":x<97?"BUZZ":"buzz"))
LiefdeWen
quelle
Gepostet praktisch zur gleichen Zeit, aber Sie haben ein Byte für meine Lösung gespart, indem Sie den Ternär auf die kürzere Weise bestellt haben +1
TheLethalCoder
@TheLethalCoder ahh, tut mir leid.
LiefdeWen
Es gibt nichts zu bedauern, dass wir 12 Sekunden auseinander gepostet haben! Und deins ist kürzer!
TheLethalCoder
Wird C # Sie x%2direkt als Boolean verwenden lassen, ohne das <1Teil zu benötigen ? In diesem Fall können Sie möglicherweise einige Bytes auf diese Weise speichern.
Brian J
@ BrianJ Nein, es macht es nicht implizit
LiefdeWen
4

C (gcc) , 75 Bytes

f(char*s){for(;*s;++s)printf(*s>90?*s%2?"buzz":"fizz":*s%2?"BUZZ":"FIZZ");}

Probieren Sie es online!

Giacomo Garabello
quelle
4

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

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

Probieren Sie es online!

Viel Golf, sehr Bytes, also Java!

Sehr golfen von @KevinCruijssen um 9 Bytes!

Olivier Grégoire
quelle
Ich dachte, dass Streams das vielleicht kürzer machen würden, also schrieb ich einen. s->s.join("",s.chars().mapToObj(i->i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ").toArray(String[]::new));Leider ist es 105 Zeichen lang :( Wenn sie nur die joindirekt auf dem Stream hinzufügen oder integrieren könnten toList, wäre eigentlich alles sinnvoll gut.
Olivier Grégoire
1
Direktes Drucken anstelle der Rückgabe eines Strings ist 6 Byte kürzer, und bei Verwendung getBytes()von werden toCharArray()zusätzlich 3 Byte kürzer:s->{for(int i:s.getBytes())System.out.print(i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ");}
Kevin Cruijssen,
Sie haben vergessen , das zusätzliche 3 Bytes durch eine Änderung toCharArray()an getBytes(). :)
Kevin Cruijssen
1
Ich habe vor deiner Bearbeitung geklickt und es danach nicht gesehen;) Außerdem habe ich gerade darüber nachgedacht, bevor ich deinen Kommentar gesehen habe 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'])

Testfälle

Arnauld
quelle
3

C # 97 Bytes

using System.Linq;s=>string.Concat(s.Select(c=>"fizzbuzzFIZZBUZZ".Substring(c%2*4+(c>96?0:8),2)))
TheLethalCoder
quelle
Ich weiß nicht, C #, aber können Sie nicht verwendenc%2>1?c>96?"fizz":"buzz":...
Mr. Xcoder
3

Pyth , 23 21 Bytes

smr<d\a@c"fizzbuzz"4C

Testsuite .

Undichte Nonne
quelle
3
O_o 3 Minuten :)
Mr. Xcoder
3

Englisch , 820 632 610 Bytes

Herr Xcoder schlug vor, eine unnötige Fehlerfalle zu beseitigen, die 22 Bytes einspart .

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.

Ungolfed-Code:

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.

Die Plain English IDE ist unter github.com/Folds/english verfügbar . Die IDE läuft unter Windows. Es wird in 32-Bit-x86-Code kompiliert.

Jaspis
quelle
1
"Sie können davon ausgehen, dass die Eingabe nicht leer sein wird." Ich denke, Sie können fallenIf the s is "", exit.
Mr. Xcoder
@ Mr.Xcoder - Danke. Es stellte sich heraus, dass die Falle nicht benötigt wurde, auch wenn s leer war.
Jasper
2

Kohle , 40 36 Bytes

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

Probieren Sie es online!

Erläuterung:

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"

Eine Alternative mit der gleichen Byteanzahl:

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

Probieren Sie es online! ( Ausführliche Version )

  • 4 Bytes gespart dank Neil!
Charlie
quelle
1
Verwenden Sie Countbzw. Ordinalanstelle von Find, um einige Bytes zu speichern.
Neil
Das Ganze ifzählt als eine einzige Aussage, so dass Sie das {}s nicht brauchen . Ich habe auch ein Byte gespeichert, indem ich das UppercaseInnere a verschoben habeTernary : Probieren Sie es online aus!
Neil
Besser noch Fθ«A⎇﹪℅ι²buzz¦fizzχ⎇№αι↥χχfür 26 Bytes. (Deverbosifier mag diese Version nicht.)
Neil
@Neil Vielen Dank, aber ich kann nicht einmal Ihre letzte Version verstehen, daher kann ich das nicht würdigen. Ich würde das Gefühl haben, dass es nicht meine eigene Antwort ist. Es wäre mir eine Ehre, von Ihnen übervorteilt zu werden, wenn Sie Ihren eigenen Beitrag schreiben. :-)
Charlie
2

> <> 68 Bytes

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

Probieren Sie es online aus oder schauen Sie es sich auf dem Fischspielplatz an !

(Aber sieh dir Aarons Antwort an, die 13 Bytes kürzer ist!)

Wenn Sie nicht mit> <> vertraut sind, gibt es einen Fisch, der in 2D durch den Code schwimmt, und die Kanten werden umbrochen. Die Symbole >, <, ^und vdie Richtung des Fisches festgelegt, /und \sind Spiegel , die es reflektieren, und ?bedeutet „die nächste Anweisung tun , wenn die Top-Sache auf dem Stapel nicht Null ist , sonst die nächste Anweisung springen“.

In der ersten Zeile erhält der Fisch das Zeichen input ( i). Wenn es für EOF -1 ist, stoppt es ( :0(?;); es bekommt den charcode mod 2 ( :2%$); und es drückt eine 1 oder 0 auf dem Stapel, abhängig davon, ob der Zeichencode kleiner oder größer als der Zeichencode von "^" ( "^"() ist. Die nächsten drei Zeilen leiten den Fisch zur richtigen Fizz / Buzz-Zeichenfolge um, dann wird er in der letzten Zeile gedruckt (eine ofür jedes Zeichen) und der Fisch zum Anfang zurückgeschickt.

Kein Baum
quelle
@ Aaron, das ist großartig! Ich habe über diese Idee nachgedacht, konnte sie aber nicht zum Laufen bringen. Möchten Sie das als Ihre eigene Lösung veröffentlichen?
Kein Baum
@ Aaron, Sie haben auch einen Fehler in TIO oder im Online-Interpreter gefunden - in diesem Interpreter !oder ?gefolgt von einem Leerzeichen, das nur das Leerzeichen überspringt, aber TIO wartet, bis das nächste Nicht-Leerzeichen übersprungen wird ...
Kein Baum-
@Aaron, deine Einsendung ist viel besser als meine, also kannst du sie selbst posten und ich werde diese löschen.
Kein Baum
!sollte Leerzeichen AFAIK überspringen, aber der Online-Interpreter füllt seinen Codespace mit Leerzeichen auf, was wahrscheinlich das ist, was Sie sehen
Aaron
Lassen Sie uns diese Diskussion im Chat fortsetzen .
Aaron
2

> <> , 55 Bytes

Basierend auf der Antwort von Not a Tree .

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

Anstatt die 4 möglichen Ausgaben im Code darzustellen, stelle ich nur ihre großgeschriebenen Versionen dar und addiere 32 zum Zeichencode, um die kleinen Falläquivalente zu erhalten.

Probieren Sie es online!

Geänderter Code für den Online-Interpreter , der seinen Codespace mit leeren Zellen auffüllt:

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

Perl5 , 50 + 1 Bytes

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

Erstellt eine Liste mit 128 Elementen, die ASCII-Zeichen dem richtigen Codewort zuordnet.

Ikegami
quelle
1

05AB1E , 22 Bytes

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

Probieren Sie es online!

Erläuterung

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

Alternative 22-Byte-Lösung

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

PHP , 67 Bytes

for(;$c=$argn[$i++];)echo[FIZZ,BUZZ,fizz,buzz][ord($c)%2+2*($c>Z)];

Probieren Sie es online!

Jörg Hülsermann
quelle
1

F # , 154 153 145 Bytes

gespeichert 1 9 Byte dank @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""

Probieren Sie es online!


quelle
Speichern Sie 1 Byte, indem Sie das Leerzeichen zwischen concatund ""in der letzten Zeile entfernen
Mr. Xcoder
145 Bytes , entfernen Sie das unnötige Leerzeichen
Mr. Xcoder
Danke @ Mr.Xcoder Ich gewöhne mich immer noch an F # und wenn Einrückungen wichtig sind!
1
Und übrigens, Willkommen bei PPCG! Ich kenne F # überhaupt nicht, habe nur Sachen entfernt, um zu sehen, was passiert :)
Mr. Xcoder
1

Mathematica, 134 Bytes

""<>{(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@#}&
J42161217
quelle
1

Java 8, 89 Bytes

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

Es geht davon aus import static java.util.stream.Collectors.*;

Anthony Garcia
quelle
1

q / kdb +, 48 Bytes

Lösung:

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

Beispiele:

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"

Erläuterung:

Ziemlich einfach, nehmen Sie die Eingabezeichenfolge, wandeln Sie sie in ASCII-Werte um, erstellen Sie eine Liste mit 1 oder 0, je nachdem, ob sie gerade oder ungerade ist (Hinweis A = 65 = ungerade), und indizieren Sie diese Liste dann in eine Liste mit fizzund buzz. Wandeln Sie dies in eine Zeichenfolge um. In Fällen, in denen die Eingabe <91 (niedriger als ein Z) ist, wenden wir die Zeichenfolge anupper Funktion an, um a FIZZoder a zu erhalten BUZZ.

q wird von rechts nach links interpretiert:

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
Streetster
quelle
Ich kenne diese Sprache nicht, aber können Sie das Leerzeichen zwischen modund entfernen 2?
Mr. Xcoder
Leider nicht, es könnte so geschrieben werden, als mod[x;2]wollten wir kein Leerzeichen - aber das ergibt 1 Byte mehr!
Streetster
1

Swift 4 , 144 135 Bytes

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())}

Nicht golfen:

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()
    )
}

Was ich tue, ist Schleifen über jedes Zeichen in der Zeichenfolge. Ich konvertiere jedes in seinen ASCII-Wert, überprüfe dann, ob es gerade oder ungerade ist, und überprüfe dann, ob es groß oder klein geschrieben ist, und gebe den passenden Wert aus der Schleife aus. Ich füge dann alle Elemente des resultierenden Arrays zu einer einzigen Zeichenfolge zusammen und drucke sie aus.

Diese Lösung verwendet Swift 4, so dass es noch keine einfache Möglichkeit gibt, sie online zu testen.

Vielen Dank an @ Mr.Xcoder, der mir 9 Bytes gespart hat!

Caleb Kleveter
quelle
error: value of type 'String' has no member 'map', weil ein String zur Laufzeit nicht automatisch in eine Liste konvertiert wird.
Mr. Xcoder
Auch dieser Service ist nicht kostenlos. Sie müssen eine Kreditkarte hinzufügen, um Ihre Übermittlung zu testen, wenn ich sie nicht kopiere und einfüge. Erwägen Sie, den Testdienst zu ändern.
Mr. Xcoder
Um es funktioniert, müssen Sie ihn in$0.characters.map{...}
Herr Xcoder
@ Mr.Xcoder Cloud 9 hat eine kostenlose Schicht, in der Sie nur einen privaten Arbeitsbereich und unbegrenzt öffentliche Arbeitsbereiche erhalten. Sie sollten sich über GitHub anmelden können. Ich habe noch nie etwas damit geteilt, also war ich mir nicht sicher, ob es funktionieren würde. Außerdem hätte ich erwähnen sollen, dass ich Swift 4 verwende, wobei String mit Collection übereinstimmt. Das heißt, es hat eine Kartenfunktion.
Caleb Kleveter
1
Wie ich sehe, ist die alte Funktionsdeklaration noch gültig in Swift 4, wie func f(s:String){...}, daher können Sie 9 Bytes speichern , indem Sie den folgenden Code verwenden, dass Verwendungen printstatt return: pastebin.com/06kiiGaJ . Wenn es nicht funktioniert, lass es mich wissen.
Mr. Xcoder
1

R, 150 123 108 Bytes

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

Muss mit ASCII kürzer sein? Es war kürzer. Siehe Bearbeitungsverlauf für die alte Antwort, die verwendet wurde letters.

Überprüft jeden Buchstaben auf (1), ob es sich um Großbuchstaben handelt oder nicht ( >91) und ob es sich um einen fizzoder einen handelt buzz.

BLT
quelle
-3

Java

str.chars().forEach(ch ->{
    if(ch >= 97)
        strb.append(ch % 2 == 0 ? "fizz" : "buzz");
    else
        strb.append(ch % 2 == 0 ? "FIZZ" : "BUZZ");
});
shwetha
quelle
6
Hallo! Willkommen bei PPCG! Wir sind eine Golfgemeinschaft, also versuchen wir, so viele Bytes wie möglich zu entfernen - dies schließt Bytes in Variablennamen und Leerzeichen ein, die aus Ihrer Antwort entfernt werden können. Außerdem müssen die Einreichungen entweder ein vollständiges Programm (einschließlich Boilerplate public static void main) oder eine Funktion sein. Momentan ist deins ein Ausschnitt.
Stephen