ASCIIボックスを描画します


19

非負整数の2つのリストを取得し、以下で定義されているようにASCIIボックスを出力します。

  • コーナーと交差点はプラスです:+(ASCIIコード43)
  • 縦線はバー|(ASCIIコード124)
  • 水平線はマイナス-(ASCIIコード45)

最初の入力リストは、各プラス記号の間の水平方向のマイナス数を指定します。

2番目の入力リストは、各プラス記号の間にある垂直方向のバーの数を指定します。

いくつかの例で説明する方が簡単です:

0    // No minuses between each + sign
0    // No bars between + signs

++
++

------------------
1 2   // First a single minus, then two minuses 
1 2   // First  one bar, then two bars

+-+--+
| |  |
+-+--+
| |  |
| |  |
+-+--+


------------------
1 0 3 0 2 0
2 1 0 0

+-++---++--++
| ||   ||  ||
| ||   ||  ||
+-++---++--++
| ||   ||  ||
+-++---++--++
+-++---++--++
+-++---++--++

明確化:

  • 入力順序と形式はオプションです
  • ボックスのみを印刷/表示する必要がありますが、末尾のスペースまたは改行を使用できます。
  • 必要に応じて、すべての入力値に1を追加することもできます。2番目の例は次のようになります2 3; 2 3

これはコードゴルフなので、バイト単位の最短コードが勝ちます。


回答:


5

MATL25 22 21バイト

'|-+ '2:"1tiYsQ(]E!+)

1追加された(チャレンジで許可された)入力を使用します。

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

説明

コードは最初1に、最終結果のスペース以外の文字の列インデックスを含む配列を作成し0ます。したがって、最初の入力が[2 1 4 1 3 1][1 0 3 0 2 0]0から始まる形式の場合)この配列は

1 0 1 1 0 0 0 1 1 0 0 1 1

ゼロの実行の長さが入力にどのように関連するかに注意してください。具体的には、この配列は次のように構築されます。

  1. 配列を単一のに初期化し1ます。
  2. 入力の累積和を計算し、加算し1ます。例では、これはを与え[3 4 8 9 12 13]ます。
  3. 1ステップ2で指定された(1ベースの)インデックスをエントリに割り当てることにより、ステップ1から配列を拡張します。中間エントリは自動的にに設定され0ます。

同様の配列が行に対して作成されます。2番目の入力[3 2 1 1](または[2 1 0 0 ])は、

1 0 0 1 0 1 1 1

これで、2番目の配列にが乗算され2、転置され、最初の配列にブロードキャストが追加されます。これは2D配列を与えます

3 2 3 3 2 2 2 3 3 2 2 3 3
1 0 1 1 0 0 0 1 1 0 0 1 1
1 0 1 1 0 0 0 1 1 0 0 1 1
3 2 3 3 2 2 2 3 3 2 2 3 3
1 0 1 1 0 0 0 1 1 0 0 1 1
3 2 3 3 2 2 2 3 3 2 2 3 3
3 2 3 3 2 2 2 3 3 2 2 3 3
3 2 3 3 2 2 2 3 3 2 2 3 3

文字列にインデックスを'|-+ '付けると、最終結果が2D char配列として得られます。インデックスはモジュール式で1から始まるため、インデックスは0最後の要素(スペース)に対応します。

'|-+ '                   % Push this string
      2:"       ]        % Do this twice
         1               % Push 1 (initial array)
          t              % Push another 1 (contents to be filled in)
           i             % Take input
            Ys           % Cumulative sum
              Q          % Add 1
               (         % Fill 1 into those entries of the array
                 E       % Multiply by 2
                  !      % Transpose
                   +     % Add, with broadcast
                    )    % Index (modular, 1-based) into the string

6

Python 2、117バイト

def f(h,v):r="+"+"+".join("-"*i for i in h)+"+\n";print r+r.join(("|"+"|".join(" "*i for i in h)+"|\n")*i for i in v)+r

イデオンで試してみてください。

これからあまり期待していません。本当に簡単です。Pythonの結合と文字列の乗算を使用して、すべてをまとめます。


6

JavaScript(ES6)、83バイト

(a,b,g=(a,[s,t])=>t+a.map(n=>s.repeat(n)+t).join``+`
`)=>g(b,[g(a,` |`),g(a,`-+`)])

出力には、2つの末尾の改行が含まれます。


ワオ。したがって、ほぼ同じような回答がほぼ同時に投稿されました。;)
Arnauld

(しかし、2分2バイトで私を打ち負かした。)
アーナルド

@Arnauldデモに時間を無駄にしました;-)
ニール

ウン、そう思う。^^興味深いことに、私のバージョンは、末尾に2つの改行がある81バイトになります。
アーナルド


1

Pyth、45バイト

AQj.i*hlH]Js.i*hlG\+m*d\-G-mjb*d]XJ"+-""| "Hk

STDINで2つのコンマ区切りリストの入力を受け取り、結果を出力するプログラム。

ここではまだいくつかのゴルフが行われているはずです。

オンラインで試す

後で説明


1

Haskell、55バイト

f[a,b]x=a:do n<-x;(b<$[1..n])++[a]
g x=f[f"+-"x,f"| "x]

g2つの入力リストを受け取り、出力の行を含むリストを返す関数を定義します


0

PowerShell v2 +、89バイト

param($a,$b)($x="+$(($a|%{'-'*$_})-join'+')+")
$b|%{,"|$(($a|%{' '*$_})-join'|')|"*$_;$x}

ダン、私はかなりJavaScriptをキャッチできるとは思わない。

入力$a$b明示的な配列として受け取ります。$xループスルー$aと文字列の連結に基づいて、変数をボックスの一番上の行に設定します。これは括弧でカプセル化されているため、パイプラインに配置されます。次に、ループを$b繰り返し、各反復でパイプラインに2つの文字列を配置します。同じスタイルの文字列ですが、スペースを|使用し、ハイフンとの代わりに+、およびを使用し$xます。これらの文字列はすべてWrite-Output、プログラムの完了時に暗黙的にパイプラインから収集され、その間にデフォルトの改行があります。

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(0) @(0)
++
++

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(1,0,3,0,2,0) @(2,1,0,0)
+-++---++--++
| ||   ||  ||
| ||   ||  ||
+-++---++--++
| ||   ||  ||
+-++---++--++
+-++---++--++
+-++---++--++

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(1,4,1) @(1,2,1)
+-+----+-+
| |    | |
+-+----+-+
| |    | |
| |    | |
+-+----+-+
| |    | |
+-+----+-+

0

ルビー、66バイト

->x,y{d=->c,m,z=x{c+z.map{|w|m*w}*c+c+$/}
d[d[?+,?-],d[?|,' '],y]}

0

ゼリー30 26 バイト

Ḣị“+-“| ”ị@
1;+\Ṭ
Ç€,€/Ñ€Y

TryItOnlineでテストする

どうやって?

入力は2つのリストのリストで[vertical, horizontal]あり、増分オプションを使用します。
したがって、例3の場合[[3,2,1,1], [2,1,4,1,3,1]]
、これらはそれぞれ、rowTypeまたはrowCharacterTypeをそれぞれ示すブール配列に変換され[[1,0,0,1,0,1,1,1], [1,0,1,1,0,0,0,1,1,0,0,1,1]]
ます。 rowTypeとrowCharacterTypeの組み合わせで識別される文字-つまり、rowTypeはどちら"+-""| "を識別し、rowCharacterTypeはこれら2つの文字のいずれかを識別します。

Ḣị“+-“| ”ị@ - Link 1, create a row: [rowType, [rowCharaterTypes]]
Ḣ           - head - get the rowType
  “+-“| ”   - list of strings ["+-", "| "]
 ị          - index into (if rowType is 1 "+-"; if rowType is 0 "| ")
         ị@ - index into with reversed operands (index into that from rowCharaterTypes)
                (replace each 1 in rowCharaters with "+" or "|" and each 0 with "-" or " ")

1;+\Ṭ - Link 2, create the Type lists from the inputs: int[] nCharacters
1;    - 1 concatenated with the input
  +\  - reduce with addition (accumulation provides the indices)
    Ṭ - boolean array with 1s at those indices
            As an example take the vertical of example 3:
            [3,2,1,1] -> [1,3,2,1,1] -> [1,4,6,7,8] -> [1,0,0,1,0,1,1,1]
            each of which will be passed as a rowType for Link 1

Ç€,€/Ñ€Y - Main link, takes one argument: [Vertical, Horizontal] (incremented option)
Ç€       - call the last link (2) for each of the two lists in the input
  ,€/    - pair each and reduce (making a list of [rowtype [rowCharacterTypes]])
     р  - call the next link (1) for each
       Y - join on line feeds
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.