列に一意の文字が含まれるFizz Buzz


21

レーンのDigits1、2、Fizz、4、Buzzに触発

前書き

あなたの仕事は、正確に次の出力を生成することです。

1
2
Fizz
4
  Buzz
    Fizz
7
8
      Fizz
        Buzz
 11
          Fizz
   13
    14
            FizzBuzz
     16
      17
              Fizz
       19
                  Buzz
                    Fizz
 22
    23
                      Fizz
                        Buzz
   26
                          Fizz
     28
      29
                            FizzBuzz
       31
      32
                              Fizz
34
                                  Buzz
                                    Fizz
 37
  38
                                      Fizz
                                        Buzz
        41
                                          Fizz
  43
   44
                                            FizzBuzz
      46
       47
                                              Fizz
         49
                                                  Buzz

チャレンジ

このチャレンジはFizz Buzzチャレンジに基づいており、要約すると次のようになります。1から100までの数字をそれぞれの行に出力しますが、数字が3の倍数である場合は、「Fizz」元の番号、5の倍数の場合、元の番号の代わりに「バズ」を出力する必要があります。数値が15の倍数である場合、元の数値の代わりに「FizzBu​​zz」を出力する必要があります。

ただし、上記の要件に加えて、スペースを使用して各行をインデントし、すべての列に一意の文字(スペースと改行を除く)のみが含まれるようにする必要があります。各行の先頭に追加するスペースは、各列に一意の文字が含まれる前にすべての行を表示するために最低限必要です。

例えば、1,2,Fizz,4彼らはすでに各列のユニークな文字(:列1持っているので、任意のインデントを必要としない12F4、COLUMN2:i、COLUMN3: z:、column4 をz、しかし、追加するとき)Buzzそれ以外の場合は、我々は2必要があるため、私たちは二つのスペースでインデントに必要なzのは3列目と4列目の両方に。目標を達成するには2つのスペースで十分なので、3つのスペースでインデントしないでください。7また8、インデントは必要ありませんが、出力するとき11は、1番目の列に1131番目、2番目、3番目の列にはすべてがあるため、3つのスペースでインデントする必要があり1ます。残りの行のインデントも同じ規則に従います。

チャレンジを簡単にするために、上限が50に変更されました。

スペック

  • プログラムまたは関数を作成できます。どちらも空でない入力を受け付けません。空の入力を入力しても問題ありません。

  • これはKCの課題であるため、「はじめに」セクションで指定されているとおりに出力を生成する必要があります。単一の末尾の改行で問題ありません。見出しの改行や余分な見出しスペースはありません。各行に余分な後続スペースはありません。

  • STDOUTが仕様に準拠している限り、プログラムはエラーで終了するか、空でないSTDERR出力を持つことができます。

  • これは言語内です であり、バイト数が最も少ないプログラムがその言語で勝ちます。

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


2
指定された出力は、仕様と正確に一致しません。たとえば、行
12、20、35、50。–バブラー

1
ただし、最初の2行の2番目の文字は復帰です。
蓄積

スペースを除外しましたが、改行も除外する必要があります。
ウェイジュン周

回答:


9

Python 2、127バイト

i=0;exec"print ord('<<<<>@<<BD=F?@HABJCNP=@RT?VABXCBZ<^`=>bdDf>?hBCjEn'[i])%60*' '+(i%3/2*'Fizz'+i%5/4*'Buzz'or`-~i`);i+=1;"*50

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

50バイトのルックアップテーブルは、各列でどの文字が発生したかを追跡するために必要なロジックよりもコードサイズを小さくするようです。


1
代わりに100まで印刷する必要があった場合、ロジックは改善されていたでしょう
...-バブラー

5

パイソン2167の 166 163 161 157バイト

a=eval(`[{0}]*99`);i=0
exec"f=i%3/2*'Fizz'+i%5/4*'Buzz'or`i+1`;i+=1;g=0\nwhile any(b>{c}for b,c in zip(a[g:],f)):g+=1\nmap(set.add,a[g:],f);print' '*g+f;"*50

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

編集:

  • whilefor..range()1バイトより短い。
  • 3バイトを削る@ovsに感謝します。私はいつも忘れexec...
  • i%3/2Lynnの回答(-2バイト)からの適応されたトリック。
  • @Lynnが提案しましたがa=map(set,[[]]*99)、同じバイト(-4バイト)を使用evalreprて別の方法を見つけました。

セットのリストを使用して各列に使用される文字を追跡し、メンバーシップの不等式を設定します。残りは指定された正確な仕様に従います。


4

C(gcc)145 144バイト(hexの場合は143)

i;main(){for(;i++<50;printf("%*s%s%.d\n","000402800:81>34@56B7BH14JH3N56P76R0RX12ZX8^23`67b9b"[i]-48,i%3?"":"Fizz",i%5?"":"Buzz",i%3*i%5?i:0));}

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

0000h: 69 3B 6D 61 69 6E 28 29 7B 66 6F 72 28 3B 69 2B ; i;main(){for(;i+
0010h: 2B 3C 35 30 3B 70 72 69 6E 74 66 28 22 25 2A 73 ; +<50;printf("%*s
0020h: 25 73 25 2E 64 5C 6E 22 2C 22 FE FE FE 02 FE 00 ; %s%.d\n","......
0030h: 06 FE FE 08 06 FF 0C 01 02 0E 03 04 10 05 10 16 ; ................
0040h: FF 02 18 16 01 1C 03 04 1E 05 04 20 FE 20 26 FF ; ........... . &.
0050h: 63 28 26 06 2C 00 01 2E 04 05 30 07 30 22 5B 69 ; c(&.,.....0.0"[i
0060h: 5D 2B 32 2C 69 25 33 3F 22 22 3A 22 46 69 7A 7A ; ]+2,i%3?"":"Fizz
0070h: 22 2C 69 25 35 3F 22 22 3A 22 42 75 7A 7A 22 2C ; ",i%5?"":"Buzz",
0080h: 69 25 33 2A 69 25 35 3F 69 3A 30 29 29 3B 7D    ; i%3*i%5?i:0));}

3

ルビー、129バイト

puts (1..50).map{|n|" "*(".<<<<>@<<BD=F?@HABJCNP=@RT?VABXCBZ<^`=>bdDf>?hBCjEn"[n].ord%60)+("FizzBuzz
"[i=n**4%-15,i+13]||n.to_s)}

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

ルックアップテーブルアプローチfizzbuzzアルゴリズムについては、Lynnに二重のクレジットが割り当てられます

FizzBu​​zzアルゴリズムは非常に興味深いものであり、4乗したときに15未満のすべての正の非合成数(3および5を除く)が15の倍数よりも1多いという驚くべき一致にかかっています。事実:

 n     n**4  n**4%15  n**4%-15
 1        1     1       -14
 2       16     1       -14
 3       81     6        -9
 4      256     1       -14
 5      625    10        -5
 6     1296     6        -9
 7     2401     1       -14
 8     4096     1       -14
 9     6561     6        -9
10    10000    10        -5
11    14641     1       -14
12    20736     6        -9
13    28561     1       -14
14    38416     1       -14
15    50625     0         0

3**4%155**4%15は、正確に4つ離れています:文字列「Fizz」の長さ。これを利用して、少なくとも9文字の文字列の末尾からインデックスを作成することができます。3の倍数は文字列の先頭からインデックスを作成し、5の倍数は末尾から5文字からインデックスを作成します。他のすべての番号は、文字列の先頭より前からインデックスを作成しようとし、失敗してを返しnilます。それから15、もちろん、0番目の文字からのインデックス。「FizzBu​​zz」の長さが8文字しかないという事実は小さな障害です。改行文字を使用してパディングしますが、これは後で無視されますputsます。

ルックアップテーブルは、より手続き的なアプローチでアウトゴルフできる可能性がありますが、私の試みは190バイト近くでした。


2
面白い。15を法とする1乗に等しい4乗に上げたときにすべての数が15に素になるという事実は、フェルマーの小さな定理から導出できることに注意する必要があります。
ウェイジュン周

2

[JavaScript(Node.js)REPL]、144バイト

(f=(i,s=[['Fizz'][i%3]]+[['Buzz'][i%5]]||i+[],b=i>1?f(i-1):[])=>[...s].some((p,j)=>b.some(w=>w[j]==p&0!=p))?f(i,' '+s):b.push(s)&&b)(50).join`

`

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

警告プログラム自体は許容できない時間を実行します

JavaScript(Node.js)、Arnauldによる132バイト

f=(a=n=[],s=`${b=++n%5?'':'Buzz',n%3?b||n:'Fizz'+b}
`)=>n>50?'':a.some(x=>[...x].some((c,i)=>c!=0&c==s[i]))?f(a,' '+s):s+f([s,...a])

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


あなたの答えはTIOリンクと同じではないようです
ジョーキング

@JoKing TIOは配列を出力し、許可されているかどうかわかりません
-l4m2

2

Java(JDK 10)、185バイト

v->{for(int n=0,l;n<50;System.out.printf((l>0?"%"+l:"%")+"s%s%n","",(n%3<1?"Fizz":"")+(n%5<1?"Buzz":n%3<1?"":n)))l="####%'##)+$-&'/()1*57$'9;&=()?*)A#EG$%IK+M%&O)*Q,U#".charAt(n++)-35;}

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

クレジット


1

ハスケル190の187 186 178 176バイト

unlines$foldl(\a x->a++[[z|z<-iterate(' ':)x,all(\m->null[p|(p,q)<-m`zip`z,p==q&&p>' '])a]!!0])[]$h<$>[1..50]
a%b=a`mod`b<1
h n|n%15="FizzBuzz"|n%3="Fizz"|n%5="Buzz"|1<2=show n

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

少し読みやすい(注釈付き)バージョン:

-- check if a is evenly divisible by b
a%b=a`mod`b<1
-- produce correct FizzBuzz output for a number
h n|n%15="FizzBuzz"|n%3="Fizz"|n%5="Buzz"|1<2=show n
-- test if all chars distinct between two strings
x#y=null[a|(a,b)<-x`zip`y,a==b&&a>' ']
-- given a new string and all previous strings
-- shift the new string to the right until all
-- chars are distinct
x!y=[z|z<-iterate(' ':)y,all(z#)x]!!0
g=h<$>[1..50]
f'=foldl step[]g
  where step acc x = acc++[acc!x]

編集:私は、より多くのバイトを節約するために、ゴルフバージョンのいくつかの機能をインライン化しました。


@ライコニそう。一定。
クリスティアンルパスク

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