Fizz-Buzzify a String

21

Otrzymasz ciąg znaków, który zawiera tylko litery alfabetu angielskiego, zarówno małe, jak i wielkie (ASCII 65-90 i 97-122). Twoim zadaniem jest wyprowadzenie wersji łańcucha Fizz-Buzzified.

Jak Fizz-Buzzify a String?

  • Każda litera z parzystym indeksem w alfabecie angielskim (alfabet musi być indeksowany 1:) a->1,b->2,...,z->26zostanie zamieniona, fizzjeśli jest pisana małymi literami i FIZZjeśli jest pisana wielkimi literami ( f -> fizz, F -> FIZZ).

  • Każda litera z nieparzystym indeksem w alfabecie angielskim zostanie zamieniona, buzzjeśli jest pisana małymi literami i BUZZjeśli jest pisana wielkimi literami ( e -> buzz, E -> BUZZ).

  • Zróbmy przykład, aby zilustrować algorytm, używając łańcucha CodeGolf(spacje dodane dla zachowania przejrzystości):

    "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)
    
  • Jeśli jest to wygodniejsze dla twojego języka, możesz również zostawić pojedyncze spacje między grupami ( fizz, buzz, FIZZ, BUZZ). Dlatego wynik podobny fizzBUZZbuzzbuzzmożna również zwrócić jako fizz BUZZ buzz buzz. Inne separatory są niedozwolone.


Przypadki testowe:

Wejście -> Wyjście 

„jajko” -> „buzzbuzzbuzz”
„CodeGolf” -> „BUZZbuzzfizzbuzzBUZZbuzzfizzfizz”
„Resetuj” -> „FIZZbuzzbuzzbuzzfizz”
„ATOM” -> „BUZZFIZZBUZZBUZZ”
„yOuArEgReAt” -> „buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz”

Pan Xcoder
źródło
Piaskownica.
Pan Xcoder

Odpowiedzi:

7

Węgiel drzewny , 26 24 bajtów

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

Wypróbuj online! Pierwotnie zainspirowany @CarlosAlejo. Edycja: Zapisano 2 bajty, zapętlając litery fizz / buzz zamiast przypisywać je do wartości tymczasowej. Wyjaśnienie:

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
źródło
W końcu zrozumiałem twoje rozwiązanie. Myślałem, że Ordinal(i)zwrócił pozycję iznaku w oryginalnym ciągu znaków, ale zwraca wartość ASCII (kod znaku). Bardzo sprytne rozwiązanie, wciąż muszę znacznie poprawić swoje umiejętności w zakresie węgla drzewnego!
Charlie
Jak to robisz w Charcoal w zaledwie 24 bajtach ...
Erik the Outgolfer
W jakim kodowaniu są to 24 bajty?
Ruslan
@Ruslan W niestandardowej stronie kodowej Charcoal .
Neil
6

C #, 92 bajty

using System.Linq;a=>string.Concat(a.Select(x=>x%2<1?x<97?"FIZZ":"fizz":x<97?"BUZZ":"buzz"))
LiefdeWen
źródło
Wysłano praktycznie w tym samym czasie, ale zapisałeś bajt do mojego rozwiązania, zamawiając
trójkę
@TheLethalCoder ahh, przepraszam za to.
LiefdeWen
Nie ma przykro z tego powodu, że opublikowaliśmy je w odstępie 12 sekund! A twój jest krótszy!
TheLethalCoder
Czy C # pozwoli Ci używać x%2bezpośrednio jako wartość logiczną, bez potrzeby <1części? Jeśli tak, możesz w ten sposób zapisać niektóre bajty.
Brian J
@BrianJ Nie, nie robi tego pośrednio
LiefdeWen
4

C (gcc) , 75 bajtów

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

Wypróbuj online!

Giacomo Garabello
źródło
4

Java (OpenJDK 8) , 105 100 94 91 90 bajtów

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

Wypróbuj online!

Dużo golfowych, bardzo bajtów, więc Java!

Bardzo gra w golfa przez @KevinCruijssen o 9 bajtów!

Olivier Grégoire
źródło
Pomyślałem, że może strumienie skracają ten czas, więc napisałem jeden. s->s.join("",s.chars().mapToObj(i->i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ").toArray(String[]::new));Niestety, ma 105 znaków :( Gdyby tylko mogli dodać joinbezpośrednio do strumienia lub zintegrować, a toListwłaściwie wszystko, co rozsądne, byłoby dobre.
Olivier Grégoire
1
Drukowanie bezpośrednio zamiast zwracania ciągu znaków jest krótsze o 6 bajtów, a korzystanie getBytes()z niego toCharArray()to dodatkowe 3 bajty krótsze:s->{for(int i:s.getBytes())System.out.print(i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ");}
Kevin Cruijssen
Zapomniałeś dodatkowych 3 bajtów, zmieniając toCharArray()na getBytes(). :)
Kevin Cruijssen
1
Kliknąłem przed twoją edycją, a potem jej nie widziałem;) Pomyślałem o tym, zanim zobaczyłem twój komentarz xD
Olivier Grégoire
3

JavaScript (ES6), 79 77 bajtów

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

Przypadki testowe

Arnauld
źródło
3

C #, 97 bajtów

using System.Linq;s=>string.Concat(s.Select(c=>"fizzbuzzFIZZBUZZ".Substring(c%2*4+(c>96?0:8),2)))
TheLethalCoder
źródło
Nie znam C #, ale nie możesz użyćc%2>1?c>96?"fizz":"buzz":...
Mr. Xcoder
3

Zwykły angielski , 820 632 610 bajtów

Pan Xcoder zasugerował wyeliminowanie niepotrzebnej pułapki błędów, która pozwoliła zaoszczędzić 22 bajty.

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.

Nieskluczony kod:

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.

Zwykły angielski IDE jest dostępny na stronie github.com/Folds/english . IDE działa w systemie Windows. Kompiluje się do 32-bitowego kodu x86.

Jaspis
źródło
1
„Możesz założyć, że dane wejściowe nie będą puste”. więc myślę, że możesz upuścićIf the s is "", exit.
Mr. Xcoder
@ Mr.Xcoder - Dziękujemy. Okazuje się, że pułapka nie była potrzebna, nawet jeśli s była pusta.
Jasper
2

Węgiel drzewny , 40 36 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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"

Alternatywa z taką samą liczbą bajtów:

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

Wypróbuj online! ( Pełna wersja )

  • 4 bajty zapisane dzięki Neilowi!
Charlie
źródło
1
Użyj Countlub Ordinalodpowiednio zamiast, Findaby zaoszczędzić trochę bajtów.
Neil
Całość ifliczy się jako jedna instrukcja, więc nie potrzebujesz {}s. Zapisałem również bajt, przesuwając Uppercasewewnątrz Ternary: Wypróbuj online!
Neil
Jeszcze lepiej, Fθ«A⎇﹪℅ι²buzz¦fizzχ⎇№αι↥χχdla 26 bajtów. (Deverbosifier nie lubi tej wersji.)
Neil
@Neil Dziękuję bardzo, ale nie mogę nawet zrozumieć waszej ostatniej wersji, więc nie mogę jej przypisać, czułbym się, ponieważ nie jest to moja własna odpowiedź. Byłbym zaszczycony, że zostanę przez ciebie obstawiony, jeśli napiszesz swój własny post. :-)
Charlie
2

> <> , 68 bajtów

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

Wypróbuj online lub obejrzyj na placu zabaw dla ryb !

(Ale spójrz na odpowiedź Aarona, która jest o 13 bajtów krótsza!)

Jeśli nie znasz>>>, ryba przepływa przez kod w 2D, a brzegi zawijają się. Symbole >, <, ^i vustawić kierunek ryb, /i \są lustra, które odbijają je, a ?oznacza „zrobić następną instrukcję jeśli górna rzeczą na stosie jest niezerowe, inaczej przeskoczyć do następnej instrukcji”.

W pierwszym wierszu ryba przyjmuje znak input ( i); jeśli wynosi -1 dla EOF, zatrzymuje się ( :0(?;); pobiera charcode mod 2 ( :2%$); i wypycha 1 lub 0 na stosie w zależności od tego, czy kod znaków jest mniejszy czy większy niż kod znaku „^” ( "^"(). Następne trzy wiersze przekierowują rybę na właściwy ciąg fizz / buzz, a następnie drukuje ją w ostatnim wierszu (jeden odla każdego znaku) i odsyła rybę z powrotem na początek.

Nie drzewo
źródło
@Aaron, to świetnie! Pomyślałem o tym pomyśle, ale nie mogłem go uruchomić. Czy chcesz to opublikować jako własne rozwiązanie?
Nie drzewo
@Aaron, znalazłeś także błąd w TIO lub w tłumaczu online - w tym tłumaczu !lub ?po nim spacja po prostu pomija to miejsce, ale TIO czeka, aż kolejna rzecz niebędąca spacją pominie ...
To nie drzewo
@Aaron, Twoje zgłoszenie jest znacznie lepsze niż moje, więc możesz opublikować je samodzielnie, a ja je usunę.
Nie drzewo
!powinien pomijać spacje AFAIK, ale interpreter online wypełnia swoją przestrzeń kodową spacjami, co prawdopodobnie jest tym, co widzisz
Aaron
2

> <> , 55 bajtów

Oparty nie na drzewie za odpowiedź .

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

Zamiast reprezentować 4 możliwe dane wyjściowe w kodzie, reprezentuję tylko ich wielkie litery i dodam 32 do kodu znakowego, aby uzyskać ekwiwalenty małych liter.

Wypróbuj online!

Zmodyfikowany kod interpretera online , który wypełnia przestrzeń kodową pustymi komórkami:

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

Perl5 , 50 + 1 bajtów

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

Tworzy listę 128 pozycji, która odwzorowuje znaki ASCII na właściwe słowo kodowe.

ikegami
źródło
1

05AB1E , 22 bajty

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

Wypróbuj online!

Wyjaśnienie

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

Alternatywne rozwiązanie 22-bajtowe

ÇÉAISå·+‘FIZZÒÖ‘#Dl«èJ
Emigna
źródło
1

PHP , 67 bajtów

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

Wypróbuj online!

Jörg Hülsermann
źródło
1

F # , 154 153 145 bajtów

zapisano 1 9 bajtów dzięki @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""

Wypróbuj online!


źródło
Zaoszczędź 1 bajt, usuwając spację między concati ""w ostatniej linii
Mr. Xcoder
145 bajtów , usuń niepotrzebne białe znaki
Mr. Xcoder
Dzięki @ Mr.Xcoder Nadal przyzwyczajam się do F # i kiedy wcięcie jest znaczące!
1
I BTW, Witamy w PPCG! W ogóle nie znam F #, po prostu usunąłem rzeczy, aby zobaczyć, co się stanie :)
Pan Xcoder
1

Mathematica, 134 bajty

""<>{(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
źródło
1

Java 8, 89 bajtów

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

Zakłada import static java.util.stream.Collectors.*;

Anthony Garcia
źródło
1

q / kdb +, 48 bajtów

Rozwiązanie:

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

Przykłady:

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"

Wyjaśnienie:

Dość prosto, weź ciąg wejściowy, rzutuj na wartości ASCII, utwórz listę 1 lub 0 w zależności od tego, czy jest nieparzysta, czy parzysta (wskazówka A = 65 = nieparzysta), a następnie użyj tej listy, aby zindeksować do listy fizzi buzz. Rzuć to na ciąg, a następnie w przypadkach, gdy dane wejściowe wynoszą <91 (mniej niż Z), stosujemy upperfunkcję, aby uzyskać a FIZZlub a BUZZ.

q jest interpretowane od prawej do lewej:

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
źródło
Nie znam tego języka, ale czy możesz usunąć odstęp między modi 2?
Pan Xcoder
Niestety nie, można to napisać tak mod[x;2], jakbyśmy nie chcieli żadnych białych znaków - ale kończy się to o 1 bajt więcej!
streetster
1

Swift 4 , 144 135 bajtów

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

Bez golfa:

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

To, co robię, polega na zapętlaniu każdego znaku w ciągu. Konwertuję każdy na jego wartość ASCII, następnie sprawdzam, czy jest parzysty czy nieparzysty, a następnie sprawdzam, czy jest to duża czy mała litera, i wypisuję pasującą wartość z pętli. Następnie łączę wszystkie elementy wynikowej tablicy w jeden ciąg i drukuję go.

To rozwiązanie wykorzystuje Swift 4, więc nie ma jeszcze możliwości łatwego przetestowania go online.

Dzięki @ Mr.Xcoder za uratowanie mnie 9 bajtów!

Caleb Kleveter
źródło
error: value of type 'String' has no member 'map', ponieważ ciąg nie jest automatycznie konwertowany na listę w środowisku wykonawczym.
Pan Xcoder
Ponadto ta usługa nie jest bezpłatna. Musisz dodać kartę kredytową, aby przetestować swoje zgłoszenie, jeśli go nie wkleję. Rozważ zmianę usługi testowej.
Pan Xcoder
Aby to zadziałało, musisz go przekształcić w$0.characters.map{...}
pana Xcodera
@ Mr.Xcoder Cloud 9 ma darmową warstwę, w której otrzymujesz tylko jeden prywatny obszar roboczy i nieograniczoną liczbę publicznych obszarów roboczych. Powinieneś być w stanie zalogować się przez GitHub. Nigdy się z tym nie dzieliłem, więc nie byłem pewien, czy to zadziała. Powinienem też wspomnieć, że używam Swift 4, gdzie String jest zgodny z Collection. Oznacza to, że ma funkcję mapy.
Caleb Kleveter
1
Jak widzę, stara deklaracja funkcji jest nadal ważna w Swift 4, na przykład func f(s:String){...}dlatego możesz zapisać 9 bajtów, używając następującego kodu, który używa printzamiast return: pastebin.com/06kiiGaJ . Jeśli to nie zadziała, daj mi znać.
Pan Xcoder,
1

R, 150 123 108 bajtów

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

Musi być krótszy przy użyciu ASCII? To było krótsze. Zobacz historię edycji starej odpowiedzi, która była używana letters.

Sprawdza każdą literę pod kątem (1), czy jest >91to duża, fizzczy nie ( ) i czy jest to a czy buzz.

BLT
źródło
-3

Jawa

str.chars().forEach(ch ->{
    if(ch >= 97)
        strb.append(ch % 2 == 0 ? "fizz" : "buzz");
    else
        strb.append(ch % 2 == 0 ? "FIZZ" : "BUZZ");
});
shwetha
źródło
6
Cześć! Witamy w PPCG! Jesteśmy społecznością golfistów, więc staramy się zdjąć jak najwięcej bajtów - obejmuje to bajty o zmiennych nazwach i białych znakach, które można usunąć z odpowiedzi. Ponadto zgłoszenia muszą być pełnym programem (w tym podobnym do szablonu public static void main) lub funkcją. Obecnie twój jest fragmentem kodu.
Stephen