数値からバイナリパスを出力する


22

nを満たす整数の場合n > 0、その値をバイナリ表現に基づいて右下がりのパスとして書き込みます。

ルール

  • 最初の(最上位の)セットビットは常に左上隅にあります。
  • 次のビットが設定されている場合(a 1)、描画された前の文字と同じ列の次の行に文字(「塗りつぶし」)を描画します。空白(「空」)を使用して塗りつぶしてみてください。ただし、常に同じ文字であれば、どの文字でも使用できます。
  • 次のビットが設定されていない場合(a 0)、描画された前の文字のすぐ右側の同じ行に文字(「塗りつぶし」)を描画します。
  • コードは、少なくとも20の有効ビットを持つ数値をサポートする必要があります。
  • 完全なプログラム、関数、ラムダなどを書きますが、スニペットは書きません。
  • 先行スペース(または「空の」文字)/行は許可されません
  • 任意の数の末尾のスペース(または「空の」文字)/行を許可
  • 数値、文字列、ブール値の配列など、あらゆる種類の1D入力が受け入れられます。ビットの順序は変更しないでください。
  • あらゆる種類の視覚的な2D出力が受け入れられます。stdoutでは、文字列( "filled"と "empty"を表す2つの異なる値)で、必要に応じてマトリックスを出力することもできます。数字のリストを「見出しスペースなし」の規則と調和させるのは難しいようですが、それを使用する方法を見つけたら私はそれを受け入れます。注:文字列を印刷または返すことを選択した場合、使用する文字はコードポイント範囲[32-126]のASCII文字でなければなりません。
  • 標準的な抜け穴は禁止されています。
  • これはcodegolfなので、最短のコードが優先されます。

入力:1

*

入力:2

**

入力:3

*
*

入力:4

***

入力:5

**
 *

入力:6

*
**

入力:7

*
*
*

入力:25

*
***
  *

入力:699050

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

入力:1047552

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

入力:525311

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


「ブールの許可入力配列は」配列として数のバイナリ表現の形式で入力を服用が許可されていることを意味ですか?
NIT

3
@Nit任意の種類の1D入力。そのため、数値が5の場合[1,0,1]、はいに似た入力配列があります。
オリビエグレゴワール

それで、そのフォーマットは本当にどれくらい自由ですか?私はそうするので、最後に移動最初の1と二進数として数を取るしたい9です1001、私は私の入力はなりたいです0011。それは大丈夫ですか?
トンホスペル

最初のビットを1最初にすることは課題の一部であり、そのビットを(再)移動することは課題を単純化することになるので、@ TonHospelとは言わないでください。ただし、プログラムの入力から削除できます。
オリビエグレゴワール

回答:


7

ゼリー、8 バイト

¬œṗ+\Ṭz0

1と0のリストとして数値を受け入れるモナドリンク(たとえば13is [1,1,0,1])は、1と0のリストのリストを返します。最初のリストは最初の行です。

オンラインでお試しください!またはフォーマットされたテストスイートを見る

どうやって?

¬œṗ+\Ṭz0 - Link: list L           e.g. [1,1,0,0,1,1,0,1] (i.e. 205)
¬        - logical NOT L               [0,0,1,1,0,0,1,0]
    \    - cumulative reduce L by:
   +     -   addition                  [1,2,2,2,3,4,4,5]
 œṗ      - partition @ truthy indices  [[1,2],[2],[2,3,4],[4,5]]
     Ṭ   - un-truth (vectorises)       [[1,1],[0,1],[0,1,1,1],[0,0,0,1,1]]
      z0 - transpose with filler 0     [[1,0,0,0],[1,1,1,0],[0,0,1,0],[0,0,1,1],[0,0,0,1]]
         -                        i.e.  1000
                                        1110
                                        0010
                                        0011
                                        0001

11

MATL、14バイト

J_iB^YsJ+'o-'&XG

座標(0,0)から始まるパスとしてグラフィカル出力を生成します。MATL Online試しくださいまたは、以下のオフラインの例をご覧ください。

  • 入力7

    ここに画像の説明を入力してください

    出力:

    ここに画像の説明を入力してください

  • 入力699050

    ここに画像の説明を入力してください

    出力:

    ここに画像の説明を入力してください

必要に応じて、9バイトの複雑な座標としてパスを確認できます

J_iB^YsJ+

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

説明

J_      % Push -1j (minus imaginary unit)
i       % Push input number
B       % Convert to binary. Gives an array of 0 and 1 digits
^       % Power, element-wise. A 0 digit gives 1, a 1 digit gives -1j
Ys      % Cumulative sum. Produces the path in the complex plane
J+      % Add 1j, element-wise. This makes the complex path start at 0
'o-'    % Push this string, which defines plot makers
&XG     % Plot

7

MATL、10バイト

YsG~YsQ1Z?

2進数の配列を入力します。マトリックスを出力します。

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

説明

Ys    % Implicit input: array of binary digits. Cumulative sum. This gives the
      % row coordinates
G     % Push input again
~     % Negate: change 0 to 1 and 1 to 0
Ys    % Cumulative sum
Q     % Add 1. This gives the column coordinates
1Z?   % Matrix containing 1 at those row and column coordinates and 0 otherwise.
      % Implicit display


6

22 20 19 11 10 バイト

F⮌S¿Iι↑*←*

これまでのところ、私の2番目の炭の答えだけです。

入力をbinary-String(つまり)699050として受け取ります10101010101010101010

後方にループすることを提案する@Neilのおかげで-9バイト。

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

説明:

STDINを逆の順序で文字列として読み取ります。

Reverse(InputString())
⮌S

文字列として2進数をループしますι

For(Reverse(InputString()))
F⮌S

ι数値が1にキャストバックされた場合、*上方向に印刷し、そうでない場合*は左方向に印刷します。

If(Cast(i)) Print(:Up,"*"); Else Print(:Left,"*");
¿Iι↑*←*

1
これは、文字列を逆に印刷し、最後から始めて左に向かって作業する場合の半分の長さです。
ニール

@Neil OK、今修正する必要があります。ありがとう!-8バイト
ケビンクルーッセン

1
{}sを削除して別のバイトを保存します。
ニール

1
Baseまったく必要ないので1バイトしかかかりませんCastF⮌↨N²¿ι↑*←*
ニール

1
@KevinCruijssen返信が遅くなって申し訳ありませんが、質問に答えてください。Charcoal -vはゴルフ言語として設計されているため、入力と理解を容易にするために冗長モードを追加しました。(必要に応じて追加できます)。-a以下のために短く、--astP(そしてそれは:私は、私はできるだけ少ない労力などと簡潔コードを理解するのに役立つ(ところでPyTekから取られたフォーマットを)これを追加しました本当にあなたが誤って引数の順序を台無しにしましたときに役立ちます)。また、それ-l別のオプションではありません。(-hコマンドライン引数のヘルプ/説明のためだけに行う)
ASCIIのみ

6

C#(.NETコア)155の 123 120 113 101バイト

入力がビットの配列として受信できるため、32バイトを節約しました。
@auhmaanのおかげで7バイト節約されました。
@KevinCruijssenのおかげで10バイト節約されました。

n=>{var m="";for(int i=0,c=1;i<n.Length;)m+=n[i++]<1?c++%1+"":(i>1?"\n":"")+"0".PadLeft(c);return m;}

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


あなたは変更できません+new string(' ',c)+"*"+"*".PadLeft(c)(7つのバイトが保存されますか)?
auhmaan

@auhmaanそうですね、ありがとう!
イアンH.

-4バイトの0代わりに印刷*if(n[i++]<1){m+="*";c++;}to if(n[i++]<1)m+=c++%1;および"*".PadLeft(c);to"0".PadLeft(c);
ケビンクルーイッセン

ので補正は、それが実際には-12バイトですm+=:今、三元、もし可能m+=n[i++]<1?c++%1+"":(i>1?"\n":"")+"0".PadLeft(c);
ケビンCruijssen

1
@KevinCruijssenありがとう、を0使用し、三項演算子を使用するのは本当に賢いです!また、のケースを修正しました。最初に1に699060設定cするだけで、テストケースをチェックしているときにそれを見落としました。
イアンH.

5

05AB1E18 17 14バイト

γ€gć¸s>«1IÔ·ÌΛ

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

説明

γ€g             # Push the input as the array as chuncks of consecutive elements, map with length
   ć¸s>«        # Increment each value except the first one
        1I      # Push 1 and the input       
          Ô     # Push connected uniquified input (first elements of each chunck of consecutive elements in the input)
           ·Ì   # Map each with 2 * a + 2
             Λ  # Draw canvas :-)
  • @Emignaのおかげで3バイト

05AB1Eキャンバスの説明


1
γ€gć¸s>«1IÔ·ÌΛ4バイトを節約する必要があります。
エミグナ

@Emigna Brilliant、ありがとう!a + 2
ビルトイン


3

Haskell、65バイト

f(a:b)|a="*":f b|(x:y)<-f b=('*':x):map(' ':)y
f[]=["*"]
f.tail

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

入力をブール値のリストとして受け取ります。

カレーPAKCS、70バイト

u(a:b)=('*':a):map(' ':)b
f(a:b)|a="*":f b|1>0=u$f b
f[]=["*"]
f .tail

Haskellのポートの答えですが<-、カレーでは動作しないため、ヘルパー関数を作成する必要がありますu。また、間にスペースを追加する必要があるf.そのカレーがコンではなく、ドットとしてそれを解析します。

これはMCC Curryでも機能しますが、Sloth Curryでは機​​能しません(TIOでサポートされている唯一のものです)。



3

絵文字コード、251バイト

🐖🎅🏿🍇🍦b🔡🐕2🍦c🔤*🔤🍮e🔤🔤🍮y🔤🔤🍦k🍡b🔂i k🍇🍊😛🔡i🔤1🔤🍇🍊😛y e🍇🍉🍓🍇😀y🍉🍮y🔤🔤🍮y🍪e c🍪🍉🍓🍇🍮y🍪y c🍪🍮e🍪🔤 🔤 e🍪🍉🍉😀y🍉

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

これは間違いなくゴルフによる解決策ではありませんが、絵文字コードをゴルフ言語と見なす生きている人はいません。しかし、言語のこの極悪さを自分自身に教える前に、絵文字コードの構文である恐怖に身をさらす過程で、私はそれがどれほど強力で効率的であるかだけで嬉しく驚きましたve

説明:

🐋 🚂 🍇    👴 Define Class
🐖🎅🏿🍇    👴 Define Method
🍦b🔡🐕2    👴Convert Input integer to binary string
🍦c🔤*🔤    👴 asterisk string
🍮e🔤🔤    👴 Spacing string
🍮y🔤🔤    👴 output string
🍦k🍡b    👴 translate to iteratable
🔂i k🍇    👴 for-in loop to iterate over each digit 
🍊😛🔡i🔤1🔤🍇    👴 if digit is 1:
🍊😛y e🍇🍉    👴 don't print initial newline
🍓🍇😀y🍉    👴 print spaces + asterisks
🍮y🔤🔤    👴 reset output string
🍮y🍪e c🍪🍉    👴 add correct number of spaces and one asterisk
🍓🍇    👴 if digit is 0:
🍮y🍪y c🍪    👴 add an asterisk to the output string
🍮e🍪🔤 🔤 e🍪    👴 add another space to the space string
🍉🍉
😀y    👴 print one last output string
🍉🍉
🏁🍇    👴 Start Program
 🎅🏿 699050    👴 Call Method
🍉

2

JavaScript(ES6)、48バイト

以下の再帰バージョンと同じI / O形式と同じロジック。

a=>a.map((n,i)=>n?i&&p+0:+(p+=' '),p=`
`).join``

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

または、この形式の場合は42バイトが受け入れられる。


再帰バージョン、56バイト

入力を整数の配列(0または1)として受け取ります。0塗りつぶしに使用し、空にスペースを使用します。

f=([n,...a],p=`
`,x=0)=>1/n?(n?x+0:+(p+=' '))+f(a,p,p):a

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

コメント済み

f = (               // f = recursive function taking:
  [n, ...a],        //   n = current bit; a[] = remaining bits
  p = `\n`,         //   p = padding string, initialized to a linefeed
  x = 0             //   x = 0 on the 1st iteration / equal to p after that
) =>                //
  1 / n ?           // if n is defined:
    ( n ?           //   if n = 1:
        x + 0       //     append x + 0 --> either the integer 0 on the first iteration
                    //                      or the padding string followed by a '0'
      :             //   else:
        +(          //     append the integer 0 (whitespace coerced to a number)
          p += ' '  //     and append a space to the padding string
        )           //
    ) + f(a, p, p)  //   append the result of a recursive call with x = p
  :                 // else:
    a               //   append the empty array a[], forcing coercion to a string

2

Bash + GNUユーティリティ、38

dc -e?2op|sed 's/\B1/^K^H*/g;s/[10]/*/g'

ここ^K^Hは、リテラルの垂直タブとバックスペース制御文字です。これらはブラウザではうまくレンダリングされないため、このスクリプトは次のように再作成できます。

base64 -d <<< ZGMgLWU/Mm9wfHNlZCAncy9cQjEvCwgqL2c7cy9bMTBdLyovZyc= > binpath.sh

ターミナルで実行します。入力はSTDIN経由です。

この答えは仕様を拡張しすぎる可能性があります-実際には、出力の各行に先頭の文字がありません-すべての位置決めは制御文字で行われます。これが長すぎる場合は、出力が|col -x|tacさらに11バイトパイプされます。


2

バッチ、113バイト

@set s=
:l
@shift
@if %1.==0. set s=%s%+&goto l
@echo %s%+
@if not %s%.==. set s=%s:+= %
@if %1.==1. goto l

ビットのリストをコマンドライン引数として受け取ります。展開の中で特別な意味を持つため、+代わりに使用します。**%s:...=...%


2

ジャワ10、100の 106バイト

b->{var s="";int i=0,j;for(var c:b){if(c)for(s+="\n",j=i;j-->0;)s+=0;else++i;s+=1;}return s.substring(1);}

ブール値の配列を取り、文字列を返します(0sは空、1sは塗りつぶされます)。こちらからオンラインでお試しください

オリヴィエ・グレゴワールに感謝ゴルフをもう少し手伝ってくれて、私の出力形式が仕様に合っていなかったという事実をてくれて。

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

b -> { // lambda taking an array of booleans as argument
    var s = ""; // the output String
    int i = 0,  // the number of "empty" characters to output
    j;          // iterator variable for outputting the "empty" characters
    for(var c : b) { // iterate over the boolean array (the binary digits)
        if(c) // if it's a '1'
            for(s += "\n", // output a newline
            j = i; j-- > 0;) s += 0; // output the "empty" characters
        else // if it's a '0'
            ++i; // move one to the right on the next line
        s += 1; // output the "filled" character
    }
    return s.substring(1); // output the constructed String, minus the leading newline
}

:私は5バイトgolfed{if(c){s+="\n";for(j=i;j-->0;)s+=0;}else++i;s+=1;}
オリヴィエ・グレゴワールの

さらに:{if(c)for(s+="\n",j=i;j-->0;)s+=0;else++i;s+=1;}
オリビエグレゴワール

ただし、最初の行ではなく、2番目の行に印刷します。課題から:「先頭のスペース(または「空の」文字)/行は許可されない」
オリビエグレゴワール

@OlivierGrégoireありがとう。編集しました。
OOBalance


1

Haskell、126バイト

(#)n=maximum.map(!!n)
f l|s<-scanl1(zipWith(+))$(\a->[1-a,a])<$>l=unlines[[last$' ':['#'|elem[x,y]s]|x<-[0..0#s]]|y<-[1..1#s]]

ゼロと1のリストとして入力します。数値をオフセットに変換しx↦[1-x,x]、部分和を計算します。最終出力は、ネストされた2つのリスト内包表記で行われます。

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


1

R、59バイト

function(n,x=sum(n|1))matrix(1:x^2%in%cumsum((n-1)%%x+1),x)

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

入力をビットの配列として受け取ります。

ブール行列を返すTRUEFALSE表す*と、、それぞれ、。

また、テストを容易にするために、上記の仕様に対応するマトリックスを印刷するために、フッターにいくつかのものがあります。


1

APL + WIN、65または46バイト

整数の入力を求める

n←+/i←((1+⌊2⍟n)⍴2)⊤n←⎕⋄m←(n,n)⍴' '⋄m[⊂[2](+\i),[1.1]1++\~i]←'*'⋄m

または整数のバイナリ表現の数値ベクトル

m←(2⍴+/n←⎕)⍴' '⋄m[⊂[2](+\i),[1.1]1++\~i]←'*'⋄m

特定の回答に対するコメントを正しく読んでおり、後者の入力が許可されていると仮定します。


1

Pyth、23バイト

p\*VtQINp+b*Zd.?=hZ)p\*

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

説明

p\*VtQINp+b*Zd.?=hZ)p\*
p\*                       Print the leading *.
   VtQ                    For each bit (excluding the leading 1)...
      IN      .?   )      ... If the bit is set...
        p+b*Zd            ... Print a newline and a bunch of spaces...
                =hZ       ... Otherwise, increase the count of spaces...
                    p\*   ... Then print the next *.


1

SmileBASIC、64 59 57バイト

INPUT N@L
GPSET X,Y
B=N<0X=X+B
Y=Y+(X>B)N=N<<1ON!N GOTO@L

最上位ビット(符号ビット)がチェックされ、1の場合、X位置が増加します。符号ビットがX位置よりも小さい場合(つまり、符号ビットが0でXが0でない場合)、Y位置が増加します。

最初の動きは常に水平方向であるため、Yの動きは最初のXの動きが終わるまでブロックされます。これにより、先頭の0ビットの間にY位置が増加しないことが保証されます。

次に、Nが左にシフトされ、Nが0に達するまでこれが繰り返されます。



1

Japt19 17バイト

Ë?R+Tî +QT©Qìx
Ë?                 // Map over the input and if the current value is 1:
  R+               // Return a new line and
    Tî +           // a space repeated T (with initial value 0) times and
        Q          // a \".
         :         // If the current value is 0:
          °T       // Increment T
            ©Q     // and return \".
              Ã    // When all of that is done,
               ¬   // turn the array into a string
                x  // and trim it, removing the excess new line at the start.

入力をビットの配列として[1,0,1]受け取ります。たとえば、の"代わりに出力です*Oliverの
おかげで2バイト削った

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


良いですね。あなたは置き換えることができSpT- îに似てpデフォルトにそれを除けば、" "。また、次のショートカットがありq ます¬
オリバー

@Oliverありがとう、私は知らなかったî、確かに非常に便利。私は頻繁にショートカットを使用する機会をチェックしますが、私はいつもそれらのいくつかを欠場しています。あなたの助けに感謝します。
Nit

1

Python 2、113バイト

def f(a):
 o='*';r=[o]
 for i in bin(a)[3:]:
  if'0'<i:r+=[' '*len(r[-1][1:])]
  r[-1]+=o
 print'\n'.join(r)

これがカウントされるかどうかはわかりません(各行の配列を出力します)が、そうであれば、バイトカウントを103に変更します。

def f(a):
 o='*';r=[o]
 for i in bin(a)[3:]:
  if'0'<i:r+=[' '*len(r[-1][1:])]
  r[-1]+=o
 print r

1

TI-Basic(TI-84 Plus CE)、85バイト

Prompt L
1→X
1→Y
DelVar [A]
sum(LL
{Ans,1-Ans+dim(LL→dim([A]
1→[A](Y,X
For(I,2,dim(LL
Y+LL(I→Y
X+not(LL(I→X
1→[A](Y,X
End
[A]

ブールリストを要求し、0と1のマトリックスを返します。

リストを調べて、次の「ビット」が0の場合はXをインクリメントし、そうでない場合はYを変更してから、その位置のマトリックスに1を追加し、最後にマトリックスを返します。

TI-Basicは、トークン化された言語です。

  • 1バイト:Prompt L* 6、(改行)* 12、1* 5、* 7、X* 5、Y* 5 sum(L* 5 {Ans* 2、,* 5 -+* 3、dim(* 3、(* 4、 For(I* 3、2not(End = 73バイト
  • 2バイト:Delvar [A] * 5 = 12バイト
  • 合計:85バイト

TI-Basic(TI-84 Plus CE)、56バイト

Prompt L
1→X
1→Y
Output(Y,X,"*
For(I,2,dim(LL
Y+LL(I→Y
X+not(LL(I→X
Output(Y,X,"*
End

上記と同じプロセスですが、マトリックスに追加する代わりに、グラフィカル出力(画面サイズの制限:10行、26列、最大10 1と25 0)を使用します。


1

Pyth、30バイト

JZFG.BQIsGIJk)p+*ZdN.?pN=hZ)=J

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

"代わりに使用*

Python 3の翻訳:
Q=eval(input())
Z=0
J=Z
for G in "{0:b}".format(Q):
    if int(G):
        if J:
            print()
        print(Z*' '+'"',end='')
    else:
        print('"',end='')
        Z+=1
    J=Q

1

x86 .COM、32バイト

00h: 66 D1 E6 66 0F BD CE BF 24 AD 8E DF 41 66 0F A3 
10h: CE 19 DB 81 E3 9E 00 8D 79 02 C6 05 2A E2 EE C3 

fun:
shl esi, 1
bsr ecx, esi
mov di, $ad24
mov ds, di
inc cx
lab2:
bt esi, ecx
sbb bx,bx
and bx,158
lea di,[di+2+bx]
mov [di],byte '*'
lab1:loop lab2
ret  

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