私のメールをマークしてください!-ASCIIバーコード


39

4ステートバーコード

多くの郵便サービス(英国郵政、カナダ郵便、米国郵便など)は、4州のバーコードを使用して郵便に関する情報をエンコードします。ASCIIでレンダリングされると、次のようになります。

| | | | | | | | | |
| | | | | | | | | | | | | | | | |
    | | | | | | | |

4ステートバーコードはバーの列です。各バーは上向き、下向き、またはその両方に延長でき、4つの可能性があります。これは、各バーが基本的に4桁を表すことを意味します。

            | |
バー:| | | |
                | |

数字:0 1 2 3

このシンボルの問題は、各バーコードが有効な異なるバーコードであるということです。向きが間違っていると、意味が大幅に変わります。そのため、通常、開始停止のシーケンスが実装されるため、スキャナーはどの方向に読み取られるべきかを計算できます。

この課題のために、Australia Postが指定する開始/停止シーケンスを使用します。各バーコードは1 0シーケンスで始まり、シーケンスで終わります。


チャレンジ

あなたの仕事は、正の整数が与えられたN場合にASCII 4状態バーコードに変換するプログラムまたは関数を書くことですN

例:

整数が与えられた場合19623、最初にそのbase-4表現に変換し10302213ます。

次に、各桁を対応するバーにマッピングします。

1 0 3 0 2 2 1 3

| | | |
| | | | | | | |
    | | | |

最後に、開始/停止シーケンスを追加します。

始まりと終わり:
1 0 1 0

| | | | | |
| | | | | | | | | | | |
        | | | |

結果のバーコードがプログラムの出力になります。


ルール:

  • 入力は、言語の標準整数サイズの範囲内の正の整数になります。
  • 出力:
    • 行のリスト、または改行を含む文字列のいずれかです。
    • 形状がそのままである限り、先頭または末尾の改行/スペースを含めることができます。
    • 上記の形式でバーコードを表示する必要があります-バーを描画するときにパイプ文字(|)とスペース文字()を使用する必要があり、各直立バーの間に1つのスペースが必要です。
  • これはなので、最短のプログラム(バイト単位)が勝ちです!

テストケース

4095:

| | | | | | | |  
| | | | | | | | | |
    | | | | | |    

4096:

| | |  
| | | | | | | | | | |

7313145:

| | | | | | | | | |  
| | | | | | | | | | | | | | | |
      | | | | | | | |      

先行スペースは許可されますか?;)
エリック・ザ・アウトゴルファー

@FlipTack このシンボルの問題 -あなたはブーンドックセインツを見たことがないでしょうか?
主ファルカード

@EriktheOutgolfer文字の2Dマトリックスとしての実際のバーコードが無傷である限り、必要に応じて前後にスペースを入れることができます。
FlipTack

他のバーコードに関連する課題:123
FlipTack

出力の先頭にゼロを付けることはできますか?
user230118

回答:



9

MATL34 30 29 28バイト

TFiK_YAyhhH&\EQE+t~vB!P'|'*c

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

説明

TF      % Push array [1 0] (start sequence)
i       % Push input
K_YA    % Convert to base 4. Gives an array of 4-ary digits
y       % Duplicate from below: pushes [1 0] again (stop sequence)
hh      % Concatenate horizontally twice. Gives array of 4-ary digits
        % including start and stop sequences
H&\     % Two-output modulo 2: pushes array with remainders and array
        % with quotients of dividing by 2
EQE     % Times 2, plus 1, times 2, element-wise. This effectively
        % multiplies each entry by 4 and adds 2
+       % Add element-wise to the array of remainders. The stack now 
        % contains an array of numbers 2, 3, 6 or 7. Each number
        % encodes, in binary form, a column of the output. The
        % previous multiplication of the quotients by 4 will have the
        % effect of shifting one row down (one binary digit upwards),
        % to make room for the central row. The addition of 2 will
        % create the central row, which is always full
t~      % Duplicate, logical negate. Gives an array of zeros of the
        % same length
v       % Concatenate vertically into a 2-row matrix
B       % Convert to binary. Gives a matrix, where each row is the
        % binary representation of one of the numbers of the input
        % matrix, read in column-major order
!P      % Transpose, flip vertically
'|'*    % Multiply by '|'. This transforms 1 into 124 (ASCII code of
        % '|') and leaves 0 as is
c       % Convert to char. Char 0 is shown as space. Implicitly display

8

ゼリー16 15バイト

4;jƓb|ṃ⁾| ẎZṙ2G

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

使い方

4;jƓb|ṃ⁾| ẎZṙ2G  Main link. No arguments.

4                Set the argument and the return value to 4.
 ;               Concatenate the return value with the argument, yielding [4, 4].
   Ɠ             Read an integer n from STDIN.
  j              Join, yielding [4, n, 4].
    b            Convert 4, n, and 4 to base 4. Note that 4 is [1, 0] in base 4.
     |           Perform bitwise OR of each resulting quaternary digit and 4.
                 This pads the binary representation of a digit d to three digits: 
                 [1, d:2, d%2]
      ṃ⁾|        Convert the results to base " |", i.e., binary where ' '
                 represents 0 and '|' represents 1.
          Ẏ      Concatenate the resulting arrays that correspond to 4, n, and 4.
           Z     Zip; transpose rows and columns.
            ṙ2   Rotate 2 units yo the left, correcting the order of [1, d:2, d%2]
                 to [d%2, 1, d:2].
              G  Grid; separate columns by spaces, rows by linefeeds.

この文字列の長さは15ユニコード文字ですが、どのように15バイトにすることができますか?
jmster

2
@jmsterゼリーが持つ独自のコードページを
氏Xcoder

@jmsterこれらは実際の文字ではありません。プログラムは、これらのニーモニックを持つ特定の15バイトです。バブルガムと比較すると、ほとんどのように見えますが.......、各ドットは異なるバイトを表しています。
FrownyFrog

追加する代わりにビット単位のORを使用する理由
FrownyFrog

@FrownyFrog両方とも機能します。次のステップはバイナリへの変換なので、ビット演算子を使用しました。
デニス


7

オクターブ78 77 75 74 70 69バイト

@(x)' |'(dec2bin([2 6 3 7;~(1:4)](:,[2 1 dec2base(x,4)-47 2 1]))-47)'

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

元のアプローチとは異なり、このアプローチでは単純なルックアップテーブルを使用して、ベース4の値を同等のバイナリにマップします。また、ルックアップテーブルは、各数字の間にゼロを追加することにより、各バーの間隔を追加します(すべてのスペースのバーにマップされます)。

ルックアップテーブルは、次のようにバーに直接マップします。

   base4:  0 1 2 3 -

  lookup:  2 6 3 7 0

  binary:  0 1 0 1 0
           1 1 1 1 0
           0 0 1 1 0

バイナリからへの変換|とは、 バイナリ変換のためのルックアップテーブルと基本的に同じ原理-今、これらの2つの文字の文字列にインデックス付けすることによって行われます。


* 1バイト保存、ありがとう@LuisMendo


元の:

@(x)['' circshift(dec2bin([a=[5 4 dec2base(x,4)-44 5 4];a*0](:))'*92,1)-4384]

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

バーコードを文字列として返す匿名関数。

これは、base4桁に4を追加すると、ビット1と2を交換したバイナリに変換された数でバー/スペースを表すことができるという事実に基づいています。

   base4:  0 1 2 3

    add4:  4 5 6 7

  binary:  0 1 0 1
           0 0 1 1
           1 1 1 1

swap 2/1:  0 1 0 1
           1 1 1 1
           0 0 1 1

ゴルフの観点からのトリッキーなビットは、バーの間にスペースを追加し、から0/1に変換すること'|'/' 'です。


1
@LuisMendo賢い!ありがとう。
トム・カーペンター

7

JavaScript(ES6)、89 87 83バイト

n=>`|  ${(g=(a,k=n)=>k?g(a,k>>2)+(k&a?'| ':'  '):' ')(1)}|
| |${g(~0)}| |
   `+g(2)

テストケース

どうやって?

NB:以下のバージョンでは、コードを適切にインデントできるように、テンプレートリテラルが標準の文字列に置き換えられています。

n =>                        // given the input n
  '|  ' +                   // append the top leading pattern
  (g = (a,                  // g is a recursive function taking a = mask
           k = n) =>        // and using k = value, initially set to n
    k ?                     //   if k is not zero:
      g(a, k >> 2) +        //     do a recursive call for the next group of 2 bits
      (k & a ? '| ' : '  ') //     append '| ' if the bit is set or '  ' otherwise
    :                       //   else:
      ' '                   //     append an extra leading space and stop the recursion
  )(1) +                    // invoke g() with mask = 0b01
  '|\n' +                   // append the top leading pattern and a linefeed
  '| |' +                   // append the middle leading pattern
  g(~0) +                   // invoke g() with all bits set in the mask
  '| |\n' +                 // append the middle trailing pattern and a linefeed
  '   ' +                   // append the bottom leading pattern
  g(2)                      // invoke g() with mask = 0b10

P:私は上に行くいくつかの奇妙なものがあります、この答えを説明見てみたい
ブライアン・H.

@BrianH。説明を追加しました。
アーナルド

4

R154 109バイト

function(n,d=c(1,0,n%/%4^floor(log(n,4):0)%%4,1,0),o=c(" ","|"))cat("",o[1+d%%2],"
",o[2+0*d],"
",o[1+(d>1)])

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

catマトリックスを構築し、を使用するのではなく、インデックス付けと使用、およびwriteベース4へのわずかに異なる変換からの6 を使用することにより、バイトの全体を保存しました。

インデックス付けは、他の回答とは異なり、モジュラー演算を使用して行われますが、Rは1ベースのインデックス付けを使用するため、算術演算は多少異なります。

説明:

function(n,
 d=c(1,0,                         # d contains the padding and 
   n%/%4^floor(log(n,4):0)%%4,   # the base 4 digits
   1,0),                         # 
 o=c("|"," ")                    # the vector to index into
 cat("",                         # cat separates things with spaces by default
                                 # so the empty string will print a leading space
  o[1+d%%2],"                    # odds have a | above
",                               # literal newline, a space will follow it (hence leading spaces)
 o[2+0*d],"                      # array of 2s since the middle is always |
",                               # another literal newline
 o[1+(d>1)])                     # digits greater than 1 have a | below


3

、50バイト

NθF²⊞υι¿θWθ«⊞υ﹪θ⁴≧÷⁴θ»⊞υθF²⊞υιE⟦ |¦|¦  ||⟧⪫E⮌υ§ιλω

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Nθ

数字を入力してください。

F²⊞υι

事前定義された空のリストに停止シーケンスをプッシュします。

¿θ

数が正の場合、

  Wθ«⊞υ﹪θ⁴≧÷⁴θ»

divmodを繰り返し適用して、逆ベース4に変換します

  ⊞υθ

それ以外の場合は、単にプッシュします。

F²⊞υι

開始シーケンスをリストにプッシュします。

E⟦ |¦|¦  ||⟧

3つの文字列にマップします。各文字列0123は、各行の数字のバーコード変換を表します。

⪫E⮌υ§ιλω

数字をマップし(通常の順序に逆戻り)、翻訳を使用してバーまたはスペースに変換し、結果を3つの文字列に結合します。これらの文字列は、暗黙的に別の行に出力されます。


3

Japt32 31バイト

A¤i2Us4)¬®n s|iS)ù2 w i|1ÃqR² y

オンラインでテストしてください!

これにはまだ満足していませんが、それは始まりです...

説明

A¤  i2Us4)¬ ®   n s |iS)ù2 w i |1Ã qR²  y
As2 i2Us4)q mZ{Zn s'|iS)ù2 w i'|1} qRp2 y
                                           Implicit: U = input, A = 10, R = newline, S = space
As2                                        Convert 10 to a binary string.
    i2   )                                 At index 2, insert
      Us4                                    the input converted to base 4.
          q                                Split into chars.
            mZ{                  }         Map each char Z to
               Zn                            Z converted to a number,
                  s'|iS)                     converted to base " |" (binary using ' ' as 0 and '|' as 1),
                        ù2                   left-padded to length 2 with spaces,
                           w                 reversed,
                             i'|1            with another pipe inserted at index 1.
                                   q       Join the resulting list on
                                    Rp2      a newline repeated twice (adds in blank columns).
                                        y  Transpose the entire string.
                                           Implicit: output result of last expression

あなたの32バイトは、この完全な混乱について少し気分が良くなります!私は、パイントを出したり飲んだりしながらゴルフをしようとすべきではありません!
シャギー


3

J57 49 47バイト

FrownyFrogのおかげで10バイト!

[:,.2{."0[:|:' |'{~#:@2 6 3 7{~1 0,4&#.inv,1,0:

使い方:

1 0,4&#.inv,1,0: -数値を基数4桁のリストに変換し、リストの最初と最後に1 0を追加します

((#:2 6 3 7){' |') -暗号化のルックアップテーブル。バイナリ0はスペースに対応し、1は「|」に対応

{~ -上記のルックアップテーブルから文字列を選択して、基本の4桁を暗号化します(引数は逆になります)

|: -結果の配列を3列から3行に転置します

[: -フォークのキャップ

,.2{."0 -バーの間にスペースを入れます

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


@FrownyFrogありがとう!
ガレンイワノフ

2

APL + WIN、63バイト

(⍉5 3⍴' | ||  |||||   ')[;,⍉(2 1,(1+((⌈4⍟n)⍴4)⊤n←⎕),2 1),[.1]5]

説明:

(⍉5 3⍴' | ||  |||||   ') create a matrix where columns represent bars plus one for separator spaces

(1+((⌈4⍟n)⍴4)⊤n←⎕) prompt for screen input and convert to base 4 and add 1 to convert to index origin 1

2 1,...,2 1 concatenate start stop

,[.1]5 concatenate separator space indices

(.....)[.....] index into bar matrix to display


2

05AB1E、19バイト

4BT.øS4~bT„| ‡øÁ€S»

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

これは、デニスのアプローチの半分のポートであり、以前に使用した方法よりも1バイト短いだけです(非常に満足しています)。

05AB1E、20バイト

4BT.øS2‰í1ýøT„| ‡€S»

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

使い方?

4BT.øS2‰í1ýøT„ | ‡€S»| 完全なプログラム。STDINから入力を受け取り、STDOUTに出力します。

4B | ベース4に変換します。
  T | 10をスタックにプッシュします。
   .ø| Surrond(10をベース4表現に追加および追加)。
     S | 個々の文字/数字に分割します。
                      + ------------------------------------------------- --------------
                      | この部分は、以前のバージョンでは¸4.ø4в〜でしたが、
                      | 意味:4で囲む、それぞれをベース4に変換する(4-> [1、0])
                      | そして最後にリストを深くフラット化します。
                      + ------------------------------------------------- --------------
      2‰| Divmod 2([N // 2、N%2])。
        í| 逆(要素ごと)。
         1ý| 中央に1を追加します(要素ごと)。
           ø| 転置。
            T„ | ‡| (‡)を "10"(T)から "|"(„ |)に変換します。
                 €S»| グリッドとしてフォーマットします。
                 €S | それぞれのキャラクターをプッシュします。
                   »| スペースで内部リストを結合しながら、改行で結合します。

私が求めているアドナンのグリッドブツについて(05AB1Eの作成者を)チャット、彼らは05AB1Eの特徴を指摘することによって、2つのバイトを保存する私を助け:改行でマルチdimenisionalリストを接合する際、内側のリストは、あまりにもスペースを使用して結合されています、したがってðý不要です。


2

APL(Dyalog Classic)、33バイト

' |'[≠\2/212 21 0(,,⊣)4⊥⍣¯1⊢⎕]

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


ああ、...あなたは1 0で囲むようになっている方法です
FrownyFrog

それでは2⊥⍣¯1、バイナリリストをどのように取得しますか?
FrownyFrog

@FrownyFrogサラウンドする真の方法はありません。はい、2⊥⍣¯1「2デコード」の逆(「表側」?)です。必要なビット数でバイナリにエンコードします。
NGN

2

J42 40 39バイト

' |'{~[:#:4#.2|.0|:4#:@+1 0(,,[)4#.inv]

デニスのおかげで2バイト削りました。ngnのおかげで1バイト。

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

使い方

                                4#.inv]      to base 4
                        1 0(,,[)             append (1 0) on both sides
                   4#:@+                     add 4 to each digit and convert to binary
                0|:                          transpose
             2|.                             rotate the rows
      [:#:4#.             from base 4 to base 2, it's supposed to separate the columns
' |'{~                                       to characters

2

JavaScript(ES6)79バイト

.toStringを使用して数値を基数4に変換してから、各行とビット単位のORでケースワークを作成して、行ごとに出力を作成します。行のリストを出力します。

n=>[2,3,1].map(d=>[...'10'+n.toString(4)+'10'].map(q=>(q|d)>2?"|":" ").join` `)

f = n=>[2,3,1].map(d=>[...'10'+n.toString(4)+'10'].map(q=>(q|d)>2?"|":" ").join` `)

console.log(f(19623))
console.log(f(4095))
console.log(f(4096))
console.log(f(7313145))


1
マップとビット単位のORを使用したクールなアプローチ!`10${n.toString(4)}10`:) を使用してバイト全体を保存できます
クリスM

2

Bash + coreutils、71 67バイト

dc -e4ddon?np|sed 's/./& /g;h;y/01/23/;G;y/12/21/;H;x;y/0123/ | |/'

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

説明

dcベース4へのビット変換、前置とで付加4(変身10出力)と使用してn一行にすべてを維持します。

残りは以下で発生しsedます:

s/./& /g;     Add a space after each digit
h;            Make a copy in hold space
y/01/23/;     Prepare up the second row (2/3 will turn to pipes)
G;y/12/21/;   Append what will be the third row and prep it (1/3 will turn to pipes)
H;x;          Prepend hold space
y/0123/ | |/  Make 1 and 3 pipes, 0 and 2 spaces

1
全くのsedへのDCの後の部分を変換すると、数バイト、節約tio.run/##S0oszvj/PyVZQTfVJCUlP88@r6CmODVFQb1YX09fTUE/...
KritixiのLithos

非常に素晴らしい!私はそのようなことを試みましたがx、ホールド/パターンスペースsを回してそれらを変更してから一度にすべてを行うさまざまな方法を試し続けましたが、何も短くなりませんでした。
ソフィア・レヒナー

@Cowsquackあなたのアイデアに基づいて、さらに2バイトを削減することができました!
ソフィア・レヒナー

音訳を組み合わせる素晴らしいアイデア、+ 1
Kritixi Lithos

1

網膜、83バイト

.+
$*
+`(1+)\1{3}
${1};
^
1;;
$
;1;;
1*;
$.&
.+
$&¶$&¶$&
T`13` `^.+
T`12` `.+$
\d
|

オンラインでお試しください!リンクには、より高速なテストケースが含まれています。説明:

.+
$*

単項に変換します。

+`(1+)\1{3}
${1};

;sで区切られた単項数として基数4に変換します。

^
1;;

開始シーケンスを追加します。

$
;1;;

を追加し;、区切り記号ではなく数字の終端記号に変換し、停止シーケンスを追加します。

1*;
$.&

10進数に変換しますが、各桁に1を追加します。

.+
$&¶$&¶$&

それを3つ。

T`13` `^.+

最初の行では、1sと3s(0sと2sを表す)がスペースになります。

T`12` `.+$

最後の行では、1sと2s(0sと1sを表す)がスペースになります。

\d
|

他のすべての数字はバーになります。


1

ピップ33 31 29 27 26バイト

25バイトのコード、-Sフラグの場合は+1 。

Y^aTB4WRt" |"@[y%2oMyy/2]

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

説明

4つのバータイプのパターンを観察します。

  • 最初の行は、数字が偶数の場合はスペース、奇数の場合はパイプです。
  • 2行目は常にパイプです。
  • 3番目の行は、数字が0または1の場合はスペース、2または3の場合はパイプです。

そう:

                           a is cmdline arg; o is 1; t is 10 (implicit)
  aTB4                     Convert a to base 4
      WRt                  Wrap it before and after with 10
 ^                         Split into a list of digits
Y                          and yank into y
              [         ]  List of:
               y%2          0 if even, 1 if odd for each item in y
                  oMy       1 mapped to y, i.e. constant 1 for each item in y
                     y/2    Each item in y divided by 2 (0, 0.5, 1, or 1.5)
         " |"@             Use the elements of that list as indices into this string
                           Note that indices are truncated to integers!
                           Autoprint, separating rows with newline and elements of
                           each row with space (-S flag)


1

C(gcc)、176バイト

#include<stdio.h>
int n,m;f(n,r){if(n)f(n>>2);printf("%c%c",n?32:10,(n&r||!r)&&n?'|':32);}main(){scanf("%d",&n);m=(n+(4<<(32-__builtin_clz(n)/2*2)))*16+4;f(m,1);f(m,0);f(m,2);}

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

わずかにそれほどフォーマットされていない(ゴルフが少ない):

#include<stdio.h>
int n,m;
f(n,r) {
    if(n)
        f(n>>2);
    printf("%c%c",n?32:10,(n&r||!r)&&n?'|':32);
}

main() {
    scanf("%d",&n);
    m=(n+(4<<2*(16-__builtin_clz(n)/2)))*16+4;
    f(m,1);
    f(m,0);
    f(m,2);
}

説明

まず、整数を読み取り、ベース4バージョンを出力する次のコードを検討します。

#include <stdio.h>
int n;
f(n) {if(n)printf("%d\n",n&3,f(n>>2));}
main(){scanf("%d",&n);f(n);}

これは、末尾再帰を使用して出力の順序を逆にします。各再帰ステップは2ずつビットシフトします(最後の2ビットを切り取り、4で除算します)。3(0b11)でビットマスクされた結果を出力します。これは、最後の2桁のみを表示し、これは最後の数字の基数4です。

関数呼び出しはprintf、{}(+2バイト)を使用printfして関数呼び出しをグループ化する必要を回避するために、末尾の引数としてに含まれます(出力されませんが、評価されます)。

ここでのソリューションは、このbase-4コードを拡張します。最初に、mはnとして定義されますが、ベース4では10が先頭に追加されます。その後、mを印刷します。

ベース4を定期的に印刷する際、3のビットマスクを使用して数字を取得しました。メールコードでは、一番上の行はその数字の下位ビット(1のビットマスク)であり、一番下の行は上位ビット(2のビットマスク)です。したがって、rin f(n,r)はビットマスクです。メイン関数はf(m,1)最初の行とf(m,2)最後の行を呼び出します。

中央の行を機能させるために(常に "|"を出力する)、||!r条件に追加します-rが0の場合、常にtrueと評価され、 "|"を出力します。次にf(m,0)、中間線を呼び出します。

最後に、改行が動作するようにします。printfソースコードのバイト数が多い限り、余分なものを含めるのは高価なので、代わりに既存のに別の%c指定子を追加しますprintfn?32:10nが0(偽)の場合は改行を出力し、それ以外の場合はスペースを出力します。バイトを節約するために、「\ n」と「」の代わりに32と10が使用されます。


1
あなたは警告を気にしない場合は、146にそれを得ることができます:f(n,r){n&&f(n>>2);printf("%c%c",n?32:10,(n&r|!r)&&n?'|':32);}main(n){scanf("%d",&n);f(n=(n+(4<<(32-__builtin_clz(n)/2*2)))*16+4,1);f(n,0);f(n,2);}
gastropner


1

PHP、99 + 1バイト

for($n=10 .base_convert($argn,10,4). 104;(~$c=$n[$i++])||3>$y+=$i=1;)echo" | ||  |||||

"[$c*3+$y];

PHPでは、リテラル文字列のインデックス付けに5.5以上、警告を生成しないインデックス付けには7.1以下が必要です。

でパイプとして実行する-nR、オンラインで試してください

改行をもう1つ挿入して、末尾の改行を取得します。


警告:で遭遇非数値[...] [...] 7行目
RedClover

@Soaku PHPのバージョンが5.5から7.0まででなければなりません
タイタス

1

Python 2、142 126バイト

B=lambda n:n<4and`n`or B(n/4)+`n%4`
def F(i):
 for r in 0,1,2:print' '.join(" |"[(int(x)%2,1,x>'1')[r]]for x in'10'+B(i)+'10') 

ovsに感謝します!

私は他の答えの方法をコピーしないようにしました...うん。



1

C#(.NET Core)、160バイト

i=>{string s=$"10{B(i)}10",a="";for(int y=0;y<3;y++,a+="\n")foreach(var t in s)a+=t<51&y!=1&t-(y>>1)!=49?"  ":"| ";return a;string B(int n)=>n>0?B(n/4)+n%4:"";}

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

私はいくつかの改善を見逃していると確信しています。

デゴルフド

i=>{
    string s = $"10{B(i)}10", // prepend and append 10 to the base 4 number
           a="";

    for (int y=0; y<3; y++, a+="\n") // go through each row
        foreach (var t in s)         // go through each char digit
            a += t<51 & y != 1 & t-(y>>1) != 49 ? "  " : "| "; // check if bar or space occurs

    return a;

    string B(int n) => n>0? B(n/4) + n%4 : ""; // convert int to base 4
}

t<51 & y != 1 & t-(y>>1) != 49 は、charが2行目ではなく '3'ではないことを確認し、1行目または3行目にスペースが含まれているかどうかを確認するバイナリマジックを実行します。





0

C、120バイト

残念ながら、Windowsでしか機能しitoaません。これは、標準化するにはあまりにも便利だからです。

char*p,s[21]="10";g(a){for(p=s;*p;)printf(!a|*p++&a?" |":"  ");puts(p);}f(n){strcat(itoa(n,s+2,4),"10");g(1);g(0);g(2);}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.