Estrutura de diretórios Árvore gráfica

9

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 , /e spaces,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!

marcanuy
fonte
11
Bem-vindo ao PPCG! Bom primeiro post!
Rɪᴋᴇʀ
As linhas verticais devem ser \ x7C Vertical Line ou \ u2502 Box Drawings Light Vertical?
911 Neil
@ Neil Eu não conhecia "Box Drawings Light Vertical", usei "Vertical Line" no exemplo e já existem duas respostas para isso. Seria mais sensato usar o primeiro de qualquer maneira, porque os outros dois caracteres são do tipo Desenhos de caixa , devo atualizar a pergunta com \ u2502?
Marcanuy
Como não consigo digitar facilmente caracteres de desenho de caixa no meu REPL de sua escolha, escrevi minha resposta usando os caracteres L, + e - e ajustei a pontuação acreditando que você estava usando caracteres de desenho de caixa por todo o lado, apesar de eu ter apenas copiado e colado da sua pergunta sem verificar. Se linha vertical é aceitável, eu poderia reduzir a minha pontuação por 1.
Neil
11
Excelente, já que agora salva meus 2 bytes na minha nova resposta!
911 Neil

Respostas:

2

Retina , 88 bytes

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

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

m`^ *
$&├── 

Começamos combinando o recuo em cada linha e inserindo ├──.

Etapa 2: Substituição

 {4}
|   

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

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

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 grupo 1com (?>(?<-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.

Martin Ender
fonte
Explicação, por favor?
911 Neil
@ Neil Lá vai você.
Martin Ender
Ajudaria a usar +`(?<=(.*))\|(?!.+¶\1[|├])(espaço) +`(?<=(.*))├(?!.+¶\1[│├└]) ?
Neil
@ Neil Tentei algo assim, mas não acho que consegui salvar bytes com ele.
Martin Ender
Nova idéia:m`^ * $&└── T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
Neil
2

JavaScript (ES6), 237 128 bytes

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

Onde \nrepresenta o caractere literal de nova linha. Explicação: ré criado a partir sda 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 de q, 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

Neil
fonte