Преобразуйте классическую структуру каталогов следующим образом:
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)
Победитель : кратчайший код в байтах побеждает!
Ответы:
Сетчатка , 88 байт
Попробуйте онлайн!
Я полагаю, что я мог бы технически считать это как один байт на символ, заменяя некоторые символы, читая источник как ISO 8859-1, а затем находя однобайтовую кодировку для вывода, который содержит
├
и└
, но я не могу работать подробности прямо сейчас. (Для записи, это будет 72 байта.)объяснение
Этап 1: Замена
Мы начинаем с сопоставления отступа в каждой строке и вставки
├──
.Этап 2: Замена
Далее мы сопоставляем каждую группу из 4 пробелов и заменяем первое на a
|
. Теперь все, что нужно исправить,|
это перейти к нижней части вывода, и├
это должно быть└
. Оба этих случая можно распознать, посмотрев на символ, который находится ниже того, который мы потенциально хотим изменить.Стадия 3: Транслитерация
В
(?<=(.)*)
подсчитывает , сколько символов предшествуют матч на текущей строке , чтобы измерить его в горизонтальное положение. Тогда упреждающая выборка скачет к следующей строке с.+¶
, спичками , как много символов , как мы захватили в группе1
с(?>(?<-1>.)*)
(в заранее же горизонтальное положение) , а затем проверяет , является ли один из следующего символа (т.е. один ниже фактического матча)|├└
, Если это так, то совпадение не удается, и во всех остальных случаях оно успешно, и сцена заменяет пробелы для|
и└
для├
.Это не исправит все символы за один проход, поэтому мы применяем эту стадию несколько раз с
+
опцией, пока вывод не перестанет изменяться.Этап 4: Замена
Все, что осталось, это первая строка, поэтому мы просто сопоставляем начало строки и добавляем a
.
и перевод строки.источник
+`(?<=(.*))\|(?!.+¶\1[|├])
(пробел)+`(?<=(.*))├(?!.+¶\1[│├└])
└
?m`^ *
$&└──
T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
JavaScript (ES6),
237128 байтГде
\n
представляет буквальный символ новой строки. Объяснение:r
создаетсяs
путем добавления.
строки и вставки└──
в конце отступа каждой строки. Теперь это верно для последней строки ввода, но каждая└
должна быть «расширена» вверх, насколько это возможно. Это работаq
, которая ищет a└
и рекурсивно заменяет пробелы непосредственно над ним на|
s, если только он не достигает другого, в└
который├
вместо этого превращаются . Рекурсия заканчивается, когда дальнейшие замены невозможны. Обратите внимание, что если символ над символом «└
пробел» или «a»,└
то текст слева от него└
всегда совпадает в предыдущей строке, поэтому я могу просто использовать\1
чтобы проверить, что один символ выше другого.источник