A, Buzz, C, D, E, Fizz, G

14

FizzBuzz sederhana menggunakan string.

Diberikan

  • 1 kata atau frasa (string)
  • 2 karakter unik

Keluaran

Kata atau frasa dengan setiap kemunculan karakter pertama diganti dengan fiz dan masing-masing karakter kedua diganti dengan buzz

Aturan

  • Huruf pertama dalam Fizz dan Buzz harus tetap menggunakan huruf kapital
  • Untuk sisa kata fizz dan buzz, Anda harus mencocokkan case karakter yang diganti (jika tidak ada case maka tetap menggunakan huruf kecil)
  • Jika karakter yang diberikan tidak ada dalam frasa, keluarkan frasa asli

Uji Kasus

Given: Hello, h, l
Output: FIZZeBuzzBuzzo

Given: test, a, b
Output: test

Given: PCG rocks!,  , !
PCGFizzrocksBuzz

Given: This
Is
SPARTA!, 
, S
Output: ThiBuzzFizzIBuzzFizzBUZZPARTA!

Given: FizzBuzz, a, b
Output: FizzBUZZuzz

Ini adalah kode-golf sehingga kode terpendek, dalam byte, menang!

Catatan

Secara teknis menangani kasus baris baru (Ini Apakah SPARTA!) Adalah bagian dari tantangan. Namun, saya tidak akan membatalkan jawaban karena tidak memasukkannya, karena sangat menantang atau bahkan tidak mungkin dalam beberapa bahasa.

GracefulLemming
sumber
2
you must match the case of the replaced characterdan Input is not case sensitivetampaknya saling bertentangan.
Greg Martin
@GregMartin ah terima kasih, saya mencoba mengatakan bahwa 2 karakter sebagai input peka huruf besar-kecil (mis. A artinya sama dengan a)
GracefulLemming
1
ThiBuzzFizzIBuzzFizzBUZZPARTAhilang tanda seru terakhir.
Arnauld
Apakah kita seharusnya mendukung input seperti aa, a, f? Apa yang akan menjadi output yang diharapkan? BUZZizzBUZZizz,, FizzFizzatau keduanya diizinkan menurut opsi kami?
Arnauld
@ Amuld Berdasarkan pada test case terakhir, saya akan mengatakan itu harus di-output FizzFizz.
Dana Gugatan Monica

Jawaban:

2

Jelly , 34 byte

Œl=€⁹Œl¤ȧ€"“¡Ṭ4“Ụp»o"/ȯ"Œu⁹Œln$T¤¦

Cobalah online!

Bagaimana?

Œl=€⁹Œl¤ȧ€"“¡Ṭ4“Ụp»o"/ȯ"Œu⁹Œln$T¤¦ - Main link: characters, string
Œl                                 - lowercase the characters
       ¤                           - nilad followed by link(s) as a nilad:
    ⁹                              -     right argument, the string
     Œl                            -     lowercase
  =€                               - equals (vectorises) for €ach (a list of 2 lists that identify the indexes of the string matching the characters regardless of case)
           “¡Ṭ4“Ụp»                - dictionary strings ["Fizz", "Buzz"]
          "                        - zip with
        ȧ€                         -     logical and (non-vectorising) for €ach (replace the 1s with the words)
                     /             - reduce with:
                    "              -     zip with:
                   o               -         logical or (vectorises) (make one list of zeros and the words)
                                   - implicit right argument, string
                       "           - zip with:
                      ȯ            -     logical or (non-vectorising) (replace the zeros with the original characters from the string)
                                 ¦ - apply...
                        Œu         -     uppercase
                                   - ...to the indexes (the words at indexes):
                                ¤  -     nilad followed by link(s) as a nilad:
                          ⁹        -         right argument, the string
                              $    -         last two links as a monad (i.e. the string on both sides):
                           Œl      -             lowercase
                             n     -             not equals (vectorises)
                               T   -         truthy indexes (the indexes of the capital letters in the string)
Jonathan Allan
sumber
+1, Terima kasih telah menggunakan kasing baris baru. Itu menjadikan ini pengajuan pertama yang sepenuhnya benar
GracefulLemming
6

Python 3 , 180 174 168 160 152 byte

from sys import*
J=''.join
L=str.lower
s,a,b=J(stdin).split(', ')
print(J('FBFBiuIUzzZZzzZZ'[L(k)==L(b)::2][k!=L(k)::2]*(L(k)in L(a+b))or k for k in s))

Ini hanya versi yang lebih golf dari jawaban Stephen , dalam Python 3. Chip ini menghilangkan 42% dari byte-nya. Python 2 akan menghemat satu byte pada cetakan, tetapi harga kemajuan seperti itu. Ini menangani baris baru dengan benar.

Terima kasih kepada Blckknight untuk menghemat 8 byte pada input.

Ben Frankel
sumber
1
Untuk apa fileinputmodul itu digunakan?
caird coinheringaahing
@ValyrioAccount, fileinput.input mengabaikan metode input bawaan . Ini memungkinkan input dengan baris baru.
Ben Frankel
2
Bagaimana dengan from sys import*dan s,a,b=J(stdin).split(', ')untuk menyimpan beberapa karakter?
Blckknght
4

Python, 109 byte

lambda s,w:"".join([c,"Fizz","Buzz","BUZZ","FIZZ"][-~w.lower().find(c.lower())*-~(-2*c.isupper())]for c in s)

Cobalah online!


Mengambil dua karakter sebagai string tunggal

Sunting: Menambahkan testcase ke tautan TIO, baris baru juga berfungsi

ovs
sumber
2

Python 2 , 271 , 261 byte

import fileinput as f
a=''
for m in f.input():a+=m
a=a.split(', ')
l=L=list(a[0])
for i in range(0,len(a[0])):
 j,k=l[i].lower(),l[i].istitle()
 if j==a[1].lower():
  L[i]='FIZZ'if k else'Fizz'
 elif j==a[2].lower():
  L[i]='BUZZ'if k else'Buzz'
print''.join(L)

Cobalah online!

Wow yang satu ini doozie! Ternyata python tidak akan menerima input multi-line jadifileinput harus digunakan.

edit: harus lulus semua kasus sekarang :)

Stephen
sumber
Pasti memberi +1 untuk menangani kasing dengan baris baru! Tidak banyak yang bisa memasukkan itu
GracefulLemming
Anda bisa menghemat 3 byte dengan melakukan sesuatu seperti import fileinput as f...for m in f.input():
GracefulLemming
@ Caleb Terima kasih atas sarannya! itu harus lulus semua tes sekarang
Stephen
2

MATLAB / Oktaf , 106 102 111 byte

@(a,b,c)regexprep(a,num2cell([lower([b c]) upper([b c]) '1234']),{'2','4','1','3','FIZZ','Fizz','BUZZ','Buzz'})

Ini mungkin dapat dioptimalkan lebih lanjut.

Ini menggunakan pengganti Regex sederhana. Namun langkah lanjutan diperlukan dengan mengganti karakter input dengan angka terlebih dahulu. Hal ini dimaksudkan agar jika input kedua menggantikan surat terkandung dalam FizzbahwaFizz tidak maka bisa diganti ketika regex berikutnya dilakukan.

Ini tentu saja mengasumsikan tidak ada angka dalam input. Namun mengingat pertanyaan mengatakan input adalah kata atau frasa saya merasa bahwa ini adalah asumsi yang dapat diterima.

Kode akan menangani baris baru di input dengan benar.

Anda dapat mencobanya secara online!

Tom Carpenter
sumber
2

Bash 4.4 + GNU sed, 70 228 222 227 byte

IFS=;alias e=echo;K=`sed $([[ $2 != '
' ]]&&e "s/${2,}/Fizz/g;s/${2^}/FIZZ/g"||:)$([[ $3 != '
' ]]&&e ";s/${3,}/Buzz/g;s/${3^}/BUZZ/g"||:)<<<"$1"`;[[ $2 = '
'||$3 = '
' ]]&&e ${K//$'\n'/`[[ $2 = '
' ]]&&e Fizz||e Buzz`}||e "$K"

Tampaknya alias e=echo melempar kesalahan jika dirujuk dalam Bash 4.3 atau di bawah, versi TIO tampaknya menggunakan. Oleh karena itu, kode Bash 4.3 yang lebih panjang dan setara diberikan dalam rangkaian uji TIO di bawah ini untuk kepentingan pengujian. Ini melewati semua kasus uji, jadi itu bagus.

Cobalah online!

R. Kap
sumber
@thedarkwanderer Sekarang seharusnya. Maaf butuh waktu agak lama untuk memperbaikinya.
R. Kap
2

JavaScript (ES6), 92 byte

Mengambil input sebagai string dan array dua karakter. Mendukung baris baru.

f=(s,[a,b],r='Fizz')=>a?f(s.replace(RegExp(a,'gi'),m=>m<'a'?r.toUpperCase():r),[b],'Buzz'):s

Uji kasus

Arnauld
sumber
1

Pyth - 25 byte

sXzsrBQ1scL2rB"FizzBuzz"1

Test Suite .

Maltysen
sumber
2
Huruf kapital sebagai salah satu karakter tampaknya menyebabkan masalah - "Hl", Hellotidak menggunakan huruf kapital dengan benar dan "hL", Hellotidak menggantikan huruf ls.
Jonathan Allan
1

GNU sed , 135 +1 (r flag) = 136 byte

Secara default, skrip sed dijalankan sebanyak yang ada baris input. Untuk menangani input multi-line, saya menggunakan loop untuk menambahkan semua kemungkinan baris yang tersisa ke yang pertama, tanpa memulai siklus baru.

:r
$!N
$!br
s:, (.), (.):;\u\1FIZZ;\l\1Fizz;\u\2BUZZ;\l\2Buzz:
s:^:,:
:
s:,(.)(.*;\1)(...)(.):\3,\4\2\3\4:
s:,(.):\1,:
/,;.F/!t
s:,.*::

Cobalah online!

Tabel pengganti yang digunakan pada baris 4, harus dalam urutan yang tepat, yaitu 'Fizz' dan 'Buzz' setelah bentuk huruf besar. Ini karena regex sed .*, yang digunakan selama pencarian tabel, serakah. Jika karakter saat ini yang perlu diganti bukan huruf (tidak ada huruf), maka string huruf kecil diperlukan (cocok terakhir).

Karena sed tidak memiliki tipe data, saya menggunakan pembatas karakter untuk beralih string. Ini akan menandai posisi saya saat ini dan dalam satu lingkaran saya menggesernya dari kiri ke kanan. Untungnya, saya dapat menggunakan ,ini, karena ini adalah pembatas data input.

Penjelasan:

:r                                                 # reading loop
$!N                                                # append next input line
$!br                                               # repeat till EOF
s:, (.), (.):;\u\1FIZZ;\l\1Fizz;\u\2BUZZ;\l\2Buzz: # create replacement table
s:^:,:                                             # append my string delimiter
:                                                  # main loop
s:,(.)(.*;\1)(...)(.):\3,\4\2\3\4:                 # apply char replacement, if any
s:,(.):\1,:                                        # shift delimiter to right
/,;.F/!t                                           # repeat till end of string
s:,.*::                                            # print only the final string
seshoumara
sumber
0

Haskell, 114 byte

u=Data.Char.toUpper
p[f,b]x|f==u x="Fizz"|b==u x="Buzz"|2>1=[x]
q x y|u y<y=x|2>1=u<$>x
r x=concatMap$q=<<p(u<$>x)

rmengambil karakter desis dan buzz sebagai daftar elemen 2 sebagai argumen pertama, dan string input sebagai argumen kedua. Baris baru dan unicode harus ditangani dengan tepat, meskipun fungsi sayangnya tidak total (memungkinkan input yang tidak valid disimpan 5 byte).

Nick Hansen
sumber
u=Data.Char.toUpperhanya bekerja dalam ghci sejauh yang saya tahu. Di Haskell standar, Anda memerlukan import. Namun Anda harus dapat menyimpan beberapa byte dengan menggunakan =<<alih-alih concatMap.
Laikoni
0

Mathematica, 94 byte

a=ToLowerCase;b=ToUpperCase;StringReplace@{a@#->"Fizz",b@#->"FIZZ",a@#2->"Buzz",b@#2->"BUZZ"}&

Fungsi anonim. Mengambil dua string sebagai input dan mengembalikan fungsi yang mengambil string sebagai input dan mengembalikan string sebagai output sebagai output. Itu harus dipanggil dalam format prog["c1", "c2"]["s"], di mana "s"string target dan "c1"dan "c2"adalah dua karakter. Mungkin bisa bermain golf lebih lanjut.

LegionMammal978
sumber