디렉토리 구조 그래픽 트리 피 케이션


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
  • 네 개의 공백은 위의 디렉토리의 중첩 폴더 또는 파일을 지정합니다.
  • 허용되는 중첩 범주 수준은 다를 수 있습니다.

최신 정보

  • 파일 이름 : 유효 리눅스는 공백과 줄 바꿈하지 않고는 파일 이름 : 제외한 모든 바이트 NUL, /spaces ,linefeeds
  • 그림 문자 :
    • |세로선 (U + 007C)
    • 상자 그림이 가로로 밝게 표시됨 (U + 2500)
    • 상자 그림이 세로로 오른쪽 및 오른쪽 (U + 251C)

우승자 : 바이트 단위의 최단 코드 승리!


1
PPCG에 오신 것을 환영합니다! 좋은 첫 포스트!
Rɪᴋᴇʀ

세로선이 \ x7C 세로선 또는 \ u2502 상자 도면이 세로로되어 있습니까?
Neil

@Neil 나는 "Box Drawings Light Vertical"을 몰랐는데, 예제에서 "Vertical Line"을 사용했고 이미 두 가지 대답이 있습니다. 다른 두 문자는 Box Drawings 유형 이므로 이전 문자를 사용하는 것이 더 의미가 있습니다. \ u2502로 질문을 업데이트해야합니까?
marcanuy

선택한 REPL에 상자 그림 문자를 쉽게 입력 할 수 없으므로 L, + 및-문자를 사용하여 답을 작성한 다음 실제로 그림을 복사했지만 상자 그림 문자를 사용하고 있다고 생각하여 점수를 조정했습니다. 확인하지 않고 질문에서 붙여 넣습니다. 수직선이 허용되면 점수를 1 씩 줄일 수 있습니다.
Neil

1
새 답변에 2 바이트를 저장하기 때문에 훌륭합니다!
Neil

답변:


2

레티 나 , 88 바이트

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

온라인으로 사용해보십시오!

나는 기술적으로, 일부 문자를 교환 ISO 8859-1로 소스를 읽고 다음이 포함 된 출력을위한 단일 바이트 인코딩을 찾아 문자 당 한 바이트로이 셀 수 있다고 가정 하고 하지만 작업에 방해 될 수 없다 세부 사항을 지금 당장. (레코드의 경우 72 바이트입니다.)

설명

1 단계 : 대체

m`^ *
$&├── 

각 줄의 들여 쓰기를 일치시키고를 삽입하여 시작합니다 ├──.

2 단계 : 교체

 {4}
|   

다음으로, 우리는 4 개의 공백으로 구성된 모든 그룹을 일치시키고 첫 번째 공백을로 대체합니다 |. 이제 수정 해야 할 |것은 출력의 맨 아래로 이동하는 입니다. 이 두 가지 경우 모두 우리가 바꾸고 싶은 캐릭터 바로 아래의 캐릭터를 보면 알 수 있습니다.

3 단계 : 음역

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

(?<=(.)*)많은 문자가 현재 행에 경기를 선행하는 방법을 수는 그것의 수평 위치를 측정합니다. 그런 다음 lookahead는로 다음 줄로 건너 뛰고 .+¶그룹에서 캡처 한만큼 많은 문자를 일치 1시키고 (?>(?<-1>.)*)(같은 수평 위치로 이동) 다음 문자 (예 : 실제 일치 아래 문자)가 다음 중 하나인지 확인합니다 |├└. 그런 경우에는, 경기는 실패하고 다른 모든 경우에 성공하고 무대에 대한 공백을 대체 |하고 위해 .

한 번의 실행으로 모든 문자를 수정하지는 않으므로 +출력 변경이 중지 될 때까지 옵션 으로이 단계를 반복적으로 적용합니다 .

4 단계 : 교체

^
.¶

남은 것은 첫 번째 줄이므로 문자열의 시작 부분을 일치시키고 a .와 줄 바꿈을 추가합니다 .


설명해주세요
Neil

@Neil 거기 당신은 간다.
마틴 엔더

+`(?<=(.*))\|(?!.+¶\1[|├])(공간) 을 사용하는 것이 도움이 +`(?<=(.*))├(?!.+¶\1[│├└]) 됩니까?
Neil

@ Neil 나는 그런 것을 시도했지만 바이트를 절약 할 수는 없다고 생각합니다.
마틴 엔더

새로운 아이디어 :m`^ * $&└── T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
Neil

2

자바 스크립트 (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앞두고 붙이는로 .라인을 그리고 삽입 └──각 행의 들여 쓰기의 끝에서. 이제 입력의 마지막 줄에 맞지만 가능한 한 위쪽으로 "확장"해야합니다. 이것은의 일이다 qA에 대한 어떤 검색, 재귀 적으로 직접 위의 공간을 대체하는 |또 다른 도달하지 않는 한의 에 점등되고있는 대신합니다. 더 이상 교체 할 수 없으면 재귀가 종료됩니다. 위의 문자 가 공백이거나 a 왼쪽 문자 가 항상 이전 줄 의 문자 와 같으므로 사용할 수 있습니다.\1 한 캐릭터가 다른 캐릭터 위에 있는지 테스트합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.