Converta uma estrutura de diretório clássica como esta:
config.yml
drafts
begin-with-the-crazy-ideas.textile
on-simplicity-in-technology.markdown
includes
footer.html
header.html
Nisso
.
├── config.yml
├── drafts
| ├── begin-with-the-crazy-ideas.textile
| └── on-simplicity-in-technology.markdown
└── includes
├── footer.html
└── header.html
- Quatro espaços especificam uma pasta ou arquivo aninhado do diretório acima.
- Os níveis de categorias aninhadas permitidos podem variar.
Atualizar
- nomes de arquivos : nomes de arquivos Linux válidos sem espaços e linhas de alimentação: qualquer byte
NUL
, exceto ,/
espaces
,linefeeds
- caracteres de desenho:
- | linha vertical (U + 007C)
- ─ desenhos de caixas com luz horizontal (U + 2500)
- ├ desenhos da caixa iluminados vertical e direito (U + 251C)
Vencedor : O menor código em bytes vence!
Respostas:
Retina , 88 bytes
Experimente online!
Suponho que eu poderia tecnicamente contar isso como um byte por caractere trocando alguns caracteres, lendo a fonte como ISO 8859-1 e encontrando uma codificação de byte único para a saída que contém
├
e└
, mas não posso me dar ao trabalho de trabalhar os detalhes agora. (Para o registro, isso seria 72 bytes.)Explicação
Etapa 1: Substituição
Começamos combinando o recuo em cada linha e inserindo
├──
.Etapa 2: Substituição
Em seguida, combinamos todos os grupos de 4 espaços e substituímos o primeiro por a
|
. Agora, tudo o que precisa ser corrigido é o|
que vai para a parte inferior da saída e├
deve ser└
. Ambos os casos podem ser reconhecidos observando o caractere diretamente abaixo do que potencialmente queremos alterar.Etapa 3: Transliteração
As
(?<=(.)*)
contagens de quantos caracteres precedem o jogo na linha atual para medi-la da posição horizontal. Em seguida, o lookahead pula para a próxima linha com.+¶
, corresponde a quantos caracteres capturamos em grupo1
com(?>(?<-1>.)*)
(para avançar para a mesma posição horizontal) e, em seguida, verifica se o próximo caractere (ou seja, abaixo da correspondência real) é um dos|├└
. Se for esse o caso, a correspondência falha e, em todos os outros casos, ela é bem-sucedida e o estágio substitui os espaços por|
e└
para├
.Isso não corrigirá todos os caracteres em uma única execução; portanto, aplicamos esse estágio repetidamente com a
+
opção até que a saída pare de mudar.Etapa 4: Substituição
Tudo o que resta é a primeira linha; portanto, simplesmente combinamos o início da string e acrescentamos um
.
e um avanço de linha.fonte
+`(?<=(.*))\|(?!.+¶\1[|├])
(espaço)+`(?<=(.*))├(?!.+¶\1[│├└])
└
?m`^ *
$&└──
T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
JavaScript (ES6),
237128 bytesOnde
\n
representa o caractere literal de nova linha. Explicação:r
é criado a partirs
da adição da.
linha e da inserção└──
no final do recuo de cada linha. Agora, isso está correto para a última linha da entrada, mas cada um└
deve ser "estendido" para cima, tanto quanto possível. Esse é o trabalho deq
, que procura└
ae substitui recursivamente os espaços diretamente acima dele por|
s, a menos que encontre outro└
que seja transformado├
. A recursão termina quando nenhuma substituição adicional puder ser feita. Observe que se o caractere acima de└
for um espaço ou a para testar se um caractere está acima do outro.└
, o texto à esquerda do└
é sempre o mesmo da linha anterior, para que eu possa usar\1
fonte