バイナリ壁を作成する


33

10を底とする正の整数の配列を指定n > 0すると、は、バイナリ壁の表現を出力します。

これはどのように作動しますか?

  1. 各数値をバイナリ表現に変換します。
  2. 表現の先頭にゼロを追加して、最も長いものの長さ(つまり、1, 2-> 1, 10->)にし01, 10ます。
  3. 1sがレンガであり、sがレンガ0が欠けている壁を作成します。

壁は文字のブロックで、印刷可能な文字はレンガを表し、スペース(32)は欠けているレンガを表します。レンガには任意の文字を選択できます。空白文字でない限り、壁全体で区別する必要はありません。行方不明のレンガ文字はスペースでなければなりません。以下の例*では、レンガに使用しました。

入力:

[ 15, 7, 13, 11 ]
  1. [ 1111, 111, 1101, 1011 ]
  2. [ 1111, 0111, 1101, 1011 ]
  3. 出力:

    ****
     ***
    ** *
    * **
    

ルール

  • ご使用の言語で使用できない他のベースが言語で受け入れられている場合は、ベース10で入力する必要があります。
  • 先頭と末尾の改行が許可されます。
  • 入力は、整数のリスト、個別の引数、または任意の妥当な形式として取得できます。
  • 出力は、改行で区切られた文字列、行の配列、2D配列など、任意の妥当な形式になります。
  • 標準の抜け穴は許可されていません。

テストケース

最初のテストケースでは、すべてのレイヤーの最後に空のブリックがあることに注意してください。

[ 14, 4, 6, 2 ]

*** 
 *  
 ** 
  * 

[ 1, 2, 4, 8, 16 ]

    *
   * 
  *  
 *   
*

[ 15, 11, 15, 15 ]

****
* **
****
****

[ 11, 10, 9, 8 ]

* **
* * 
*  *
*   

これはコードゴルフなので、最短のコードが勝ちます!


出力は行の配列または文字の2D配列にできますか?
-ovs

@ovs申し訳ありませんが、配列または2次元配列などを出力できると指定したと思います。合理的な形式であれば、どのようなものでもかまいません。
TheLethalCoder

2D配列の場合、文字の代わりに数字をレンガに使用できますか?例[[1, " ", 1, " "], ...]
アーナルド

@Arnauldうん、そうだね。
TheLethalCoder

1
@Giuseppe New行のみ。そうでない場合、空のブリックと混同されます。
TheLethalCoder

回答:


13

MATL、5バイト

B42*c

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

説明

B     % Implicitly input an array of numbers. Convert to binary. 
      % Gives a matrix with each row corresponding to a number
42    % Push 42 (ASCII code of '*')
*     % Multiply
c     % Convert to char. Char 0 is displayed as space. Implicitly display

レンガには任意の文字を選択できます。空白文字でない限り、壁全体で区別する必要はありません。そのあなたがおそらく必要としない手段ええ42*か何か...
エリックOutgolfer

@EriktheOutgolfer他の番号を選択することもできますが、私は思うにこれらの3バイトが必要です。
ルイスメンドー

1バイトの組み込み100またはその他の番号がある場合はどうなりますか?
エリックアウトゴルファー



8

オクターブ、22バイト

@(x)[dec2bin(x)-16,'']

オンラインで試す

説明:

ルイスメンドーのおかげで数バイト節約できました!また、壁を構築するキャラクターを選択できることに気づきませんでした*

@(x)                    % Take the input as a column vector
    dec2bin(x)          % Convert each row of the input to a string with 1 and 0
                        % It gets automatically padded with zeros, to fit the longest number
    dec2bin(x)-16       % Subtract 16, to get from the ASCII-values of 1/0 (48/49)
                        % to 32/33 (space and !)
@(x)[dec2bin(x)-16,'']  % Concatenate with the empty string to convert it to a string.

または de2bi

説明:

@(x)                          % Take the input as a column vector
               de2bi(x)       % Convert each row of the input to a binary number.
                              % Gets automatically padded to fit the longest number
            42*de2bi(x)       % Multiply the matrix by 42, which is the ASCII-value for *
           [42*de2bi(x),'']   % Concatenate the matrix with the empty string to convert
                              % it to a string. 0 are automatically displayed as spaces
@(x)fliplr([42*de2bi(x),''])

以下は、7バイト以上のTIOで機能します。

@(x)fliplr([42*(dec2bin(x)>48),''])

ここで試してみてください


5

Python 3 88の84 71 74 72バイト

各行を表す文字列のリストを返すラムダ。

lambda n:[bin(x)[2:].replace(*'0 ').rjust(len(bin(max(n)))-2)for x in n]

オンラインでお試しください!(改行で区切られたバージョンへのリンク)

説明

  • lambda n:-パラメータを使用して(匿名の)ラムダを作成しますn。暗黙的に戻ります。

  • [...] -リスト内包表記を作成します。

  • bin(x)[2:] -数値のバイナリ表現を取得します。

  • .replace(*'0 ')-すべての出現を0スペースに置き換えます。

  • .rjust(len(bin(max(n)))-2) -バイナリ表現を最も長いものの長さにパディングします。

  • for x in n- n変数を使用して繰り返し処理しますx


変更履歴

  • - 1 - 3が@Rodに感謝バイト-(...)+2= 2-(...)の使用をrjust()

  • バージョンが追加されましたbin()、それはのために働かなかったため、無効でした代わりに、1とは2

  • を使用して上記のバグを修正しましたformat()

  • OPで許可されていたため、戻り値の型を文字列のリストに変更しました。

  • @Rodが使用しrjust()、に切り替えbin()、発見し、修正した別のバグを修正しました。


5

JavaScript(ES6)、81 79バイト

リックヒッチコックが示唆するように、レンガの文字の代わりに数字を使用して2バイトを保存しました

ブリックに対して1の2D配列を返します。

f=(a,b=[],x=1)=>a.every(n=>n<x)?a.map(n=>b.map(i=>n&i?1:' ')):f(a,[x,...b],x*2)

テストケース




4

ルビー、63 59バイト

Alexis Andersenの助けを借りて-4バイト

->*n{puts n.map{|i|("%#{('%b'%n.max).size}b"%i).tr'0',' '}}

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


1
文字列形式の0は必要ありません。あなたは置き換えることにより、バイトを剃ることができn.max.to_s(2).size('%b'%n.max).size、あなたが実際に交換する必要はありません1*
アレクシス・アンデルセン

@AlexisAndersenおかげで:)
daniero

4

R、87 88バイト

で表される壁ブロックは8、多くの場合8であるためです。

write(ifelse((I=sapply(scan(),intToBits))[(M=max(which(I>0,T)[,1])):1,],8,' '),1,M,,'')

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

入力整数リストはビットの配列に変換され、後続の0ビットが削除されて逆になります。

縮小された配列はwrite、配列がトリミングされたときに決定された列幅を使用して出力されます。

ifelse() 残念ながらベクトルで動作する唯一のIFオプションです。


@Vloは、の出力ファイルでは1なく使用できることを指摘し""ましたwrite
ジュゼッペ

@ジュゼッペのヒントに感謝
-MickyT


3

APL(Dyalog)30 22 20 14バイト

@Adámのおかげで6バイト節約

' *'[⍉2⊥⍣¯1⊢⎕]

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

(想定 ⎕IO←0これが多くのマシンでデフォルトであるします)

これは、入力を配列として受け取り、*sおよび sの。

説明

2⊥⍣¯1⊢⎕       Convert input to binary (returns a transposed matrix of 1s and 0s)
              Transpose
' *'[ ... ]    Index into this string

で6バイトを節約' *'[⍉2⊥⍣¯1⊢⎕]
アダム

@Adámヒントをありがとう、を削除できるとは知りませんでした¨
KritixiのLithos

3

T-SQL、290バイト

declare @ int;select @=max(log(a,2))+1from @i;with t as(select convert(varchar(max),a%2)b,a/2c,@-1m,ROW_NUMBER()over(order by(select 1))r from @i union all select convert(varchar(max),concat(c%2,b))b,c/2c,m-1,r from t where m>0)select replace(b,0,' ')from t where m=0group by r,b order by r

用途 1レンガの破片にします。入力はテーブルからのものと想定しています@

Ungolfed、いくつかの説明付き

-- assume input is presented in an input table
declare @input table (a int)
insert into @input values (15), (7), (13), (11)

---- start here

-- figure out how many characters are needed, by taking log2
declare @max int
select @max = max(log(a, 2)) + 1
from @input

-- recursive cte
-- will join against itself, recursively finding each digit in the binary string
;with cte as
(
    select 
        convert(varchar(max), a % 2) as b, -- is the least significant bit 1 or 0
        a / 2 as c, -- remove least significant bit, for the next run
        @max - 1 as max, -- keep track of iterations left
        ROW_NUMBER() over (order by (select 1)) as rn -- keep the order of the input
    from @input

    union all -- recursive loop
              -- below columns follow the same pattern

    select convert(varchar(max), 
        concat(cte.c % 2, cte.b)) as b, -- prepend the current binary string with the newest least significant bit
        cte.c / 2 as c, 
        cte.max - 1, 
        cte.rn
    from cte
    where cte.max > 0
)
select replace(b, 0, ' ') -- swap 0s for space
from cte
where max = 0 -- only take the last iteration
group by rn, b -- grab each unique input, 
               -- need to group by row number so it can be ordered by
               -- need to group by binary string, so it can be selected
order by rn -- sort by the order the input arrived in

3

Mathematica、40バイト

Grid@PadLeft@IntegerDigits[#,2]/. 0->""&

レンガは1

Mathematica、48バイト

Grid@PadLeft@IntegerDigits[#,2]/.{0->"",1->"#"}& 

レンガは#


で必要なスラッシュは1つだけです//.。(/.「一度交換」を//.意味し、「物の変化が止まるまで交換を続ける」ことを意味します。)
ツリーではない

OK-

IntegerDigits関数では、コンマの後にスペースは必要ありません。
マーク

はい、わかっています。これは、notebook.fixedからコピー/貼り付けを行うと発生します
-J42161217

2

C#(.NET Core)112 + 18 = 130 86 + 41 = 127バイト

a=>a.Select(n=>C.ToString(n,2).Replace("0"," ").PadLeft(C.ToString(a.Max(),2).Length))

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

バイトカウントにはから41バイトが含まれますusing System.Linq;using C=System.Convert;1壁のキャラクターとして使用します。それにもかかわらず、これはC#でも長すぎます...


namespace System.Linq{}いくつかのバイトを保存するために配置します。a.Max()真実であることが保証されています(バイナリ:Pで最も賢くないのは確かです)。うclass Convert{}任意のバイトを保存しますか?
TheLethalCoder

1
特定の名前空間にプログラムを配置する場合、ラムダだけでなくプログラム全体を送信する必要はありませんか?そのためのルールについてはよくわかりません
チャーリー

私は通常、ラムダを使用して名前空間に配置しました。私はそれについてこれまでに質問があったとは思いませんし、それはC#のヒントページにあります。
TheLethalCoder

静的インポートを使用せずにコンパイルすることはできないため、これは有効ではないと思います。
メタコロン

2
@MetaColonが、using System.Linq;using C=System.Convert;バイトカウントにバイトを追加した理由です。これら2つのusingディレクティブは、コードをコンパイルするために必要です。
チャーリー

2

網膜、63バイト

.+
$*#<
+`(#+)\1
$1 
 #
#
{T`<`_`^(<.+(¶|$))+$
m`^<
 <
(.)<
<$1

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

.+
$*#<

単項に変換し、接尾辞aを付けます<

+`(#+)\1
$1 
 #
#

バイナリに変換します。

{T`<`_`^(<.+(¶|$))+$

すべて<のが左側に達したら、それらをすべて削除します。

m`^<
 <

<すでに左側に到達しているの前にスペースを挿入します。

(.)<
<$1

すべての<sを1ステップ左に移動します。すすぎ、繰り返します。


2

パワーシェル、100バイト

$args|%{if(($c=($a=[convert]::ToString($_,2)).length)-gt$l){$l=$c}$a-replace0,' '}|%{$_.padleft($l)}

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

ああ、convertPowerShellでバイナリを実行するのはとてもつらいです。プラス.lengthYへの呼び出しスペースで、プラス長いです-replace0.padLeft()それらをすべて同じにする呼び出し.length、すべてが長い提出につながります。

100を下回るゴルフの提案は大歓迎です。



2

Clojure、185バイト

(fn[i](let[b(map #(Long/toBinaryString %)i)](map #(clojure.string/replace(clojure.string/replace(format(str"%0"(reduce(fn[l i](max l(count i)))0 b)"d")(read-string %))"1""#")"0"" ")b)))

ゴルフされていないバージョン:

(fn [i]
    (let [b (map #(Long/toBinaryString %) i)]
        (map
            #(clojure.string/replace
                (clojure.string/replace
                    (format
                        (str "%0"
                            (reduce
                                (fn [l i] (max l(count i))) 0 b)
                            "d")
                        (read-string %))
                        "1"
                        "#")
                "0"
                " ")
        b)))

引数をリストとして受け取る匿名関数。行をリストとして返します。

他の答えを読んで、もっと小さいかもしれないと思います。clojure.string/replaceわいせつな量の文字を書きます。


2

Japt33 30バイト

¡'0p(¡X¤lÃn o)-X¤l)+X¤)£" *"gX

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

@Justin Marinerのおかげで3バイト節約

説明

¡                              // map input integers
    (¡X¤lÃn o)                 // longest binary string length
              -X¤l)            // minus current binary string length
 '0p                           // repeat zero
                   +X¤)        // concat with current binary string
                       £       // map chars of binary string
                        " *"gX // swap 0 and 1 with ' ' and '*'

あなただけの文字列の配列を返すために、最後の3つの文字を削除し、使用することができ-R、改行に参加して出力を確認するためのフラグ(バイト数に追加されていないが):ここ
ジャスティンマリナー

2

Pythonの392の 90バイト

lambda a:[' '*(len(bin(max(a)))-len(i)-2)+i for i in[bin(i)[2:].replace(*'0 ')for i in a]]

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

行のリストを返します。それらを積み重ねると、実際に適切に整列することがわかります。

['111 ', ' 1  ', ' 11 ', '  1 ']
>>>
 111 
  1  
  11 
   1 

内訳

基本的に配列をバイナリに変換し、すべての0をスペースに置き換えます。Nスペースの数は、各行の先頭に追加されN = [length of longest line] - [length of line]ます。

-1 bytes Xoder氏に感謝

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


出力に先頭または末尾のスペースを含めることはできません。
TheLethalCoder

@TheLethalCoderああ、ルールを読み間違えたに違いありません!キャッチしてくれてありがとう。
グラビトン

90のバイトは、交換してください'0',' '*'0 '
ミスターXcoder

@ Mr.Xcoderああ、興味深いことは考えたことがないでしょう。ありがとう!
グラビトン


2

Java 7、130 108 88バイト

@TheLethalCoderのおかげで22を保存@Xanderhallのおかげで20を保存

void a(int[]b){for(int i:b)System.out.println(Long.toBinaryString(i).replace('0',' '));}

ゴルフをしていない:

void a(int[]b){
    for(int i:b)
        System.out.println(Long.toBinaryString(i).replace('0', ' '));       
}

1
バイトを保存するためのインクリメントiをポストしますb[i]。を使用して出力を保持できる1ため、.replace('1','*')。代わりにJava 8を使用し、ラムダにコンパイルしてバイトを節約します。したくない場合はint[]b、バイトを節約します。
TheLethalCoder

ありがとうございました!「1バイトを保存するためにb [i]でiをインクリメントする」ことを説明してください。手段?
Javaゴンザー

i++評価しi、それをインクリメントします(++i反対のことを行います)のでi++forループの外に移動してb[i++]代わりに使用できます。ああ、私たちがそれをしている間、あなたはループの中に1行しかないので、中括弧は必要ありません。
TheLethalCoder

本当だ!アメージングは、あなたに感謝
JavaのGonzar

2
ループをforeachループに切り替えることで、数バイトを節約できます。for(int x:i)また、Long.toBinaryString整数バージョンの代わりに3バイトを節約できます。
ザンダーホール

1

Python 2、217バイト

2時間のコーディングの後、私はnumpyがこれにとって悪い考えだと決めました

import numpy as n
i=n.loadtxt("i")
o=[n.copy(i)]
o[0].fill(10)
while n.count_nonzero(i)>0:
 o.append(i%2+32)
 i=n.vectorize(lambda x:x//2)(i)
print n.fliplr(n.array(o).T).astype('uint8').view('c').tostring().decode()

Ubuntuでの使用

numpyをインストールする

python2 -m pip install numpy

i入力形式のファイルを作成します14 4 6 2

走る

python2 prog.py

1

8日、232 254 250バイト

コード

0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ( nip /1/ "*" s:replace! . cr ) a:each drop

コメント付きの未ゴルフバージョン

\ convert to binary and save longest string length
: f 0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop ;

\ pad binary number with zero
: f1 a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop ;

\ replace every 0 with space
: f2 a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ;

\ replace every 1 with * and print each line of bricks
: f3 ( nip /1/ "*" s:replace! . cr ) a:each drop ;

これらの単語は順番に呼び出す必要があります(例を参照)

使用法と例

ok> [15,7,13,11] 0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ( nip /1/ "*" s:replace! . cr ) a:each drop
****
 ***
** *
* **

またはより明確に

ok> [15,11,15,15] f f1 f2 f3
****
* **
****
****


1

Excel VBA、170 161バイト

ゴルフ

1 2 3 .. n範囲から形式の入力を[A1]取得し、対応するバイナリウォールを範囲を介してVBEイミディエイトウィンドウに出力する匿名VBEイミディエイトウィンドウ関数[B1,C1,2:2]

n=Split([A1]):[A2].Resize(1,UBound(n)+1)=n:[C1]="=Int(1+Log(B1,2))":For Each i In n:[B1]=i:?Replace(Replace([Right(Rept(0,C1)&Dec2Bin(B1),C1)],1,"*"),0," "):Next

フォーマット済み:

n=Split([A1])
[A2].Resize(1,UBound(n)+1)=n
[C1]="=Int(1+Log(B1,2))"
For Each i In n
[B1]=i
?Replace(Replace([Right(Rept(0,C1)&Dec2Bin(B1),C1)],1,"*"),0," ")
Next

非ゴルフ

Subフォーマットの入力をArray(1, 2, 3...)受け取り、対応するバイナリウォールを範囲を介してVBEイミディエイトウィンドウに出力する完全なルーチン[A1,B1,2:2]

Sub a(ByRef n As Variant)
    Let Range("A1").Resize(1,UBound(n)+1) = n
    Let Range("C1").Value = "=Int(1+Log(A1,2))"
    Dim i As Integer
    For Each i In n
        Let Range("A1").Value = i
        Debug.Print Replace(
                            Replace(
                                    [Right( Rept( 0, C1) & Dec2Bin( B1), C1)],
                                    1,
                                    "*"
                            ),
                            0,
                            " "
                    )
    Next
End Sub

1

、20バイト

WS«⸿≔IιιWι«←§ *ι≧÷²ι

オンラインでお試しください!リンクは、コードの詳細バージョンです。各入力番号を手動でバイナリに変換しますが、右から左の順序で印刷することにより機能します。Charcoalにはリストを入力する良い方法がないため、改行で終わる文字列として入力を受け取ります。

WS⊞υIιW⌈υ«Eυ﹪κ²↓⸿≧÷²υ

オンラインでお試しください!リンクは、コードの詳細バージョンです。このバージョンは入力配列に対してベクトル化されますが、その出力は-バイトを節約するsにハードコードされます。

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