โครงสร้างไดเรกทอรีแบบต้นไม้กราฟิก


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
  • สี่ช่องว่างระบุโฟลเดอร์หรือไฟล์ที่ซ้อนกันของ dir ด้านบน
  • ระดับหมวดหมู่ที่ซ้อนกันที่อนุญาตอาจแตกต่างกันไป

ปรับปรุง

  • ชื่อไฟล์ : ชื่อไฟล์ Linux ที่ถูกต้องโดยไม่มีช่องว่างและ linefeeds: ไบต์ใด ๆ ยกเว้นNUL, /และspaces,linefeeds
  • ตัวละครการวาดภาพ:
    • | เส้นแนวตั้ง (U + 007C)
    • ภาพวาดกล่องแนวนอนขนาดย่อม (U + 2500)
    • ภาพวาดกล่องไฟแนวตั้งและขวา (U + 251C)

ผู้ชนะ : รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!


1
ยินดีต้อนรับสู่ PPCG! โพสต์แรกที่ดี!
Rɪᴋᴇʀ

เส้นแนวตั้งควรเป็น \ x7C Vertical Line หรือ \ u2502 Box Drawings Light Vertical
Neil

@ ถึงตอนนี้ฉันไม่ทราบว่า "ภาพวาดกล่องแสงแนวตั้ง" ฉันเคยใช้ "เส้นแนวตั้ง" ในตัวอย่างและมีคำตอบสองข้ออยู่แล้ว มันจะมีเหตุผลมากกว่าที่จะใช้ตัวเก่าอยู่แล้วเพราะตัวละครอีกสองตัวเป็นแบบ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 .และ a linefeed


กรุณาอธิบาย
Neil

@ ไม่มีคุณไป
Martin Ender

มันจะช่วยให้การใช้งาน+`(?<=(.*))\|(?!.+¶\1[|├])(เว้นวรรค) +`(?<=(.*))├(?!.+¶\1[│├└]) ?
Neil

@Nil ฉันลองทำอะไรแบบนั้น แต่ฉันไม่คิดว่าฉันจะสามารถประหยัดไบต์ได้
Martin Ender

แนวคิดใหม่:m`^ * $&└── T+` └`|├`(?<=(.*)).(?=.+¶\1[|└])
Neil

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ซึ่งค้นหาและแทนที่ช่องว่างข้างบนซ้ำด้วย|s เว้นเสียแต่ว่าจะไปถึงอีกอันที่กลายเป็นแทน การเรียกซ้ำจะสิ้นสุดลงเมื่อไม่สามารถทำการทดแทนเพิ่มเติมได้ โปรดทราบว่าถ้าตัวละครด้านบนคือช่องว่างหรือข้อความข้อความทางด้านซ้ายของจะเป็นเช่นเดียวกับในบรรทัดก่อนหน้าดังนั้นฉันสามารถใช้\1 เพื่อทดสอบว่าอักขระตัวหนึ่งอยู่เหนืออีกตัวหนึ่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.