A、バズ、C、D、E、フィズ、G


14

文字列を使用した単純なFizzBu​​zz。

与えられた

  • 1単語またはフレーズ(文字列)
  • 2つのユニークなキャラクター

出力

最初の文字が出現するたびにfizzに置き換えられ、2番目の文字がそれぞれバズに置き換えられた単語またはフレーズ

ルール

  • フィズとバズの両方の最初の文字は大文字のままにしてください
  • 残りの単語fizzとbuzzについては、置き換えられた文字の大文字と小文字を一致させる必要があります(大文字と小文字を区別しない場合は小文字のままにしてください)
  • 指定した文字がフレーズに含まれていない場合は、元のフレーズを出力します

テストケース

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

これはコードゴルフなので、バイト単位の最短コードが勝ちです!

注意

改行のケース(これはSPARTA!)の技術的な処理は、課題の一部です。ただし、一部の言語では非常に困難または不可能であるため、これを含めないことに対する回答を無効にしません。


2
you must match the case of the replaced characterそしてInput is not case sensitive互いに矛盾しているようです。
グレッグマーティン

ああ@GregMartin私は、入力として2つの文字は大文字と小文字を区別することを言おうとした、ありがとうございました(例Aと同じ意味。)
GracefulLemming

1
ThiBuzzFizzIBuzzFizzBUZZPARTA最後の感嘆符がありません。
アーナルド

などの入力をサポートすることになっていaa, a, fますか?予想される出力はどうなりますか?BUZZizzBUZZizzFizzFizzまたはその両方当社の選択で許可されていますか?
アーナルド

@Amauld最後のテストケースに基づいて、私はそれが出力されるべきだと思いますFizzFizz
ファンドモニカの訴訟

回答:


2

ゼリー、34 バイト

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

オンラインでお試しください!

どうやって?

Œ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)

+1、改行を使用していただきありがとうございます。この最初の完全に正しい服従作ること
GracefulLemming

6

Pythonの3180の 174 168 160 152バイト

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

これは、Python 3のStephenの答えをよりゴルフ版にしたものです。これにより、バイト数の42%が削減されます。Python 2は印刷で1バイト節約しますが、それは進歩の代償です。これにより、改行が適切に処理されます。

入力時に8バイトを保存してくれたBlckknightに感謝します。


1
fileinput使用されるモジュールは何ですか?
ケアニコインヘリンガー

@ ValyrioAccount、fileinput.inputは組み込みのインプットメソッドをオーバーライドします。改行を使用した入力が可能になります。
ベンフランケル

2
どの程度from sys import*s,a,b=J(stdin).split(', ')数文字を保存しますか?
Blckknght

4

Python、109バイト

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

オンラインでお試しください!


2つの文字を単一の文字列として受け取ります

編集:TIOリンクにテストケースを追加、改行も機能


2

パイソン2271、261のバイト

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)

オンラインでお試しください!

うわー、これはドゥージーでした!pythonは複数行の入力を受け付けないためfileinput、使用する必要があります。

編集:今すぐすべてのケースを渡す必要があります:)


改行でケースを処理するための明確な+1!多くは、その組み込むことができるわけではありません
GracefulLemming

次のようなことを行うことで3バイトを節約できますimport fileinput as ffor m in f.input():
GracefulLemming

@Caleb提案をありがとう!これですべてのテストに合格するはずです
スティーブン

2

MATLAB / オクターブ106の 102 111バイト

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

これはおそらくさらに最適化できます。

単純な正規表現の置換を使用します。ただし、最初に入力文字を数字に置き換える中間ステップが必要です。これは、2番目の入力置換文字が含まれFizzている場合Fizz場合、次の正規表現が実行されたときに置換されないようにするためです。

もちろん、これは入力に数字がないことを前提としています。しかし、入力が単語またはフレーズであるという質問を考えると、これは許容できる仮定であると感じています。

コードは、入力の新しい行を正しく処理します。

オンラインで試すことができます!


2

Bash 4.4 + GNU sed、70 228 222 227バイト

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"

どうやらalias e=echoバッシュ4.3以下、TIOが明らかに使用されているバージョンで参照場合はエラーをスローします。したがって、テストのために、より長く同等のBash 4.3コードが以下のTIOテストスイートに示されています。これはすべてのテストケースに合格するため、これは素晴らしいことです。

オンラインでお試しください!


@thedarkwanderer今ではそうすべきです。修正に少し時間がかかって申し訳ありません。
R.ガプス

2

JavaScript(ES6)、92バイト

入力を文字列と2文字の配列として受け取ります。改行をサポートします。

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

テストケース



1

GNU sed、135 + 1(rフラグ)= 136バイト

デフォルトでは、sedスクリプトは入力行と同じ回数だけ実行されます。複数行の入力を処理するには、ループを使用して、新しいサイクルを開始せずに、可能な残りのすべての行を最初に追加します。

: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:,.*::

オンラインでお試しください!

4行目で使用される置換テーブルは、その正確な順序、つまり大文字形式の後の「Fizz」と「Buzz」である必要があります。これは、sed regexが.*、テーブル検索中に使用されるが貪欲であるためです。置換する必要がある現在の文字が文字(大文字と小文字なし)でない場合、小文字の文字列が必要です(最後に一致)。

sedにはデータ型がないため、文字区切り文字を使用して文字列を繰り返します。現在の位置をマークし、ループで左から右にシフトします。幸いなことに、,これは入力データの区切り文字なので、これに使用できます。

説明:

: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

0

Haskell、114バイト

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)

r最初の引数として2要素リストとしてフィズ文字とバズ文字を取り、2番目の引数として入力文字列を取ります。改行とユニコードは適切に処理する必要がありますが、残念ながら関数は合計ではありません(無効な入力を5バイト保存できます)。


u=Data.Char.toUpper私の知る限り、ghciでのみ動作します。標準のHaskellでは、importです。ただし、の=<<代わりにを使用して、いくつかのバイトを保存できるはずですconcatMap
ライコニ

0

Mathematica、94バイト

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

無名関数。入力として2つの文字列を取り、入力として文字列を取り、出力として文字列を返す関数を返します。これは、形式prog["c1", "c2"]["s"]で呼び出す必要があります。ここ"s"ではターゲット文字列であり"c1""c2"は2文字です。おそらくさらにゴルフすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.