配列を視覚化する


26

任意の深さの配列を指定して、+-|各サブ配列の周囲の境界線でその内容を描画します。これらは、プラス、マイナス、および垂直パイプのASCII文字です。

たとえば、配列がの場合[1, 2, 3]、描画

+-----+
|1 2 3|
+-----+

のようなネストされた配列の場合[[1, 2, 3], [4, 5], [6, 7, 8]]、draw

+-----------------+
|+-----+---+-----+|
||1 2 3|4 5|6 7 8||
|+-----+---+-----+|
+-----------------+

のような不規則な配列の場合[[[1, 2, 3], [4, 5]], [6, 7, 8]]、draw

+-------------------+
|+-----------+-----+|
||+-----+---+|6 7 8||
|||1 2 3|4 5||     ||
||+-----+---+|     ||
|+-----------+-----+|
+-------------------+

描画後、より多くのスペースがあることに注意してください[6, 7, 8]。一番上の線、中央の線、または一番下の線にコンテンツを描画できますが、どちらを選択した場合でも、一貫性を保つ必要があります。

この課題は、Jのボックス動詞に触発されました<

ルール

  • これはので、最短のコードが優先されます。
  • これを解決するビルトインは許可されていません。
  • 入力配列には、非負の整数値または配列のみが含まれます。各配列は同種です。つまり、その要素は配列のみまたは整数のみのいずれかであり、両方が混在することはありません。
  • 各サブ配列は、任意の深さにネストできます。
  • 出力は、文字列として、または各文字列が出力の行である文字列の配列としてのいずれかです。

テストケース

[]
++
||
++

[[], []]
+---+
|+++|
|||||
|+++|
+---+

[[], [1], [], [2], [], [3], []]
+-----------+
|++-++-++-++|
|||1||2||3|||
|++-++-++-++|
+-----------+

[[[[[0]]]]]
+---------+
|+-------+|
||+-----+||
|||+---+|||
||||+-+||||
|||||0|||||
||||+-+||||
|||+---+|||
||+-----+||
|+-------+|
+---------+

[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]
+---------------------------------+
|+-------------+---------+-----+-+|
||+-----------+|+-------+|+---+|1||
|||+---------+|||+-----+|||2 1|| ||
||||+-------+|||||3 2 1|||+---+| ||
|||||4 3 2 1|||||+-----+||     | ||
||||+-------+|||+-------+|     | ||
|||+---------+||         |     | ||
||+-----------+|         |     | ||
|+-------------+---------+-----+-+|
+---------------------------------+

言語にネストされた配列がない場合、データ型の定義を無視できますか?
ThreeFx

1
@ThreeFxネストされた配列を表す文字列として入力を受け取ることもできます
マイル

それは本当に非効率です(Haskellで)。数値を手動で解析する必要があります。その場合、データ型を定義して使用する方が短くなります。
ThreeFx

@ThreeFxまたは-1、整数を負でない値に制限したため、配列にセンチネル値を埋め込むこともできます。次に、それらの無効な値の出力をクリーンアップする必要があります。
マイル

1
@MitchSchwartzもちろん、入れ子になったタプルまたはあなたの言語にネイティブな形式で入力を受け取ります。一貫性を保つ限り、出力は正常です。整数は上部、中央、または下部に描画でき、ボックスは上部、中央、下部に配置したり、例のようにスペースを埋めるために引き伸ばしたりできます。
マイル

回答:


4

Dyalog APL、56 バイト

バイトの約3分の1を削除できるngnに感謝します。

{⍵≡∊⍵:⍉⍪⍉⍕⍵⋄(⊢,⊣/)⊃,/(1⊖('++','|'⍴⍨≢),'-'⍪⍣2↑)¨↓↑↓¨∇¨⍵}⊂

TryAPL

関数を定義してから、各テストケースを実行し、組み込み]Displayユーティリティと比較します。
[1, 2, 3]
[[1, 2, 3], [4, 5], [6, 7, 8]]
[[[1, 2, 3], [4, 5]], [6, 7, 8]]
[]
[[], []]
[[], [1], [], [2], [], [3], []]
[[[[[0]]]]]
[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]

説明

全体的に、これは{...}encloseの上の匿名関数です。後者は、前者に外側フレームを追加するように促す別のレベルのネストを追加するだけです。

空白のある匿名関数(ステートメントの区切り文字です):

{
      ∊⍵:     
    (⊢ , ⊣/)  ,/ (1  ('++' , '|' ⍴⍨ ≢) , '-' ⍪⍣2 ↑)¨   ↓¨ ∇¨ 
}

ここでも同じですが、ユーティリティ機能が分離されています。

CloseBox   , ⊣/
CreateVertical  '++' , '|' ⍴⍨ 
AddHorizontals  1  CreateVertical , '-' ⍪⍣2 
{
      ∊⍵:     
    CloseBox  ,/ AddHorizontals¨   ↓¨ ∇¨ 
}

次に、各機能について説明します。

CloseBoxテーブルを取り、同じテーブルを返しますが、テーブルの最初の列がテーブルの右側に追加されます。したがって、1行3列のテーブルを指定するとXYZ、この関数はXYZX次のように1行4列のテーブルを返します
 。
,
⊣/  列の列の左端の列の 前に追加された行)

CreateVerticalはテーブルを取得し|、テーブルの両側にs が収まる文字で構成される文字列を返しますが、の+2行に一致するように2が追加されます-。最終的に、テーブルは1行ずつ循環的に回転し+---...、上下の1行を取得します。したがって、3行のテーブルがある場合、この関数は++|||次のようにを返します。 引数の(行)の集計 によって再形成
'++' , され
'|' ⍴⍨たスタイルに追加された2つのプラス

AddHorizontalsリストのリストを取り、テーブルにし、-上にsの2行を追加し、対応する左端の文字を左に追加し、次に1行を下に回転して、テーブルの上部に境界線を付けます、左、および下。次のよう に、 リストのリストからテーブルに変換された引数の上部にマイナスで2回追加された( 列として)付加された文字列の
1 ⊖ 1行(上部の行が下部に移動)を回転します
CreateVertical ,++|||...
'-' ⍪⍣2

{無名関数}:引数が単純な(ネストされていない)リストの場合、文字テーブルにします(したがって、3要素のリストが与えられると1 2 3、この関数は視覚的に同一の1行5列の文字テーブルを返します1 2 3)。引数が単純なリストではない場合、要素が単純な文字テーブルであることを確認してください。それらを同じ高さに詰めます。上、下、左にそれぞれフレームを付けます。それらを組み合わせます。最後に最初の列を取得して、右側に追加します。次のとおりです。
{ 匿名関数の定義を始める
  ⍵ ≡ ∊⍵:引数は引数を平坦化と同一であれば、その後、(すなわち、それは単純なリストです):
    移調
    columnized
    転置
   ⍕ ⍵ 文字列化引数を。そうでない場合:
  CloseBox 左端の列を右に追加します
  ⊃ ,/ (還元取り囲みために)連結-横切って開示された
  AddHorizontals¨ アド-s   各引数に適用されるこの無名関数
  ↓ ↑ ↓¨ のpadded-to-equal-height * のそれぞれの上と下のs  は、無名関数 * Litの定義を終了します。各テーブルをリストのリストにし、リストのリスト(短い行を埋めるために空の文字列でパディング)を結合し、テーブルをリストのリストに分割します
  ∇¨ ⍵
}


7

JavaScriptの(ES6)、223の 203バイト

f=(a,g=a=>a[0].map?`<${a.map(g).join`|`}>`:a.join` `,s=g([a]),r=[s],t=s.replace(/<[ -9|]*>|[ -9]/g,s=>s[1]?s.replace(/./g,c=>c>`9`?`+`:`-`):` `))=>t<`+`?r.join`\n`.replace(/<|>/g,`|`):f(a,g,t,[t,...r,t])

@MitchSchwartzのRubyソリューションのポート。配列を再帰的にラップすることで機能する以前のバージョン(したがって、整数だけでなく任意のコンテンツでも機能します):

f=(...a)=>a[0]&&a[0].map?[s=`+${(a=a.map(a=>f(...a))).map(a=>a[0].replace(/./g,`-`)).join`+`}+`,...[...Array(Math.max(...a.map(a=>a.length)))].map((_,i)=>`|${a.map(a=>a[i]||a[0].replace(/./g,` `)).join`|`}|`),s]:[a.join` `]

注:引数リストでスプレッド演算子を使用していますが、目的の出力を取得するには、配列を広げようとするのではなく、元の配列の単一のパラメーターを指定します。これには、目的の外側のボックスで出力をラップする効果があります。悲しいことに、外側のボックスは18バイトかかり、整数をスペースで区切ると8バイトかかります。そうでなければ、次の代替視覚化で197バイトで十分です。

f=a=>a.map?[s=`+${(a=a.map(f)).map(a=>a[0].replace(/./g,`-`)).join`+`}+`,...[...Array(Math.max(0,...a.map(a=>a.length)))].map((_,i)=>`|${a.map(a=>a[i]||a[0].replace(/./g,` `)).join`|`}|`),s]:[``+a]

これは空の配列を処理しますか?Cannot read property 'map' of undefinedなどの空の配列に対してエラーが表示されます[]。以下のために[1,2,[]]、最後のサブアレイが私のために表示されません。
マイル

@miles申し訳ありませんが、私はテストケースをチェックアウトするのを忘れていました。[1,2,[]]例では整数または配列のいずれかを含む配列のみを表示し、両方を表示しないため、出力を指定していません。
ニール

すばらしいです。また、テストケースでは説明しなかったので、各配列が同種であれば問題はより単純になります(これまでのところ唯一の作業エントリであるため)。
マイル

3

ルビー、104バイト

->s{r=s=s.gsub'}{',?|
r=[s,r,s]*$/while s=s.tr('!-9',' ').gsub!(/{[ |]*}/){$&.tr' -}','-+'}
r.tr'{}',?|}

文字列を予期する匿名関数。例えば、{{{{{4 3 2 1}}}}{{{3 2 1}}}{{2 1}}{1}}生産

+---------------------------------+
|+-------------+---------+-----+-+|
||+-----------+|         |     | ||
|||+---------+||+-------+|     | ||
||||+-------+||||+-----+||+---+| ||
|||||4 3 2 1||||||3 2 1||||2 1||1||
||||+-------+||||+-----+||+---+| ||
|||+---------+||+-------+|     | ||
||+-----------+|         |     | ||
|+-------------+---------+-----+-+|
+---------------------------------+

このコードをテストに使用できます。

f=->s{r=s=s.gsub'}{',?|
r=[s,r,s]*$/while s=s.tr('!-9',' ').gsub!(/{[ |]*}/){$&.tr' -}','-+'}
r.tr'{}',?|}

a=[]

a<<'[1, 2, 3]'
a<<'[[1, 2, 3], [4, 5], [6, 7, 8]]'
a<<'[[[1, 2, 3], [4, 5]], [6, 7, 8]]'
a<<'[]'
a<<'[[], []]'
a<<'[[], [1], [], [2], [], [3], []]'
a<<'[[[[[0]]]]]'
a<<'[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]'

a.map{|s|s.gsub! '], [','}{'
s.tr! '[]','{}'
s.gsub! ',',''
puts s
puts f[s],''}

これは中央の行から始まり、外側に向かって動きます。まず、のインスタンスが}{に置き換えられます|。次に、中括弧が残っている間、最も内側の{...}文字列はすべて適切な+-シーケンスに変換され、それ以外の文字|{}はスペースに変換されます。最後に、中間ブレースはパイプに変わります。


私は明らかに寛大な入力フォーマットの要件にいくつかの自由を取りました。必要に応じて、異なる入力形式を処理するようにコードを簡単に変更できます。
ミッチシュワルツ

よく考えられていないコメントを受け取ることは、このサイトに参加することの大きな喜びの1つです。
ミッチシュワルツ

3

Brainfuck、423バイト

->>+>>,[[>+>+<<-]+++++[>--------<-]>[<+>-[[-]<-]]>[[-]<<[>>>>+<<<<<<-<[>-<-]>>>-
]<<<[-<<<<<<-<]>+>>>]<<<[>>+>>>>>+<<<<<<<-]>>>>>>>>>,]<<+[<<,++>[-[>++<,<+[--<<<
<<<<+]>]]<[-<+]->>>>[<++<<[>>>>>>>+<<<<<<<-]>>>-[<++>-[>>>>+<<<<<++<]<[<<]>]<[>>
+<<<<]>>>+>+>[<<<-<]<[<<]>>>>->+>[-[<-<-[-[<]<[<++<<]>]<[<++++<<]>]<[>+<-[.<<<,<
]<[<<]]>]<[-<<<<<]>>[-[<+>---[<<++>>+[--[-[<+++++++<++>>,]]]]]<+++[<+++++++++++>
-]<-.,>>]>>>>+>>>>]<<-]

いくつかのコメントでフォーマット:

->>+>>,
[
  [>+>+<<-]
  +++++[>--------<-]
  >
  [
    not open paren
    <+>-
    [
      not paren
      [-]<-
    ]
  ]
  >
  [
    paren
    [-]
    <<
    [
      close paren
      >>>>+<<<<
      <<-<[>-<-]>>>
      -
    ]
    <<<
    [
      open paren directly after close paren
      -<<<<<<-<
    ]
    >+>>>
  ]
  <<<[>>+>>>>>+<<<<<<<-]>>>
  >>>>>>,
]
<<+
[
  <<,++>
  [
    -
    [
      >++<
      ,<+[--<<<<<<<+]
      >
    ]
  ]
  <[-<+]
  ->>>>
  [
    <++<<[>>>>>>>+<<<<<<<-]>>>-
    [
      at or before border
      <++>-
      [
        before border
        >>>>+<<<<
        <++<
      ]
      <[<<]
      >
    ]
    <
    [
      after border
      >>+<<
      <<
    ]
    >>>+>+>
    [
      column with digit or space
      <<<-<
    ]
    <[<<]
    >>>>->+>
    [
      middle or bottom
      -
      [
        bottom
        <-<-
        [
          at or before border
          -
          [
            before border
            <
          ]
          <
          [
            at border
            <++<<
          ]
          >
        ]
        <
        [
          after border
          <++++<<
        ]
        >
      ]
      <
      [
        middle
        >+<
        -[.<<<,<]
        <[<<]
      ]
      >
    ]
    <[-<<<<<]
    >>
    [
      border char or space
      -
      [
        not space
        <+>---
        [
          not plus
          <<++>>
          +
          [
            --
            [
              -
              [
                pipe
                <+++++++<++>>,
              ]
            ]
          ]
        ]
      ]
      <+++[<+++++++++++>-]<-.,>>
    ]
    > >>>+>>>>
  ]
  <<-
]

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

(((((4 3 2 1))))(((3 2 1)))((2 1))(1))末尾の改行でフォーマットされた入力を期待し、次の形式の出力を生成します。

+---------------------------------+
|+-------------+---------+-----+-+|
||+-----------+|+-------+|+---+| ||
|||+---------+|||+-----+|||   || ||
||||+-------+|||||     ||||   || ||
|||||4 3 2 1||||||3 2 1||||2 1||1||
||||+-------+|||||     ||||   || ||
|||+---------+|||+-----+|||   || ||
||+-----------+|+-------+|+---+| ||
|+-------------+---------+-----+-+|
+---------------------------------+

基本的な考え方は、ネストの深さに基づいて印刷する文字を計算することです。出力形式は、ボックスの上部境界線の行インデックスが対応する配列の深さと等しく、中央の行全体で対称であるようなものです。

テープは7セルのノードに分割され、各ノードは出力の列を表します。

最初のループは入力を消費してノードを初期化し、深さと列が括弧に対応するかどうか(列に垂直境界が含まれるかどうか)を追跡し、出現)(を単一ノードに折りたたみます。

次のループは、反復ごとに1行を出力します。このループ内で、別のループがノードを横断し、反復ごとに1文字を出力します。これは、ほとんどの作業が行われる場所です。

初期化ループ中、反復の開始時のノードのメモリレイアウトは次のとおりです。

x d 0 c 0 0 0

where xは、前の文字が右括弧で、d深さ(プラス1)でc、現在の文字であるかどうかを示すブールフラグです。

文字印刷ループ中、反復の開始時のノードのメモリレイアウトは次のとおりです。

0 0 d1 d2 c p y

ここでd1、上半分の行インデックスと比較した深さを示します。下半分にd2似てd1いますが、下半分です。c数字またはスペースの場合はその列の入力文字、それ以外の場合はゼロ。pフェーズ、つまり上半分、中間、または下半分を示します。そしてy、左から右へ伝播するフラグで、まだ中央の行に到達したかどうかを追跡します。yノードの処理後にゼロになるのでy、前のノードのセルを使用して作業スペースを増やすことができます。

この設定により、初期化段階で最大深度を明示的に計算することを回避できます。それに応じypセルを更新するために、フラグが逆伝播されます。

-1ナビゲーションを容易にするためにノードの左側にセルがあり、ノードの右側に最後の行をまだ印刷したかどうかを追跡するセルがあります。


2

PHP + HTML、非競合(170 141 135 130バイト)

SteeveDrozに触発されて29バイトを節約

<?function p($a){foreach($a as$e)$r.=(is_array($e)?p($e):" $e");return"<b style='border:1px solid;float:left;margin:1px'>$r</b>";}

アスキー出力がなく、ブラウザにすべての興味深い仕事をさせたので、競合していません


1
<b>代わりにタグを作成でき<div>、の色を指定する必要はありませんborder。(9バイトを節約)
-SteeveDroz

<tag>を配置する必要はまったくなく、出力をプレーンテキストとして表示するだけで、多くのバイト(HTMLを削除した後のコード全体で80バイト)を節約できます
ClementNerma

@SteeveDrozでは<b>white-space属性を削除して、さらに19バイト節約できます。すばらしいです!そして、私は置き換えることができpaddingmargin
タイタス

2

JavaScript(ES6)、221

文字列の配列を返す非再帰関数(内部で再帰サブ関数を使用)

a=>[...(R=(a,l)=>a[r[l]='',0]&&a[0].map?'O'+a.map(v=>R(v,l+1))+'C':a.join` `)([a],l=-1,r=[],m='')].map(c=>r=r.map(x=>x+v[(k<0)*2+!k--],k=l,1/c?v='-- ':(v='-+|',c>'C'?k=++l:c>','&&--l,c='|'),m+=c))&&[...r,m,...r.reverse()]

これは2つのステップで機能します。

ステップ1:ネストされた入力配列の文字列表現を再帰的に構築します。例:

[[[1, 2, 3], [],[4, 5]], [6, 7, 8]] -> "OOO1 2 3,,4 5C,6 7 8CC"

OCサブアレイのオープンとクローズをマークします。単純な数値部分配列は、スペースで区切られた要素でレンダリングされますが、配列メンバーが部分配列である場合、コンマで区切られます。私は、出力の中段はちょうど交換を受けることができますが、この文字列は、入力配列のマルチレベル構造を追跡しOC,|。この一時文字列を再帰的に構築している間に、最大深度レベルを見つけて、出力の上部半分を含む空の文字列の配列を初期化します。
注:外側のボックスには注意が必要です。入力を別の外側の配列内にネストし、不要な出力の最初の行をドロップします

ステップ2:一時文字列をスキャンして出力を作成する

これで、各レベルに1つずつ、空の文字列の配列ができました。一時文字列をスキャンし、現在のレベルを追跡します。これは、それぞれ増加し、それぞれO減少しますC。これを次のように視覚化します。

[[[1, 2, 3], [],[4, 5]], [6, 7, 8]]

OOO1 2 3,,4 5C,6 7 8CC
+                    +
 +            +     +
  +     ++   +
|||1 2 3||4 5||6 7 8||

プラスは現在のレベルに従って上下します

各文字については、私は規則に従って、出力のすべての行に文字を追加します
-現在のレベルで、以下、上記のスペースを置く- 「」桁またはスペースは、置く場合
に「+」入れ、他-現在のレベル、以下の場合は「-」、「|」を入力 上記の場合

OOO1 2 3,,4 5C,6 7 8CC
+--------------------+
|+------------+-----+|
||+-----++---+|     ||
|||1 2 3||4 5||6 7 8||

一時スキャン中に、次のように置き換えOC,て中央の行も作成します|

このステップの最後には、上半分と中央の行があり、上半分をミラーリングして下半分を取得するだけで完了です。

少ないゴルフ、コメント付きコード

a=>{
   r = []; // output array
   R = ( // recursive scan function
     a, // current subarray 
     l  // current level
   ) => (
     r[l] = '', // element of r at level r, init to ""
     a[0] && a[0].map // check if it is a flat (maybe empty) array or an array of arrays
     ? 'O'+a.map(v=>R(v,l+1))+'C' // mark Open and Close, recurse
     : a.join` ` // just put the elements space separated
   );
   T = R([a],-1)]; // build temp string
   // pass the input nested in another array 
   // and start with level -1 , so that the first row of r will not be visible to .map

   // prepare the final output
   m = '' // middle row, built upon the chars in T
   l = -1 // starting level
   [...T].map(c => // scan the temp string
         {
            k = l; // current level
            1/c // check if numeric or space
             ? v = '-- ' // use '-','-',' '
             : (
                 v = '-+|', // use '-','+','|'
                 c > 'C' 
                   ? k=++l // if c=='O', increment level and assign to k
                   : c>'A'&&--l, // if c=='C', decrement level (but k is not changed)
                 c='|' // any of O,C,comma must be mapped to '|'
               );
            m += c; // add to middle row
            r = r.map( (x,i) => // update each output row
                       // based on comparation between row index and level
                       // but in golfed code I don't use the i index
                       // and decrement l at each step  
                       x + v[(k<i)*2+!(k-i)]
                     )
         })
   // almost done!  
   return [...r,m,...r.reverse()]

テスト

F=
a=>[...(R=(a,l)=>a[r[l]='',0]&&a[0].map?'O'+a.map(v=>R(v,l+1))+'C':a.join` `)([a],l=-1,r=[],m='')].map(c=>r=r.map(x=>x+v[(k<0)*2+!k--],k=l,1/c?v='-- ':(v='-+|',c>'C'?k=++l:c>','&&--l,c='|'),m+=c))&&[...r,m,...r.reverse()]

out=x=>O.textContent = x+'\n'+O.textContent

;[[1,2,3]
,[[[1, 2, 3], [4, 5]], [6, 7, 8]]
,[]
,[[], []]
,[[], [1], [], [2], [], [3], []]
,[[[[[0]]]]]
,[[[[[4, 3, 2, 1]]]], [[[3, 2, 1]]], [[2, 1]], [1]]
].forEach(t=>
  out(JSON.stringify(t)+'\n'+F(t).join`\n`+'\n')
)  

function update()
{
  var i=eval(I.value)
  out(JSON.stringify(i)+'\n'+F(i).join`\n`+'\n')
}

update()
#I { width:90%}
<input id=I value='[[[1, 2, 3], [],[4, 5]], [6, 7, 8]]' oninput='update()'>
<pre id=O></pre>


2

ルビー、245 241バイト

すべてをボックスにラップするだけでなく、すべてを揃えるのに必要なオーバーヘッドはかなり重いです...

仕様に従って、行ごとに1つの文字列を含む文字列の配列を出力します。1バイトを節約するため、上揃えのサンプルテストケースの代わりに下揃えになります。

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

V=->a{a==[*a]?(k=a.map(&V);k[0]==[*k[0]]?[h=?++?-*((k.map!{|z|z[1,0]=[' '*~-z[0].size+?|]*(k.map(&:size).max-z.size);z};f=k.shift.zip(*k).map{|b|?|+b.reduce{|r,e|r+e[1..-1]}+?|})[0].size-2)+?+,*f,h]:[h="+#{?-*(f=k*' ').size}+",?|+f+?|,h]):a}

@Adámは現在修正済みです。...さらに、後に最適化するために、全力を尽くす
バリューインク

Nice。最初の回答は下揃えです。:-)
アダム

1

PHP、404バイト

すべてのソリューションは、配列の最大深さが10未満で機能します。値が大きい場合、深さは文字列ではなく配列に格納する必要があります。

<?foreach(str_split(json_encode($_GET[a]))as$j){$j!="]"?:$c--;$r=($j==",")?($l=="]"?"":" "):$j;$r=$r=="]"?"|":$r;$r=$r=="["?($v=="]"?"":"|"):$r;if($r!=""){$n.=$r;$d.=+$c;}$v=$l;$l=$j;$j!="["?:$c++;$m>=$c?:$m=$c;}for($x=0;$x<strlen($n);$x++)for($y=0;$y<$m;$y++)$z[$y].=$y==$d[$x]&&$n[$x]=="|"?"+":($y<$d[$x]?"-":($y>$d[$x]&&$n[$x]=="|"?"|":" "));echo join("\n",$z),"\n$n\n".(join("\n",array_reverse($z)));

拡大

foreach(str_split(json_encode($_GET[a]))as$j){ # split JSON representation of the array
    $j!="]"?:$c--;
    $r=($j==",")?($l=="]"?"":" "):$j;
    $r=$r=="]"?"|":$r;
    $r=$r=="["?($v=="]"?"":"|"):$r;
    if($r!=""){
      $n.=$r;  # concanate middle string
      $d.=+$c; # concanate depth position
    }
    $v=$l;
    $l=$j;
    $j!="["?:$c++;
    $m>=$c?:$m=$c; # maximum depth of the array
}
for($x=0;$x<strlen($n);$x++)for($y=0;$y<$m;$y++)
$z[$y].=$y==$d[$x]&&$n[$x]=="|"?"+":($y<$d[$x]?"-":($y>$d[$x]&&$n[$x]=="|"?"|":" "));
# Build the strings before the middle string dependent of value middle string and depth 
echo join("\n",$z),"\n$n\n".(join("\n",array_reverse($z))); #Output

425バイトの場合、REGEXでこれを作成できます

<?$n=($p=preg_filter)("#\]|\[#","|",$r=$p("#\],\[#","|",$p("#,(\d)#"," $1",json_encode($_GET[a]))));preg_match_all("#.#",$r,$e,256);foreach($e[0] as$f){$f[0]!="]"&&$f[0]!="|"?:$c--;$d.=+$c;$f[0]!="|"&&$f[0]!="["?:$c++;$m>=$c?:$m=$c;}for($x=0;$x<strlen($n);$x++)for($y=0;$y<$m;$y++)$z[$y].=$y==$d[$x]&&$n[$x]=="|"?"+":($y<$d[$x]?"-":($y>$d[$x]&&$n[$x]=="|"?"|":" "));echo join("\n",$z),"\n$n\n".(join("\n",array_reverse($z)));

拡大

$r=preg_filter("#\],\[#","|",preg_filter("#,(\d)#"," $1",json_encode($_GET[a])));
preg_match_all("#.#",$r,$e,256);
$n=preg_filter("#\]|\[#","|",$r); # concanate middle string
foreach($e[0] as$f){
    $f[0]!="]"&&$f[0]!="|"?:$c--;
    $d.=+$c; concanate depth position
    $f[0]!="|"&&$f[0]!="["?:$c++;
    $m>=$c?:$m=$c; # maximum depth of the array
}
# similar to the other ways
for($x=0;$x<strlen($n);$x++)
for($y=0;$y<$m;$y++)
$z[$y].=$y==$d[$x]&&$n[$x]=="|"?"+":($y<$d[$x]?"-":($y>$d[$x]&&$n[$x]=="|"?"|":" "));
echo join("\n",$z),"\n$n\n".(join("\n",array_reverse($z)));

再帰ソリューションの場合は455バイト

<?function v($x,$t=0,$l=1){global$d;$d.=$t;$s="|";$c=count($x);foreach($x as$k=>$v){if(is_array($v))$e=v($v,$t+1,$k+1==$c);else{$e=$v." "[$k+1==$c];$d.=str_pad("",strlen($e),$t+1);}$s.=$e;}$d.=$l?$t:"";$s.=$l?"|":"";return$s;}$n=v($_GET[a]);$m=max(str_split($d));for($x=0;$x<strlen($n);$x++)for($y=0;$y<$m;$y++)$z[$y].=$y==$d[$x]&&$n[$x]=="|"?"+":($y<$d[$x]?"-":($y>$d[$x]&&$n[$x]=="|"?"|":" "));echo join("\n",$z),"\n$n\n".(join("\n",array_reverse($z)));

拡大

function v($x,$t=0,$l=1){
    global$d; # concanate depth position
    $d.=$t;
    $s="|";
    $c=count($x);
    foreach($x as$k=>$v){           
        if(is_array($v)){$e=v($v,$t+1,$k+1==$c);}
        else{$e=$v." "[$k+1==$c];$d.=str_pad("",strlen($e),$t+1);}
        $s.=$e;
    }
    $d.=$l?$t:"";
    $s.=$l?"|":"";
    return$s;
}
$n=v($_GET[a]); # concanate middle string
$m=max(str_split($d)); # maximum depth of the array
# similar to the other ways 
for($x=0;$x<strlen($n);$x++)
for($y=0;$y<$m;$y++)
$z[$y].=$y==$d[$x]&&$n[$x]=="|"?"+":($y<$d[$x]?"-":($y>$d[$x]&&$n[$x]=="|"?"|":" "));
echo join("\n",$z),"\n$n\n".(join("\n",array_reverse($z)));

1)$j!="]"?:$c--;-> $c-=$j=="]";(-2)。2)($l=="]"?"":" ")-> " "[$l==$j](- 5)。ほとんどの場合、2番目のループでの類似の置換。3)if($r!=""){$n.=$r;$d.=+$c;}-> $n.=$r;if($r>"")$d.=+$c;(- 3)。4)$l=$j;$j!="["?:$c++;-> $c+="["==$l=$j;(- 5)。5)$x=0は必要ありません(-4)。6)for($y=0;$y<$m;$y++)-> for($y=$m;$y--;)(- 4)。7)join("\n",$z),"\n$n\n".(join("\n",array_reverse($z)));-> join("\n",array_merge($z,[$n],array_reverse($z)));(- 4)8)不要な空白:foreach($e[0]as$f)(-1)
タイタス

9)($j==",")(-2 )の不必要な括弧。10)if($r>"")$d.=+$c;-> $d.=$r>""?+$c:"";(-0 )
タイタス

再帰バージョン:1)$d.=$l?$t;廃止(-10)2)$s.=$l?"|":"";return$s;-> return$s."|"[$l];(- 6)。3)廃止されたブレース{$e=v($v,$t+1,$k+1==$c);}(-2)。4){$e=$v." "[$k+1==$c];$d.=str_pad("",strlen($e),$t+1);}-> $d.=str_pad("",strlen($e=$v." "[$k+1==$c]),$t+1);(- 5)。
タイタス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.