Fizz-Buzzify a String


21

Anda akan diberikan sebuah String yang hanya berisi huruf-huruf dari Alfabet Bahasa Inggris, baik huruf kecil dan besar (ASCII 65-90 dan 97-122). Tugas Anda adalah menampilkan versi String Fizz-Buzzified.

Bagaimana Fizz-Buzzify a String?

  • Setiap huruf yang memiliki indeks genap dalam alfabet bahasa Inggris (alfabet harus 1-diindeks:) a->1,b->2,...,z->26akan berubah menjadi fizzjika huruf kecil dan FIZZjika huruf besar ( f -> fizz, F -> FIZZ).

  • Setiap huruf yang memiliki indeks ganjil dalam alfabet bahasa Inggris akan berubah menjadi buzzjika huruf kecil, dan BUZZjika huruf besar ( e -> buzz, E -> BUZZ).

  • Mari kita punya contoh, untuk menggambarkan algoritma, menggunakan string CodeGolf(spasi ditambahkan untuk kejelasan):

    "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)
    
  • Jika lebih nyaman untuk bahasa Anda, Anda juga dapat meninggalkan satu spasi di antara grup ( fizz, buzz, FIZZ, BUZZ). Karenanya, hasil seperti fizzBUZZbuzzbuzzjuga dapat dikembalikan sebagai fizz BUZZ buzz buzz. Pemisah lainnya tidak diperbolehkan.


Kasus uji:

Input -> Output 

"egg" -> "buzzbuzzbuzz"
"CodeGolf" -> "BUZZbuzzfizzbuzzBUZZbuzzfizzfizz"
"Setel Ulang" -> "FIZZbuzzbuzzbuzzfizz"
"ATOM" -> "BUZZFIZZBUZZBUZZ"
"yOuArEgReAt" -> "buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz"

  • Metode standar apa pun untuk I / O dapat digunakan.

  • Berlaku celah default .

  • Anda hanya diperbolehkan mengambil input dalam tipe String asli bahasa Anda. Hal yang sama berlaku untuk output.

  • Anda dapat mengasumsikan bahwa input tidak akan kosong.

  • Kode terpendek dalam byte di setiap bahasa akan menang. Good Luck dan Fizz-Buzz!


Jawaban:


7

Arang , 26 24 byte

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

Cobalah online! Awalnya terinspirasi oleh @CarlosAlejo. Sunting: Disimpan 2 byte dengan mengulangi huruf fiz / buzz alih-alih menetapkan sementara. Penjelasan:

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

Saya akhirnya harus memahami solusi Anda. Saya pikir itu Ordinal(i)mengembalikan posisi ichar dalam string aslinya, tetapi mengembalikan nilai ASCII (kode karakter). Solusi yang sangat cerdas, saya masih perlu meningkatkan banyak keterampilan Arang saya!
Charlie

Bagaimana Anda melakukan ini di Charcoal hanya dalam 24 byte ...
Erik the Outgolfer

Di mana pengkodean ini 24 byte?
Ruslan

@Ruslan Di halaman kode khusus 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"))

Diposting pada waktu yang hampir bersamaan tetapi Anda menyimpan satu byte ke solusi saya dengan memesan ternary dengan cara yang lebih pendek +1
TheLethalCoder

@TheLethalCoder ahh, maaf soal itu.
LiefdeWen

Tidak ada yang menyesal tentang kami memposting terpisah 12 detik! Dan milikmu lebih pendek!
TheLethalCoder

Akankah C # membiarkan Anda menggunakan x%2secara langsung sebagai boolean, tanpa perlu <1bagian? Jika demikian, Anda mungkin dapat menyimpan beberapa byte dengan cara itu.
Brian J

@BrianJ Tidak itu tidak melakukannya secara implisit
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");}

Cobalah online!

Banyak golf, sangat byte, jadi Java!

Sangat golf oleh @KevinCruijssen oleh 9 byte!


Saya pikir mungkin stream akan membuat ini lebih pendek, jadi saya menulis satu. s->s.join("",s.chars().mapToObj(i->i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ").toArray(String[]::new));Sayangnya, panjangnya 105 karakter :( Kalau saja mereka bisa menambahkan joinlangsung di sungai atau mengintegrasikan toList, sebenarnya, apa pun yang masuk akal akan baik.
Olivier Grégoire

1
Mencetak secara langsung alih-alih mengembalikan sebuah String lebih pendek 6 byte, dan getBytes()alih-alih menggunakan toCharArray()adalah tambahan 3 byte lebih pendek:s->{for(int i:s.getBytes())System.out.print(i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ");}
Kevin Cruijssen

Anda lupa 3 byte tambahan dengan mengubah toCharArray()ke getBytes(). :)
Kevin Cruijssen

1
Saya mengklik sebelum edit Anda dan tidak melihatnya setelah itu;) Juga, saya hanya memikirkannya sebelum melihat komentar Anda 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'])

Uji kasus


3

C #, 97 byte

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

Saya tidak tahu C #, tetapi tidak bisakah Anda menggunakanc%2>1?c>96?"fizz":"buzz":...
Tn. Xcoder



3

Bahasa Inggris Polos , 820 632 610 byte

Tn. Xcoder menyarankan untuk menghilangkan jebakan kesalahan yang tidak dibutuhkan, yang menyelamatkan 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.

Kode tidak dikunci:

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.

Plain English IDE tersedia di github.com/Folds/english . IDE berjalan pada Windows. Ini mengkompilasi ke kode x86 32-bit.


1
"Anda dapat mengasumsikan bahwa input tidak akan kosong." jadi saya pikir Anda bisa dropIf the s is "", exit.
Tn. Xcoder

@ Mr.Xcoder - Terima kasih. Ternyata perangkap itu tidak diperlukan bahkan jika s kosong.
Jasper

2

Arang , 40 36 byte

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

Cobalah online!

Penjelasan:

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"

Alternatif dengan jumlah byte yang sama:

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

Cobalah online! ( Versi Verbose )

  • 4 byte disimpan berkat Neil!

1
Gunakan Countatau Ordinalmasing - masing alih-alih Finduntuk menghemat beberapa byte.
Neil

Seluruh ifdihitung sebagai pernyataan tunggal sehingga Anda tidak perlu {}s. Saya juga menyimpan satu byte dengan memindahkan bagian Uppercasedalam a Ternary: Cobalah online!
Neil

Lebih baik lagi, Fθ«A⎇﹪℅ι²buzz¦fizzχ⎇№αι↥χχselama 26 byte. (Deverbosifier tidak menyukai versi ini.)
Neil

@Neil Terima kasih banyak, tapi saya bahkan tidak bisa memahami versi terakhir Anda, jadi saya tidak bisa mengambil kredit untuk itu, saya akan merasa karena itu bukan jawaban saya sendiri. Saya merasa terhormat bisa dikalahkan oleh Anda jika Anda menulis posting sendiri. :-)
Charlie

2

> <> , 68 byte

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

Cobalah online , atau tonton di taman bermain ikan !

(Tapi lihat jawaban Aaron yang lebih pendek 13 byte!)

Jika Anda tidak terbiasa dengan> <>, ada ikan yang berenang melalui kode dalam 2D, dan tepi membungkus. Simbol >, <, ^dan vmengatur arah ikan, /dan \adalah cermin yang mencerminkan hal itu, dan ?berarti "melakukan instruksi berikutnya jika atas hal pada stack adalah non-nol, jika tidak melompati instruksi berikutnya".

Pada baris pertama, ikan mengambil karakter input ( i); jika -1 untuk EOF, itu berhenti ( :0(?;); ia mendapatkan charcode mod 2 ( :2%$); dan itu mendorong 1 atau 0 pada tumpukan tergantung pada apakah charcode kurang dari atau lebih besar dari charcode "^" ( "^"(). Tiga baris berikutnya mengarahkan ikan ke string fiz / buzz yang tepat, kemudian baris terakhir mencetaknya (satu ountuk setiap karakter) dan mengirimkan ikan kembali ke awal.


@ Harun, itu bagus! Saya memang memikirkan ide itu tetapi tidak berhasil. Apakah Anda ingin memposting itu sebagai solusi Anda sendiri?
Bukan pohon

@ Harun, Anda juga menemukan bug di TIO atau penerjemah online - di penerjemah itu, !atau ?diikuti oleh spasi hanya melompati ruang, tetapi TIO menunggu sampai benda non-ruang berikutnya dilewati ...
Bukan pohon

@ Harun, kiriman Anda jauh lebih baik daripada milik saya, sehingga Anda dapat mempostingnya sendiri dan saya akan menghapus yang ini.
Bukan pohon

!harus melompati spasi AFAIK, tetapi penerjemah online memberi ruang kode pada spasi, yang mungkin Anda lihat
Aaron


2

> <> , 55 byte

Berdasarkan jawaban Bukan pohon .

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

Alih-alih mewakili 4 kemungkinan output dalam kode, saya hanya mewakili versi kapitalisasi mereka dan menambahkan 32 ke kode karakter untuk mendapatkan setara kasus kecil.

Cobalah online!

Kode yang dimodifikasi untuk penerjemah online , yang mengisi ruang kode dengan sel kosong:

<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*",$_]'

Membuat daftar 128-item yang memetakan karakter ASCII ke kata kode yang tepat.


1

05AB1E , 22 byte

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

Cobalah online!

Penjelasan

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

Alternatif solusi 22 byte

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


1

F # , 154 153 145 byte

disimpan 1 9 byte berkat @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""

Cobalah online!


Hemat 1 byte dengan menghapus spasi di antara concatdan ""di baris terakhir
Tn. Xcoder


145 byte , hapus spasi yang tidak perlu
Mr. Xcoder

Terima kasih @ Mr.Xcoder saya masih terbiasa dengan F # dan ketika lekukan signifikan!

1
Dan BTW, Selamat Datang di PPCG! Saya tidak tahu F # sama sekali, hanya menghapus hal-hal untuk melihat apa yang terjadi :)
Tn. Xcoder

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

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


1

q / kdb +, 48 byte

Larutan:

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

Contoh:

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"

Penjelasan:

Cukup mudah, ambil string input, masukkan ke nilai ASCII, buat daftar 1 atau 0 tergantung apakah itu ganjil atau genap (petunjuk A = 65 = aneh), kemudian gunakan daftar ini untuk mengindeks ke dalam daftar fizzdan buzz. Keluarkan ini ke string, dan kemudian untuk kasus-kasus di mana inputnya <91 (lebih rendah dari Z) kami menerapkan upperfungsi untuk mendapatkan a FIZZatau a BUZZ.

q diartikan dari kanan ke kiri:

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

Saya tidak tahu bahasa ini, tetapi dapatkah Anda menghapus ruang antara moddan 2?
Tn. Xcoder

Sayangnya tidak, bisa dituliskan seolah- mod[x;2]olah kita tidak ingin spasi putih - tetapi yang akhirnya menjadi 1 byte lebih!
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())}

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

Apa yang saya lakukan adalah mengulang setiap karakter dalam string. Saya mengonversikan masing-masing ke nilai ASCII-nya, kemudian memeriksa untuk melihat apakah itu genap atau ganjil, dan kemudian memeriksa untuk melihat apakah itu huruf besar atau kecil dan mengeluarkan nilai yang cocok dari loop. Saya kemudian bergabung dengan semua elemen dari array yang dihasilkan menjadi satu string dan mencetaknya.

Solusi ini menggunakan Swift 4, jadi belum ada cara untuk mengujinya secara online.

Terima kasih kepada @ Mr.Xcoder karena telah menyelamatkan saya 9 byte!


error: value of type 'String' has no member 'map', karena sebuah String tidak secara otomatis dikonversi ke daftar pada saat runtime.
Tn. Xcoder

Juga, layanan itu tidak gratis. Anda harus menambahkan kartu kredit untuk menguji kiriman Anda jika saya tidak menyalinnya. Pertimbangkan untuk mengubah layanan tes.
Tn. Xcoder

Untuk membuatnya berfungsi, Anda harus mengubahnya menjadi$0.characters.map{...}
Tn. Xcoder

@ Mr.Xcoder Cloud 9 memiliki tingkat gratis, di mana Anda hanya mendapatkan satu ruang kerja pribadi dan ruang kerja publik tanpa batas. Anda harus dapat masuk melalui GitHub. Saya tidak pernah berbagi apa pun dengannya sehingga saya tidak yakin apakah itu akan berhasil. Juga, saya seharusnya menyebutkan saya menggunakan Swift 4, di mana String sesuai dengan Collection. Ini berarti ia memiliki fungsi peta.
Caleb Kleveter

1
Seperti yang saya lihat, deklarasi fungsi lama masih berlaku di Swift 4, seperti func f(s:String){...}, maka Anda dapat menyimpan 9 byte dengan menggunakan kode berikut, yang menggunakan printalih-alih return: pastebin.com/06kiiGaJ . Jika tidak berhasil, beri tahu saya.
Tn. 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')))

Harus lebih pendek menggunakan ASCII? Itu lebih pendek. Lihat edit riwayat untuk jawaban lama, yang digunakan letters.

Periksa setiap huruf untuk (1) apakah itu modal atau tidak ( >91) dan apakah itu a fizzatau a buzz.


-3

Jawa

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

6
Halo! Selamat datang di PPCG! Kami adalah komunitas golf, jadi kami mencoba melepas sebanyak mungkin byte - ini termasuk byte dalam nama variabel dan spasi putih, yang dapat dihapus dari jawaban Anda. Selain itu, kiriman harus berupa program lengkap (termasuk seperti boilerplate public static void main) atau fungsi. Saat ini, milik Anda adalah cuplikan.
Stephen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.