ディレクトリ構造のグラフィカルTreefication


9

次のような従来のディレクトリ構造を変換します。

config.yml
drafts
    begin-with-the-crazy-ideas.textile
    on-simplicity-in-technology.markdown
includes
    footer.html
    header.html

これに

.
├── config.yml
├── drafts
|   ├── begin-with-the-crazy-ideas.textile
|   └── on-simplicity-in-technology.markdown
└── includes
    ├── footer.html
    └── header.html
  • 4つのスペースは、上記のディレクトリのネストされたフォルダまたはファイルを指定します。
  • 許可されるネストされたカテゴリレベルは異なる場合があります。

更新

  • ファイル名:有効なLinuxは、スペースや改行せずにファイル名:任意のバイトを除きNUL/およびspaceslinefeeds
  • 描画文字:
    • | 縦線(U + 007C)
    • 箱型図ライト水平(U + 2500)
    • ├箱形図は垂直で右が明るい(U + 251C)

勝者:バイトで最短のコードが勝ちます!


1
PPCGへようこそ!素敵な最初の投稿!
Rɪᴋᴇʀ

垂直線は\ x7C垂直線または\ u2502ボックス図面は明るい垂直ですか?
ニール

@ニール私は「ボックス描画ライト垂直」を認識していませんでした。例では「垂直線」を使用しましたが、すでに2つの答えがあります。他の2つの文字はボックス描画タイプなので、とにかく前者を使用する方が理にかなっています。質問を\ u2502で更新する必要がありますか?
marcanuy

私は選択したREPLにボックス描画文字を簡単に入力できないため、L、+、および-文字を使用して回答を書き、実際にコピーして、実際にボックス描画文字を使用していると信じてスコアを調整しました。チェックせずに質問から貼り付けました。縦線が許容できる場合、私は1で私のスコアを減らすことができる
ニール・

1
私の新しい回答で2バイトを節約できるようになりました。
Neil、

回答:


2

Retina、88バイト

m`^ *
$&├── 
 {4}
|   
T+`|├` └`(?<=(.)*).(?!.+¶(?>(?<-1>.)*)[|├└])
^
.¶

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

いくつかの文字を交換してソースをISO 8859-1として読み取り、とを含む出力のシングルバイトエンコーディングを見つけることにより、技術的にこれを1文字あたり1バイトとして数えることができると思いますが、動作するのに煩わしくはありません。詳細は今すぐ。(レコードの場合、72バイトになります。)

説明

ステージ1:置換

m`^ *
$&├── 

まず、各行のインデントを一致させて挿入し├──ます。

ステージ2:置換

 {4}
|   

次に、4つのスペースのすべてのグループを照合し、最初のグループをに置き換え|ます。修正が必要なの|は、出力の下部に移動することだけです。これらのケースはどちらも、変更したい可能性のあるもののすぐ下の文字を見ると認識できます。

ステージ3:文字変換

T+`|├` └`(?<=(.)*).(?!.+¶(?>(?<-1>.)*)[|├└])

(?<=(.)*)カウントはどのように多くの文字がそれの水平方向の位置を測定するために、現在の行の試合の前に。次に、先読みはで次の行にスキップし、.+¶グループ1でキャプチャしたすべての文字と一致し(?>(?<-1>.)*)(同じ水平位置に進むため)、次の文字(つまり、実際の一致の下の文字)が|├└。そのような場合、マッチは失敗し、他のすべての場合にそれが成功すると、ステージの代替スペースのために|のために

これで1回の実行ですべてのキャラクターが修正されるわけではないので、このステージを +、出力が変化しなくなるまで、オプション。

ステージ4:置換

^
.¶

残っているのは最初の行だけなので、単純に文字列の先頭に一致させ、先頭にa .と改行をです。


説明してください?
Neil、

@ニール、どうぞ。
マーティンエンダー

+`(?<=(.*))\|(?!.+¶\1[|├])(スペース)を使用すると役に立ち+`(?<=(.*))├(?!.+¶\1[│├└]) ますか?
ニール

@ニール私はそのようなことを試しましたが、それでバイトを節約できたとは思いません。
マーティンエンダー

新しいアイデア:m`^ * $&└── T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
Neil、

2

JavaScriptの(ES6)、237の 128バイト

f=(s,r=`.\n`+s.replace(/^ */gm,"$&└── "),q=r.replace(/^(.*)( |└)(?=.+\n\1[|└])/m,(_,i,j)=>i+`|├`[+(j>' ')]))=>q==r?r:f(s,q)

Where \nはリテラルの改行文字を表します。説明:行を先頭に追加し、各行のインデントの終わりにを挿入することによってr作成されます。これは現在、入力の最後の行に対しては正しいですが、それぞれを可能な限り上方に「拡張」する必要があります。これはの仕事であり、aを検索し、その代わりに変換される別のスペースに到達しない限り、その直上のスペースを再帰的にsに置き換えます。再帰は、それ以上の置き換えができなくなると終了します。上の文字がスペースまたはaの場合、1つの文字が他の文字の上にあることをテストすることに注意してください。s.└──q|場合、の左側のテキストは常に前の行のテキストと同じであるため、次のように使用できます。\1

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