Структура каталогов Графическая древовидная структура


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
  • Четыре пробела указывают на вложенную папку или файл вышеуказанного каталога.
  • Допустимые уровни вложенных категорий могут варьироваться.

Обновить

  • filenames : допустимые имена файлов Linux без пробелов и перевода строки: любой байт, кроме NUL, /и spaces,linefeeds
  • рисование персонажей:
    • | вертикальная линия (U + 007C)
    • коробка рисунков светлая горизонтальная (U + 2500)
    • рисунки коробки светлые вертикальные и правые (U + 251C)

Победитель : кратчайший код в байтах побеждает!


1
Добро пожаловать в PPCG! Хороший первый пост!
Rɪᴋᴇʀ

Вертикальные линии должны быть \ x7C Вертикальная линия или \ u2502 Чертежи Box Light Vertical?
Нил

@Neil Я не знал о «Box Drawings Light Vertical», я использовал «Vertical Line» в примере, и с этим уже есть два ответа. В любом случае, было бы более разумно использовать первый, потому что два других символа относятся к типу « Рисунки ящиков ». Должен ли я обновить вопрос с помощью \ u2502?
марта

Поскольку я не могу легко вводить символы рисования в виде квадрата в свой выбранный REPL, я написал свой ответ, используя символы L, + и -, а затем скорректировал счет, полагая, что вы использовали символы рисования в виде квадрата, хотя на самом деле я только что скопировал и вставил с твоего вопроса без проверки. Если вертикальная линия приемлема, я могу уменьшить свой счет на 1.
Нил

1
Отлично, так как теперь мой новый ответ экономит 2 байта!
Нил

Ответы:


2

Сетчатка , 88 байт

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

Попробуйте онлайн!

Я полагаю, что я мог бы технически считать это как один байт на символ, заменяя некоторые символы, читая источник как ISO 8859-1, а затем находя однобайтовую кодировку для вывода, который содержит и , но я не могу работать подробности прямо сейчас. (Для записи, это будет 72 байта.)

объяснение

Этап 1: Замена

m`^ *
$&├── 

Мы начинаем с сопоставления отступа в каждой строке и вставки ├──.

Этап 2: Замена

 {4}
|   

Далее мы сопоставляем каждую группу из 4 пробелов и заменяем первое на a |. Теперь все, что нужно исправить, |это перейти к нижней части вывода, и это должно быть . Оба этих случая можно распознать, посмотрев на символ, который находится ниже того, который мы потенциально хотим изменить.

Стадия 3: Транслитерация

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

В (?<=(.)*)подсчитывает , сколько символов предшествуют матч на текущей строке , чтобы измерить его в горизонтальное положение. Тогда упреждающая выборка скачет к следующей строке с .+¶, спичками , как много символов , как мы захватили в группе 1с (?>(?<-1>.)*)(в заранее же горизонтальное положение) , а затем проверяет , является ли один из следующего символа (т.е. один ниже фактического матча) |├└, Если это так, то совпадение не удается, и во всех остальных случаях оно успешно, и сцена заменяет пробелы для |и для .

Это не исправит все символы за один проход, поэтому мы применяем эту стадию несколько раз с +опцией, пока вывод не перестанет изменяться.

Этап 4: Замена

^
.¶

Все, что осталось, это первая строка, поэтому мы просто сопоставляем начало строки и добавляем a .и перевод строки.


Пояснения пожалуйста?
Нил

@Neil Вот, пожалуйста.
Мартин Эндер

Поможет ли это использовать +`(?<=(.*))\|(?!.+¶\1[|├])(пробел) +`(?<=(.*))├(?!.+¶\1[│├└]) ?
Нил

@Neil Я пытался что-то подобное, но я не думаю, что мне удалось сохранить байты с этим.
Мартин Эндер

Новая идея:m`^ * $&└── T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
Нил

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)

Где \nпредставляет буквальный символ новой строки. Объяснение: rсоздается sпутем добавления .строки и вставки └──в конце отступа каждой строки. Теперь это верно для последней строки ввода, но каждая должна быть «расширена» вверх, насколько это возможно. Это работа q, которая ищет a и рекурсивно заменяет пробелы непосредственно над ним на |s, если только он не достигает другого, в который вместо этого превращаются . Рекурсия заканчивается, когда дальнейшие замены невозможны. Обратите внимание, что если символ над символом « пробел» или «a», то текст слева от него всегда совпадает в предыдущей строке, поэтому я могу просто использовать\1 чтобы проверить, что один символ выше другого.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.