文字列のFizz-Buzzify


21

小文字と大文字の両方の英字(ASCII 65-90および97-122)の文字のみを含む文字列が与えられます。あなたの仕事は、文字列のFizz-Buzzifiedバージョンを出力することです。

文字列をFizz-Buzzifyする方法は?

  • 英語のアルファベットに偶数のインデックスがあるアルファベット(アルファベット 1から始まる必要あります:)は、小文字の場合と大文字の場合()a->1,b->2,...,z->26に変換されます。fizzFIZZf -> fizz, F -> FIZZ

  • 英語のアルファベットに奇数のインデックスがある各文字は、buzz小文字のBUZZ場合と大文字の場合(e -> buzz, E -> BUZZ)に変換されます。

  • 文字列CodeGolf(わかりやすくするためにスペースを追加)を使用して、アルゴリズムを説明する例を示します。

    "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)
    
  • あなたの言語にとってより便利な場合は、グループ間に単一のスペースを残すこともできます(fizz, buzz, FIZZ, BUZZ)。したがって、のような結果fizzBUZZbuzzbuzzもとして返すことができfizz BUZZ buzz buzzます。他の区切り文字は使用できません。


テストケース:

入力->出力 

「卵」->「バズバズバズ」
「CodeGolf」->「BUZZbuzzfizzbuzzBUZZbuzzfizzfizz」
「リセット」->「FIZZbuzzbuzzbuzzfizz」
「ATOM」->「BUZZFIZZBUZZBUZZ」
"yOuArEgReAt"-> "buzzBUZZbuzzBUZZfizzBUZZbuzzFIZZbuzzBUZZfizz"

  • I / Oの標準的な方法を使用できます。

  • デフォルトの抜け穴が適用されます。

  • 言語のネイティブString型でのみ入力を許可されます。出力にも同じことが当てはまります。

  • 入力は空ではないと想定できます。

  • すべての言語のバイト単位の最短コードが優先されます。幸運とフィズバズ!


回答:


7

26 24バイト

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

オンラインでお試しください!もともと@CarlosAlejoに触発されました。編集:一時的なものに割り当てる代わりに、fizz / buzzの文字をループして2バイトを保存しました。説明:

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

私はついにあなたの解決策を理解しました。元の文字列のchar Ordinal(i)の位置を返すと思っiたが、ASCII値(文字コード)を返します。非常に賢い解決策、私はまだ炭のスキルを大幅に向上させる必要があります!
チャーリー

たった24バイトで炭でこれを行う方法...
エリックアウトゴルファー

この24バイトはどのエンコーディングにありますか?
ルスラン

@Ruslan In Charcoalのカスタムコードページ
ニール

6

C#、92バイト

using System.Linq;a=>string.Concat(a.Select(x=>x%2<1?x<97?"FIZZ":"fizz":x<97?"BUZZ":"buzz"))

ほぼ同時に投稿されましたが、3進法をより短い方法で注文することで私のソリューションに1バイトを節約しました+1
TheLethalCoder

@TheLethalCoderああ、ごめんなさい。
-LiefdeWen

12秒間隔で投稿したことについて、申し訳ありません。そして、あなたのものはより短いです!
TheLethalCoder

C#x%2では、<1部品を必要とせずにブール値として直接使用できますか?その場合、そのようにいくつかのバイトを保存できる場合があります。
ブライアンJ

@BrianJいいえ、暗黙的には行いません
-LiefdeWen



4

JAVA(OpenJDKの8) 105の 100 94 91 90バイト

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

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

ゴルファーが多く、バイトが多いので、Java!

@KevinCruijssenによる9バイトの非常にゴルフ!


ストリームがこれを短くするのではないかと思ったので、書きました。s->s.join("",s.chars().mapToObj(i->i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ").toArray(String[]::new));ああ、それは長い105文字です:(彼らだけが追加できた場合はjoin、ストリーム上で直接にまたは統合しtoList、実際には、賢明なものが良いでしょう。
オリヴィエ・グレゴワール

1
代わりに、文字列を返す直接印刷する6バイト短く、使用getBytes()代わりにはtoCharArray()、追加の3バイト短くなる:s->{for(int i:s.getBytes())System.out.print(i>90?i%2<1?"fizz":"buzz":i%2<1?"FIZZ":"BUZZ");}
ケビンCruijssen

に変更toCharArray()して、追加の3バイトを忘れましたgetBytes()。:)
ケビンクルーッセン

1
XD)また、私はちょうどそれについて考え、あなたのコメントを見る前に、私はあなたの編集の前にクリックして、後でそれを見ていない
オリヴィエ・グレゴワールを

3

JavaScript(ES6)、79 77バイト

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

テストケース


3

C#、97バイト

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

私はC#を知らないが、あなたは使用することはできませんc%2>1?c>96?"fizz":"buzz":...
氏Xcoder



3

平易な英語820 632 610のバイト

Xcoder氏は、22バイトを節約する不要なエラートラップを排除することを提案しました。

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.

未ゴルフコード:

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はgithub.com/Folds/englishで入手できます。IDEはWindows上で実行されます。32ビットx86コードにコンパイルします。


1
「入力が空でないと仮定できます。」私はあなたがドロップすることができると思いますIf the s is "", exit.
氏Xcoder

@ Mr.Xcoder-ありがとう。sが空であっても、トラップは不要であることがわかりました。
ジャスパー

2

40 36バイト

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

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

説明:

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"

同じバイト数の代替:

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

オンラインでお試しください!詳細バージョン

  • Neilのおかげで4バイト節約!

1
代わりにCountまたはを使用して、いくつかのバイトを節約します。OrdinalFind
ニール

全体ifは単一のステートメントとしてカウントされるため、{}s は必要ありません。また、Uppercase内部を移動してバイトを保存しましたTernaryオンラインで試してみてください!
ニール

さらに良いことにFθ«A⎇﹪℅ι²buzz¦fizzχ⎇№αι↥χχ、26バイトです。(Deverbosifierはこのバージョンが好きではありません。)
ニール

@Neilありがとう あなたがあなた自身の投稿を書いた場合、私はあなたに打ち負かされたことを光栄に思います。:
チャーリー

2

> <>、68バイト

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

オンライン試してみるか、魚の遊び場で見てください

(しかし、13バイト短いアーロンの答えを見てください!)

> <>に慣れていない場合は、2Dでコードを泳ぐ魚がいて、端が折り返されています。シンボルは><^およびv魚の向きを設定し、/そして\それを反映したミラーである、と?手段は「スタックの先頭のものがゼロでない場合、次の命令を行うそうでない場合は、次の命令を飛び越えます」。

最初の行では、魚は入力の文字(i)を取ります。EOFが-1の場合、停止(:0(?;); charcode mod 2(:2%$)を取得します。また、文字コードが「^」の文字コードよりも小さいか大きいかに応じて、スタックに1または0をプッシュします("^"()。次の3行は魚を正しいフィズ/バズ文字列にリダイレクトし、最後の行はそれを印刷して(o各文字に1つ)、魚を先頭に送り返します。


@アーロン、それは素晴らしい!私はその考えを考えましたが、それを機能させることができませんでした。独自のソリューションとして投稿しますか?
木ではない

@Aaronが、あなたはまた、TIOかのどちらかのバグを見つけたオンライン通訳 -そのインタプリタで、!または?スペースが続くだけ...スペースをスキップしますが、TIOはスキップするように次の非スペースの事まで待機
未木

@Aaron、あなたの提出物は私のものよりもはるかに良いので、あなたは自分でそれを投稿することができます、そして私はこれを削除します。
ツリーではない

!スキップスペース私の知る限り必要がありますが、オンラインの通訳は、おそらくあなたはしているが見ているものを、スペース、とのコードスペースをパッド
アーロン


2

> <>、55バイト

木の答えではないことに基づいています

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

コードで4つの可能な出力を表すのではなく、大文字のバージョンのみを表し、32を文字コードに追加して、小文字の同等の文字を取得します。

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

空のセルでコードスペースを埋めるオンラインインタープリターの修正コード:

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

2

Perl5、50 + 1バイト

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

ASCII文字を適切なコードワードにマッピングする128項目のリストを作成します。


1

05AB1E、22バイト

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

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

説明

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

代替22バイトソリューション

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


1

F#154 153 145バイト

@Mrのおかげで1 9バイト節約されました。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""

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


間にスペースを除去することにより、1つのバイトを保存concatし、""最後の行に
氏Xcoder


145バイト、不要な空白削除
氏Xcoder

ありがとう@ Mr.Xcoder私はまだF#に慣れており、インデントが重要なときです!

1
ところで、PPCGへようこそ!私はF#をまったく知りません。何が起こるかを見るために何かを削除しました:)
Mr Xcoder

1

Mathematica、134バイト

""<>{(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バイト

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

想定しています import static java.util.stream.Collectors.*;


1

q / kdb +、48バイト

溶液:

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

例:

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"

説明:

入力文字列を取得し、ASCII値にキャストし、奇数または偶数(ヒントA = 65 = odd)に応じて1または0のリストを作成し、このリストを使用してfizzandのリストにインデックスを付けますbuzz。これを文字列にキャストし、入力が<91(Zより低い)の場合、upper関数を適用してa FIZZまたはa を取得しBUZZます。

qは右から左に解釈されます。

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

この言語はわかりませんが、modとの間のスペースを削除できます2か?
ミスターXcoder

残念ながら、空白が不要であるかのように記述することはできますmod[x;2]が、最終的には1バイト多くなります!
ストリートスター


1

スイフト4144の 135バイト

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

ゴルフをしていない:

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

私がやっていることは、文字列の各文字をループすることです。それぞれをASCII値に変換してから、偶数か奇数かを確認し、大文字か小文字かを確認して、一致する値をループから出力します。次に、結果の配列のすべての要素を1つの文字列に結合して出力します。

このソリューションではSwift 4を使用しているため、オンラインで簡単にテストする方法はまだありません。

9バイト節約してくれた@ Mr.Xcoderに感謝します!


error: value of type 'String' has no member 'map'、実行時に文字列がリストに自動的に変換されないため。
ミスターXcoder

また、そのサービスは無料ではありません。コピーアンドペーストしない場合は、提出物をテストするためにクレジットカードを追加する必要があります。テストサービスの変更を検討してください。
ミスターXcoder

それを動作させるためには、あなたがにそれを有効にする必要があります$0.characters.map{...}
ミスターXcoder

@ Mr.Xcoder Cloud 9には無料の階層があり、1つのプライベートワークスペースと無制限のパブリックワークスペースのみを取得できます。GitHubからサインインできるはずです。私はそれを何も共有したことがないので、それが機能するかどうかはわかりませんでした。また、StringがCollectionに準拠しているSwift 4を使用していることを述べたはずです。これは、マップ機能があることを意味します。
カレブKleveter

1
私が見ることができるように、古い関数宣言はSwift 4でもまだ有効ですfunc f(s:String){...}。したがって、pastebin.com / 06kiiGaJのprint代わりに使用する次のコードを使用して9バイトを節約できます。うまくいかない場合はお知らせください。return
ミスターXcoder

1

R、150の 123 108バイト

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

ASCIIを使用して短くする必要がありますか?短かった。を使用した古い回答の編集履歴を参照してくださいletters

(1)大文字であるかどうか(>91)およびa fizzまたはaであるかどうか、各文字をチェックしますbuzz


-3

Java

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

6
こんにちは!PPCGへようこそ!私たちはゴルフコミュニティなので、できるだけ多くのバイトを削除しようとします。これには、変数名と空白からなるバイトが含まれます。これらは回答から削除できます。さらに、提出は完全なプログラム(のような定型文を含むpublic static void main)または機能でなければなりません。現在、あなたのものはスニペットです。
スティーブン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.