バイナリ定規を作成する


22

番号nを指定すると、このパターンの最初のn列が生成されます。

                               #
               #               #
       #       #       #       #
   #   #   #   #   #   #   #   #
 # # # # # # # # # # # # # # # #
################################ ...

(1-indexed)nの列の高さは、nのバイナリ表現の末尾の0ビット数に1を加えたものです。その結果、最下層にはすべての列が、2番目の層には2列ごとに、3番目の層には4列ごとに、などが入力されます。

ルール

  • 任意の標準的な方法で入出力できます。
  • 入力は1から999までの整数であると仮定できます。
  • パターンが完全である限り、出力には任意の量の空白を含めることができます。
  • パターンは1インデックスで、ここに示されているのと同じ形式である必要があります。
  • の代わりに任意の単一の非空白文字を使用でき#ますが、スペース文字を変更することはできません。

テストケース

1
#

2
 #
##

3
 # 
###

4
   #
 # #
####

5
   # 
 # # 
#####

7
   #   
 # # # 
#######

32
                               #
               #               #
       #       #       #       #
   #   #   #   #   #   #   #   #
 # # # # # # # # # # # # # # # #
################################

いくつかのより大きなテストケースがここにあります

得点

これはであるため、各言語のバイト単位の最短コードが優先されます。



これで、距離をバイナリで測定できます!ああ待って
...-Okx

2
1.定規は水平にする必要がありますか?2.マーキングは必要#ですか?
ジョナサンアラン

1
@JonathanAllan 1.はい、および2.いいえ、任意の単一の非スペース文字を使用できます。これをルールに追加しました。
ETHproductions

OEISでのシーケンス:A001511
ツリーではない

回答:


11

Python 2、54バイト

i=n=input()
while i:i-=1;print((' '*~-2**i+'#')*n)[:n]

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

多くの先行空白を使用して印刷します。iからカウントダウンする各行nは、2**i-1スペースのパターンに続いてを繰り返します#。このパターンは、入力であるルーラーの幅まで繰り返されますn。これは、パターン文字列を乗算しn、最初のn文字をで取得することにより行われ[:n]ます。

パターンは、同じ長さの代替の文字列フォーマットによって作成できます。

i=n=input()
while i:i-=1;print('%%%ds'%2**i%'#'*n)[:n]

キュートなスライス方法は長くなります。

n=input();s=~-2**n*' '+'#'
exec"s=s[1::2]*2;print s[:n];"*n

〜は-1か+1ですか?
スタンストラム

気にしないで、それの(-x) - 1
スタン・ストラム

10

Python 3、74バイト

n=int(input())
a=1
while a<n:a*=2
while a:print(("%%%dd"%a%4*n)[:n]);a//=2

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


うわー、行がどのように生成されるかを理解するのに時間がかかりました。よくやった。
-ETHproductions

2
a=2**len(bin(n))72バイト
ovs

2
メモリエラーをすばやくヒットし、余分な空白(許可されている)を出力しますが、Python 2を使用して54を実行できます。
ジョナサンアラン

9

V17、16のバイト

é#Àñä}Är {ñÎÀlD

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

Hexdump:

00000000: e923 c0f1 e416 7dc4 7220 7bf1 cec0 6c44  .#....}.r {...lD

1バイトを保存してくれた@KritixiLithosに感謝します!

このアルゴリズムは恐ろしく非効率的ですが、あらゆるサイズの入力に対して理論的には機能するはずです。

次のパターンの最初のn回の反復を生成することにより機能します。

#

 #
##

   #
 # #
####

       #
   #   #
 # # # #
########

               #
       #       #
   #   #   #   #
 # # # # # # # #
################

                               #
               #               #
       #       #       #       #
   #   #   #   #   #   #   #   #
 # # # # # # # # # # # # # # # #
################################

そして、最初のn列を除くすべてを切り取ります。そのため、これにより大量の先行空白が生成されますが、OPは次のよ​​うに述べました。

パターンが完全である限り、出力には任意の量の空白を含めることができます

説明:

é#                      " Insert an '#'
  Àñ           ñ        " 'N' times:
    ä<C-v>}             "   Duplicate every line blockwise (duplicating horizontally instead of vertically)
           Ä            "   Duplicate the top line. This conveniently puts us on the first non-whitespace character (that is, '#')
            r           "   Replace this character with a space
              {         "   Move to the beginning of the buffer
                Î       " On every line:
                 Àl     "   Move 'N' characters to the right ('l' for right, makes sense, right?)
                   D    "   And delete everything after the cursor

よくわかりませんが、を削除できると思います|
クリティキシリソス

@KritixiLithosあは!後知恵で、それはとても明白です!ヒントをありがとう。:)
DJMcMayhem

5

JavaScript(ES6)、61 58バイト

f=(n,c=n,s='')=>c?f(n,c>>1,s+s+' ')+`
`+(s+1).repeat(c):''

@ETHProductionsのおかげで1バイト節約され、その後、任意の文字を使用できることがわかったときにさらに2バイト節約されました。

再帰的なソリューション。

テストケース:

アニメーション:


1
よくやった。を変更c/2|0c>>1て、バイトを保存できます。
ETHproductions

ナイス、ビットごとの演算子をブラッシュアップする必要があります。
リックヒッチコック

4

APL(Dyalog)、21バイト

'# '[1+⊖0⍪∨⍀⊖2⊥⍣¯1⍳⎕]

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

'# '[… `]で文字列にインデックスを付けます

 入力を得る

 その多くのi ntegers

2⊥⍣¯1 必要に応じて、多くの桁として使用し、バイナリに変換(各々における1つの数の列

 逆さまに

∨⍀ 垂直累積OR削減

0⍪ ゼロを連結します

 ひっくり返す(つまり、再び戻る)

1+ 1を追加(1ベースのインデックス作成用)





2

Japt20 17バイト

@Shaggyと@ETHproductionsのおかげで3バイト節約

õ_¤q1 o Ä ço÷z w

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

説明:

入力:5

õ_¤q1 o Ä ço÷z w
õ           Ã       // Create a range [1...Input] [1,2,3,4,5]
 _                  // Map; At each item:
  ¤                 //   Convert to binary        ["1","10","11","100","101"]
   q1               //   Split on "1"             [["",""],["","0"],["","",""],["","00"],["","0",""]]
      o             //   Get the last item        ["","0","","00",""]
        Ä           //   Add 1                    [["1","01","1","001","1"]]
          ço        //   Fill with "o"            ["o","oo","o","ooo","o"]
             ·      // Join with new-lines        ["o\noo\no\nooo\no"]
              z     // Rotate 90 degrees          ["ooooo\n o o \n o   "]
                w   // Reverse                    ["   o \n o o \nooooo"]


@Shaggy実際には、必要さえありませんl
ETHproductions

@ETHproductions:うん、ちょうどそれを考え出した。18バイト
シャギー


ビット単位の演算子を使用するクールなトリックはn&-n、の最後の1すべて0のs のみをキャプチャすることですn。これが役立つかどうかは
わかり

2

C、84 74バイト

f(i,l,m){putchar(32+3*!(i&m));i<l?f(i+1,l,m):m?putchar(10),f(1,l,m>>1):1;}

ゴルフをしていない:

void f(int counter, int length, int mask) {
    putchar((counter&mask) ? ' ' : '#');
    if(counter<length) {
        f(counter+1, length, mask);
    } else if(mask) {
        putchar('\n');
        f(1, length, mask>>1);
    }
}

でテストする:

int main() {
    f(1, 32, 1023);
    putchar('\n');
    f(1, 1, 1023);
    putchar('\n');
    f(1, 999, 1023);
    putchar('\n');
}

説明

繰り返しになりますが、Cでは反復よりも再帰の方が文字数が少ないため、2つのループは2つの再帰呼び出しとして表されます。

また、Cはブール式でトリックをプレイするための優れた言語であり、空白を入れるかa #を式で表現するかを決定できます32+3*!(i&m)。スペースのASCII値は32で、#ASCII 35です。そのため、マスクのビットのいずれかがに設定されてiいる場合は空白になります。


あなたも必要int i,l,mですか?
ザカリー

@ZacharyTいいえ、そうではなかったことがわかりました。これらの10バイトを保存してくれてありがとう:
cmaster

2

Pyth、15バイト

j_.tm*Nhx_.Bd1S

それを試してみてください!

説明

j_.tm*Nhx_.Bd1S
    m         SQ   # map over the numbers from 0 to the implicit input (lambda variable: d)
          .Bd      # Convert d to a binary string: (12 -> 1100)
         _         # reverse: (1100 -> 0011)
        x    1     # get the location of the first 1 ( 2 )
     *Nh           # make one more than that " quotation marks (""")
 _.t               # transpose the list of quotation mark strings and reverse it
j                  # join on newline

@JasonS Pythonに基づいたゴルフ言語です!pythのgithubをリンクしました。私はそれを試してみました!オンラインのエグゼキューターへのリンクで十分です。
カールカストール


1

JavaScript(ES8)、71バイト

padStart()関数は、ECMAScriptの2017年に導入されました!

N=>eval(`for(s='',n=1;n<=N;n*=2)s='\\n'+'#'.padStart(n).repeat(N/n)+s`)


JavaScript(ES6)、77バイト

N=>eval(`for(s='',n=1;n<=N;n*=2)s='\\n'+(' '.repeat(n-1)+'#').repeat(N/n)+s`)


1
@RickHitchcock修正済み。
-darrylyeo

1

Mathematica、69バイト

Rotate[Grid["#"~Table~#&/@(IntegerExponent[2*#,2]&/@Range[#])],Pi/2]&

1

WESRRMICGSE):237バイト

IF(ROW()<=FLOOR(LOG(COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1,2),1)+2,LEFT(REPT(REPT(" ",FLOOR(POWER(2,LOG(COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1,2)-ROW()+2),1)-1) &"#",COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1),COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1),"")

わかった。時間を嘆きます。

まず、入力用にすべてCOUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1を単にに置き換え[i]ます。トークンは、数式を含むセル自体の数を含まないセルの数をカウントし、それを追加して自分自身を含める。WESRRMICGSEは指定された入力に従って式をドラッグするため、このトークンは常に入力になります。

我々は持っています:

IF(ROW()<=FLOOR(LOG([i],2),1)+3,LEFT(REPT(REPT(" ",FLOOR(POWER(2,LOG([i],2)-ROW()+2),1)-1) &"#",[i]),[i]),"")

これははるかに読みやすいです。FLOOR(LOG([i],2),1)トークンは頻繁に表示されます。これは、入力([i])数よりも小さい2のべき乗を取ることを意味します。例:4->4, 5->4, 6->4, 7->4, 8->8 ...etc。に置き換えますGS[[i]]

IF(ROW()<=GS[[i]]+3,LEFT(REPT(REPT(" ",,FLOOR(POWER(2,LOG([i],2)-ROW()+2),1),1)-1) &"#",[i]),[i]),"")

より良い。if句を分解して、行がより小さいか等しいかどうかをテストしています。GS[[i]]+3すべてのルーラーの高さがGS [[i]] + 1に等しいため、これは、の高さに等しい行を選択します定規。+11インデックス行の場合、および+1WESRRMICGSEオフセットの場合。

FALSE結果は空のセル(「」)、そして真の結果の収量が得られLEFT(REPT(REPT(" ",,FLOOR(POWER(2,LOG([i],2)-ROW()+2),1),1)-1) &"#",[i]),[i])

現在編集中です。ご期待ください



1

k、33バイト

`0:|" #"{(1+!x){~y!x}/:(x>)(2*)\1}

これは、AWのインタープリターでのみ機能するようです。

AWのインタープリターで動作する例。

oKバージョン(オンラインで試すことができます)にはバグがあるようで、動作させるにはわずかな変更が必要です。

`0:|" #"{(1+!x){~y!x}/:{x>y}[x](2*)\1}

1

C#、174バイト

このメソッドには、ルーラーの長さの入力と、文字列としてのルーラーである出力の2つのパラメーターがあります。

ゴルフ:

void R(int n,out string s){var l=new int[++n];int i,x=n,y=0;for(s="";x-->1;)for(i=0;0==(l[x]=(x>>i++&1)*i);y=y<i?i:y);for(y++;y-->0;s+='\n')for(x=0;++x<n;s+=y<l[x]?'#':' ');}

インデント:

void R(int n,out string s){                       // Return the result in an out parameter.
    var l=new int[++n];                           // Use a 1-based array.
    int i,x=n,y=0;                                //
    for(s="";x-->1;)                              // For each number x on the ruler
        for(i=0;0==(l[x]=(x>>i++&1)*i);y=y<i?i:y) // ... find lowest set bit of x, counting the maximum value.
            ;                                     //
    for(y++;y-->0;s+='\n')                        // Count down each line.
        for(x=0;++x<n;s+=y<l[x]?'#':' ')          // Output # for numbers that are tall enough.
            ;                                     //
}

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


に変換するとFunc<int, string>数バイト節約できますか?
TheLethalCoder

1

木炭27 23バイト

↶F…·¹N«Jι⁰#W¬﹪鲫A÷ι²ι#

オンラインでお試しください!リンクは、コードの詳細バージョンです。編集:に切り替えて4バイトを保存しましたJumpTo


それはちょうど今それを呼び出して、まだ絶対ですJumpTo(すみません)
ASCIIのみの

@ASCIIのみああ、wikiは更新を行うことができます。(または、編集権限を与えたい場合はできると思います...)
ニール

ASCIIのみ@えっ、私はからのことを覚えているはずcodegolf.stackexchange.com/a/119904 ...
ニール

GitHubアカウントをお持ちですか?
ASCIIのみ

@ ASCIIのみのI持っている2 ...私は1つが...より適切であるかを決めることはできません
ニール・

1

J、38バイト

3 :'|.|:''#''#~,.(1+|.i.1:)@#:"0>:i.y'

良くない。バイトカウントがオフの場合、LMK-私は自分の電話にいます。


私には38のように見えます、しない限り、3冒頭には、入力された...
ETHproductions

@ETHproductionsのおかげで、暗黙の定義から恥の切り替えはどの...バイト保存していない
コール

1
28バイト0|.@|:'#'#"0~1#.2~:/\i.#:@,]
マイル

0

Java(OpenJDK 8)、91バイト

n->{int i=10,j;String s="";for(;i-->0;s+="\n")for(j=0;j++<n;)s+=j>>i<<i<j?' ':35;return s;}

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

ゴルフをしていない:

n->{
    int i=10,j; // Since we are allowed extra whitespace, set columns always to 10
    String s = "";
    for(;i-->0;s+="\n")      // Every iteration add a newline, i=9..0
        for(j=0;j++<n;)      // j=1..n+1
            s+= j>>i<<i<j    // if j has less than i trailing 0s in binary form
                ?' '         // add a space else
                :35          // # (java handles ternary return types weirdly)
}



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