ไดเรกทอรีต้นไม้ H


12

โปรแกรมเมอร์มักหมกมุ่นอยู่กับการวาดเศษส่วน ฉันคิดว่าเราต้องการสื่อที่ใช้คอมพิวเตอร์เครื่องใหม่

ต้นไม้ Hเป็นชนิดที่ค่อนข้างง่ายของเศษส่วนที่ทำจากเส้นแนวนอนและแนวตั้ง ที่นี่มันอยู่ที่การทำซ้ำสิบ ( มารยาท Wikipedia ):

ต้นไม้เอช

ตอนนี้ลองนึกภาพแต่ละบรรทัดในรูปภาพเป็นไดเรกทอรี (โฟลเดอร์) ในระบบไฟล์คอมพิวเตอร์มาตรฐาน ทั้งหมดยกเว้นเส้นที่เล็กที่สุดตัดกันสองบรรทัดเล็กกว่าตัวพวกมันเอง สองเส้นเล็ก ๆ เหล่านี้เป็นไดเรกทอรีย่อยของบรรทัดที่ใหญ่กว่า ดังนั้นเส้นแนวนอนขนาดใหญ่ที่อยู่ตรงกลางจึงเป็นไดเรคทอรีหลักของเส้นแนวตั้งที่ใหญ่ที่สุดสองเส้นซึ่งอยู่ในแนวเดียวกันกับพ่อแม่ปู่ย่าตายาย ฯลฯ ของเส้นที่เหลือในภาพ

ท้าทาย

เขียนโปรแกรมที่รับจำนวนเต็มบวก N ผ่าน stdin หรือบรรทัดคำสั่ง (หรือตัวเลือกอื่นที่ใกล้เคียงที่สุด) และสร้างแผนผังไดเร็กทอรีที่สะท้อนการวนซ้ำ Nth ของเศษส่วนต้นไม้ H

การทำซ้ำครั้งแรก (N = 1) เป็นเส้นแนวนอนเดียว ในแต่ละการวนซ้ำที่ตามมาชุดใหม่ของเส้นแนวตั้งหรือแนวนอนจะถูกเพิ่มเข้าไปที่ปลายของบรรทัดปัจจุบัน ดังนั้นสำหรับ N = 2 จะมีการเพิ่มเส้นแนวตั้งสองเส้น (ทำให้เป็นรูปร่าง H) สำหรับ N = 3 สี่เส้นแนวนอนจะถูกเพิ่มเข้าไปในนั้นเป็นต้น

treeชื่อของไดเรกทอรีรากจะต้องเสมอ ชื่อของไดเรกทอรีย่อยจะต้องตรงกับทิศทางที่พวกเขาอยู่ในส่วนที่เกี่ยวกับเส้นพ่อแม่ของพวกเขาโดยใช้right, left, และupdown

เนื่องจากไดเรกทอรีรูทนั้นเป็นเส้นแนวนอนเสมอจึงจะมีrightและleftไดเรกทอรีย่อยอยู่เสมอ แต่ทั้งสองจะมีupและdownไดเรกทอรีย่อยและจะมีrightและleftอีกครั้งและอื่น ๆ

ไดเรกทอรีในตอนท้ายของการ จำกัด การวนซ้ำควรว่างเปล่า

ตัวอย่าง

สำหรับ N = 3 แผนผังไดเร็กทอรีควรมีลักษณะดังนี้:

tree
    right
        up
        down
    left
        up
        down

ข้อมูลเพิ่มเติม

  • ตามหลักแล้วtreeไดเรกทอรีจะปรากฏขึ้นในโฟลเดอร์เดียวกับที่มีซอร์สโค้ดอยู่ แต่ก็ไม่เป็นไรถ้ามันไปยังไดเรกทอรีที่ใช้งานได้
  • คุณอาจคิดว่าไม่มีtreeไดเรกทอรีที่มีอยู่แล้วในสถานที่ที่คุณจะถูกสร้างขึ้น
  • คุณอาจสมมติว่าโปรแกรมของคุณจะทำงานบนระบบปฏิบัติการที่ทันสมัยทั่วไป (Mac / Windows / Linux) เสมอ โดยทั่วไปไม่ต้องกังวลกับการใช้ตัวคั่นไฟล์ที่ไม่สามารถใช้งานได้กับทุกระบบปฏิบัติการ

เกณฑ์การให้คะแนน

นี่คือโค้ดกอล์ฟดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ


ไดเรกทอรีย่อยของtreeจะต้องเป็นleftและrightแทนที่จะเป็นupและdown?
KSFT

1
@KSFT ใช่: "เนื่องจากไดเรกทอรีรากเป็นเส้นแนวนอนเสมอมันจะมีไดเรกทอรีย่อยด้านซ้ายและขวาเสมอ"
งานอดิเรกของ Calvin

คำตอบ:


5

Ruby, 127 ไบต์

f=->n{n<2?['tree']:f[n-1].map{|p|%w{left right up down}[n%2*2,2].map{|d|p+?/+d}}.flatten}
system'mkdir "'+f[gets.to_i]*'" "'+?"

ทดสอบบน Windows ใช้อินพุตผ่าน STDIN

fmkdirซ้ำสร้างรายการของใบที่จำเป็นของต้นไม้และจากนั้นฉันก็แค่ให้อาหารพวกเขาจะเรียกระบบเดียวของ


3

ลัวะ, 179

t=0+io.read()a={"left","right","up","down"}function h(d,v)if v~=t then os.execute("mkdir "..d)x=1 if v%2==1 then x=3 end for g=x,x+1 do h(d.."\\"..a[g],v+1)end end end h("tree",0)

2

Python - 194

from os import system as s
a="mkdir "
s(a+"tree")
def f(n):
 if n<j%2:return
 for i in(0,1):m=["up"if n%2 else"left","rdiogwhnt"[n%2::2]][i];s(a+m);s("cd "+m);f(n-1);s("cd..")
j=input()
f(j+j%2)

มันสั้นกว่าเล็กน้อยที่ต้องทำfrom os import*;s=system
DenDenDo

อีกสองสิ่ง: คุณสามารถทำได้["left","up"][n%2]และคุณสามารถวางวงเล็บไว้(0,1)เพื่อมอบfor i in 0,1:
Sp3000

2

Python 2 + * nix coreutils, 212 189

สร้างเส้นทางและการโทรในสุดทั้งหมด

mkdir -p

import os
n=int(raw_input())-1 
for i in range(2**n):os.system("mkdir -p "+os.path.join('tree',*([['right','left'],['up','down']][b%2][int(j)]for b,j in enumerate('{:0{}b}'.format(i,n)))))

ล้มเหลวหากอินพุต <1


คุณสามารถรวมสองบรรทัดแรก:import os,itertools as t
DenDenDo

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