H Tree Direktori

12

Programmer sering terobsesi dengan menggambar fraktal. Saya pikir kita membutuhkan media berbasis komputer baru.

The pohon H adalah jenis cukup sederhana dari fraktal yang terbuat dari garis-garis horizontal dan vertikal. Ini dia saat iterasi kesepuluh ( courtesy Wikipedia ):

Pohon H

Sekarang, bayangkan setiap baris dalam gambar adalah direktori (folder) dalam sistem file komputer standar. Semua kecuali garis terkecil memotong dua garis lebih kecil dari diri mereka sendiri; dua garis yang lebih kecil ini adalah subdirektori dari garis yang lebih besar. Dengan demikian garis horizontal besar di tengah adalah direktori induk dari dua garis vertikal terbesar, yang pada gilirannya adalah orangtua, kakek-nenek, dll. Dari sisa garis dalam gambar.

Tantangan

Tulis sebuah program yang mengambil bilangan bulat positif N melalui stdin atau baris perintah (atau alternatif terdekat) dan membuat pohon direktori yang mencerminkan iterasi ke-N dari fraktal H tree.

Iterasi pertama (N = 1) adalah garis horizontal tunggal. Dalam setiap iterasi berikutnya, satu set garis vertikal atau horizontal baru ditambahkan ke ujung garis saat ini. Jadi untuk N = 2 dua garis vertikal ditambahkan (membuat bentuk H), untuk N = 3 empat garis horizontal ditambahkan ke sana, dll.

Nama direktori root harus selalu tree. Nama-nama subdirektori harus sesuai dengan arah mereka berada di sehubungan dengan garis orang tua mereka, menggunakan right, left, updan down.

Karena direktori root selalu berupa garis horizontal, direktori rightdan leftsub direktori akan selalu ada . Tetapi keduanya akan memiliki updan downsubdirektori, dan mereka akan memiliki rightdan leftlagi, dan seterusnya.

Direktori di akhir batas iterasi harus kosong.

Contoh

Untuk N = 3 pohon direktori akan terlihat seperti ini:

tree
    right
        up
        down
    left
        up
        down

Informasi tambahan

  • Idealnya treedirektori akan muncul di folder yang sama dengan kode sumber, tetapi tidak apa-apa jika masuk ke beberapa direktori yang berfungsi.
  • Anda dapat berasumsi bahwa tidak ada treedirektori yang sudah ada di tempat Anda akan dibuat.
  • Anda dapat berasumsi bahwa program Anda akan selalu dijalankan pada sistem operasi modern umum yang sama (Mac / Windows / Linux). Pada dasarnya jangan khawatir tentang menggunakan pemisah file yang tidak berfungsi di semua OS.

Mencetak gol

Ini adalah kode-golf, jadi kode terpendek dalam byte menang.

Hobi Calvin
sumber
Apakah subdirektori dari treeselalu harus leftdan rightbukannya updan down?
KSFT
1
@KSFT Ya: "Karena direktori root selalu berupa garis horizontal, maka subdirektori akan selalu memiliki kanan dan kiri."
Hobi Calvin

Jawaban:

5

Ruby, 127 byte

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]*'" "'+?"

Diuji pada Windows. Mengambil input melalui STDIN.

fsecara rekursif menghasilkan daftar daun yang diperlukan dari pohon, dan kemudian saya hanya memberi makan mereka dengan satu panggilan sistem mkdir.

Martin Ender
sumber
3

Lua, 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)
CJStuart
sumber
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)
KSFT
sumber
ini sedikit lebih pendek untuk dilakukanfrom os import*;s=system
DenDenDo
Dua hal lagi: Anda juga dapat melakukan ["left","up"][n%2]dan Anda bisa drop kurung di sekitar (0,1)untuk memberifor i in 0,1:
Sp3000
2

Python 2 + * nix coreutils, 212 189

Menghasilkan semua jalur dan panggilan terdalam

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)))))

Gangguan jika input <1

pengguna80551
sumber
Anda dapat menggabungkan dua baris pertama:import os,itertools as t
DenDenDo
@DenDenDo Dihapus itertools sepenuhnya
user80551