Zzub Zzif(リバースフィズバズ)


36

すべての数字が削除されたフィズバズ出力のスニペットが与えられた場合、フィズバズスニペットが正しいように、可能な限り低い値で正しい数字を入力します。この課題の目的のために、fizzそしてbuzzそれぞれ、3と5の彼らの通常の値を持っています。

入力がfizzbuzzおよび空の行の無効なシーケンスである場合、代わりにzzubzzif(改行の有無にかかわらず)出力します。

入力と出力は、改行で区切られた行、または言語にとって便利な文字列の配列形式である場合があります。

大文字を使用すると、無視したり、好きなことをしたりできます。

:あなたは、これらの1つ以上を処理するために選択する必要がありますfizzbuzzfizz buzzbuzz fizz、などがありますが、これらのフォーマットの少なくとも一つを選択する必要があります。

すべての入力は、の一連のシーケンスfizzbuzzおよび空の行であると想定できます。

入力:
フィズ

出力:
2
fizz
4
入力:
バズ
フィズ

出力:
buzz
fizz
7
入力:

フィズバズ


出力:
13
14
fizzbuzz
16
17
入力:


出力:

1
入力:
フィズ
フィズ

出力:
zzubzzif
入力:


出力:
zzubzzif

回答:


17

Java、205バイト

s->{o:for(int i=0,j,h=s.length;++i<16;){for(j=h;j-->0;)if(s[j].contains("fizz")^(i+j)%3<1||s[j].contains("buzz")^(i+j)%5<1)continue o;String z=i+"";for(j=1;j<h;)z+="\n"+(i+j++);return z;}return"zzubzzif";}

かかるString[]入力戻るようにString

拡張された実行可能なコード:

public class C {

    static final java.util.function.Function<String[], String> f = s -> {
        o:
        for (int i = 0, j, h = s.length; ++i < 16;) {
            for (j = h; j --> 0;) {
                if (s[j].contains("fizz") ^ (i + j) % 3 < 1 ||
                    s[j].contains("buzz") ^ (i + j) % 5 < 1) {
                    continue o;
                }
            }
            String z = i + "";
            for (j = 1; j < h;) {
                z += "\n" + (i + j++);
            }
            return z;
        }
        return "zzubzzif";
    };

    public static void main(String[] args) {
        System.out.print(f.apply(new String[]{"fizz", "", "buzz"}));
    }
}

1
s / fizz / f、s / buzz / b
djechlin

10

C#、212バイト

私は考えられないことをしました。gotoループから抜け出すためにステートメントを使用しました!

string[]R(string[]a){for(int i,l=a.Length,n=0;n++<15;){for(i=l;i-->0;)if(((n+i)%3<1?"fizz":"")+((n+i)%5<1?"buzz":"")!=a[i])goto z;for(i=l;i-->0;)a[i]=a[i]==""?""+(n+i):a[i];return a;z:;}return new[]{"zzubzzif"};}

これは、シーケンスが最初の15要素内で開始する必要があるという事実を利用しています。

読みやすくするためのインデントと改行:

string[]R(string[]a){
    for(int i,l=a.Length,n=0;n++<15;){
        for(i=l;i-->0;)
            if(((n+i)%3<1?"fizz":"")+((n+i)%5<1?"buzz":"")!=a[i])
                goto z;
        for(i=l;i-->0;)
            a[i]=a[i]==""?""+(n+i):a[i];
        return a;
    z:;
    }
    return new[]{"zzubzzif"};
}

C#にはbreakキーワードがありませんか?

2
@cat、それはgotoしますが、内側のループから飛び出し、外側のループの残りのロジックを飛び越えます。
Hand-E-Food

gotoC#で初めて聞いた!C#がそれを持っていることすら知らなかった!
セルジオ

4

CJam、72バイト

"zzubzzif":MaqN/:Q,_F+{)_[Z5]f%:!MW%4/.*s\e|}%ew{:sQ1$A,sff&:s.e|=}=N*o;

zzubzzifを出力する必要がある場合プログラムはエラーで終了します

Javaインタープリターを使用すると、STDERRを閉じて、最終的なエラーメッセージを抑制することができます。CJamインタープリターでプログラムを試行する場合、最初の行の後のすべての出力を無視します。

使い方

"zzubzzif" e# Push that string.
:Ma        e# Save it in M and wrap in in an array.
qN/:Q      e# Split the input into lines and save in Q.
,_F+       e# Count the lines and add 15 to a copy of the result.
{          e# For each integer I between 0 and lines+14:
  )_       e#   Increment I and push a copy.
  [Z5]     e#   Push [3 5].
  f%       e#   Map % to push [(I+1)%3 (I+1)%5].
  :!       e#   Apply logical NOT to each remainder.
  MW%4/    e#   Push ["fizz" "buzz"].
  .*       e#   Vectorized string repetition.
  s\       e#   Flatten the result and swap it with I+1.
  e|       e#   Logical OR; if `s' pushed an empty string, replace it with I+1.    
}%         e#
ew         e# Push the overlapping slices of length "lines".
{          e# Find; for each slice:
  :s       e#   Cast its elements to string (e.g., 1 -> "1").
  Q1$      e#   Push the input and a copy of the slice.
  A,s      e#   Push "0123456789".
  ff&      e#   Intersect the slice's strings' characters with that string.
  :s       e#   Cast the results to string. This replaces "fizz", "buzz"
           e#   and "fizzbuzz" with empty strings.
  .e|      e#   Vectorized logical OR; replace empty lines of the input
           e#   with the corresponding elements of the slice.
  =        e#   Check the original slice and the modified input for equality.
}=         e# Push the first match or nothing.
           e# We now have ["zzubzzif"] and possibly a solution on the stack.
N*         e# Join the topmost stack item, separating by linefeeds.         
o          e# Print the result.
;          e# Discard the remaining stack item, if any.

1

Perl、140バイト

$f=fizz;$b=buzz;@a=<>;@x=map{s!\d!!gr.$/}@s=map{$_%15?$_%3?$_%5?$_:$b:$f:$f.$b}(++$c..$c+$#a)while$c<15&&"@x"ne"@a";print$c<15?"@s":zzubzzif

説明

  1. @a 入力行の配列です
  2. 内部whileループ、
  3. @s 生成されたフィズバズシーケンスを持っています
  4. @xと同じです@sが、数字が空の文字列に置き換えられ、すべての要素に改行が追加されます(と一致するため@a
  5. $c 1から15までのカウンター
  6. ループ@xは入力と同じになるまで実行されます@a
  7. ループの外側では、出力は、制限内にあっ@sたかどうか$cに基づいて、またはzzufzzibです。

1

Python、176バイト

おそらくはるかに良いことができますが、ゴルフで最初の試み。感謝のヒント:)

縮んだ

def f(a):l=len(a);g=lambda n:'fizz'*(n%3<1)+'buzz'*(n%5<1);r=range;return next(([g(x)or x for x in r(i%15,i%15+l)]for i in r(1,16)if all(g(i+x)==a[x]for x in r(l))),g(0)[::-1])

元の

def f(a):
  l = len(a)
  g = lambda n: 'fizz'*(n%3<1)+'buzz'*(n%5<1)
  r = range
  return next(
    (
      [g(x) or x for x in r(i % 15,i % 15 + l)]
      for i in r(1,16)
      if all(
        g(i + x) == a[x] for x in r(l)
      )
    ),
    g(0)[::-1]
  )

PPCGへようこそ!標準のフォーマットガイドラインは、回答の先頭にヘッダーを付けることであるため、読者は言語とリーダーボードスニペットが回答を適切に解析できることを知っています。たとえば#Java, 205 Bytes、答えの最初の行として。
-AdmBorkBork

1
ラムダを次のように置き換えてみてください:'fizz'*(n%3<1)+'buzz'*(n%5<1)fとbの割り当てを削除できます。(f+b)[::-1]次に、既知の「fizzbuzz」への呼び出しにすることができg(15)[::-1]ます。
トッド

提案をありがとう!183まで!g(0)また、別のバイトを保存するために働くと思う:)
arcyqwerty

1
python 2では、あいまいさがない場合にキーワードの前にいくつかのスペースを削除できます。たとえば..] for 、書くことができます..]for。このトリックを適用すると、177文字が得られます。
ディーター

次回コードを書いたときに想定した入力を含めてください。例:フォーム ['','fizz','']のリストall()を使用するのではなく、入力リストとリストcompを比較する場合、削除するものがいくつかあります。if a==[g(i + x) for x in r(l)]
トッド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.