H Ağaç Dizinleri


12

Programcılar genellikle çizim fraktalları takıntılı . Bence yeni bir bilgisayar ortamına ihtiyacımız var.

H ağaç yatay ve dikey çizgiler yapılmış fraktal oldukça basit bir türüdür. İşte onuncu yinelemede ( Wikipedia nezaket ):

H ağacı

Şimdi, görüntüdeki her satırın standart bir bilgisayar dosya sisteminde bir dizin (klasör) olduğunu düşünün. En küçük çizgiler hariç tümü kendilerinden daha küçük iki çizgiyle kesişir; bu iki küçük çizgi , büyük çizginin alt dizinleridir . Böylece, ortadaki büyük yatay çizgi, görüntüdeki diğer çizgilerin ebeveynleri, büyükanne ve büyükbabaları vb. Olan en büyük iki dikey çizginin üst dizinidir.

Meydan okuma

Stdin veya komut satırı (veya en yakın alternatif) aracılığıyla pozitif bir tamsayı N alan ve H ağacı fraktalının Nth yinelemesini yansıtan bir dizin ağacı oluşturan bir program yazın.

İlk yineleme (N = 1) tek bir yatay çizgidir. Sonraki her yinelemede, mevcut çizgilerin uçlarına yeni bir dikey veya yatay çizgi kümesi eklenir. Böylece N = 2 için iki dikey çizgi (H şekli yaparak) eklenir, N = 3 için buna dört yatay çizgi eklenir, vb.

Kök dizinin adı her zaman olmalıdır tree. Dizinlerinin isimleri kullanarak üst doğruya göre olan yönü aynı olmalıdır right, left, upve down.

Kök dizin her zaman yatay bir çizgi olduğundan, her zaman rightve leftalt dizinleri olacaktır. Ancak bu ikisi upve downalt dizinleri olacak rightve bunlar leftve benzerleri olacaktır.

Yineleme sınırının sonundaki dizinler boş olmalıdır.

Misal

N = 3 için dizin ağacı şöyle görünmelidir:

tree
    right
        up
        down
    left
        up
        down

İlave bilgi

  • İdeal olarak treedizin, kaynak kodun bulunduğu klasörde açılır, ancak bazı çalışma dizinine giderse sorun olmaz.
  • treeSizinkinin oluşturulacağı yerde önceden var olan bir dizin olmadığını varsayabilirsiniz .
  • Programınızın her zaman aynı ortak modern işletim sisteminde (Mac / Windows / Linux) çalıştırılacağını varsayabilirsiniz. Temelde tüm işletim sistemlerinde çalışmayan bir dosya ayırıcı kullanma konusunda endişelenmeyin.

puanlama

Bu yüzden en kısa kod kod golf, olduğu bayt içinde kazanır.


Alt dizinleri mı treehep olmak zorunda leftve rightyerine upve down?
KSFT

1
@KSFT Evet: "Kök dizin her zaman yatay bir çizgi olduğundan, her zaman sağ ve sol alt dizinleri olacaktır."
Calvin'in Hobileri

Yanıtlar:


5

Ruby, 127 bayt

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 üzerinde test edilmiştir. STDIN ile girdi alır.

fözyineli olarak ağacın gerekli yapraklarının bir listesini oluşturur ve sonra bunları tek bir sistem çağrısına beslerim mkdir.


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)

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)

biraz daha kısafrom os import*;s=system
DenDenDo

İki şey daha: ayrıca yapabilirsiniz ["left","up"][n%2]ve (0,1)vermek için köşeli parantez bırakabilirsinizfor i in 0,1:
Sp3000

2

Python 2 + * Nix coreutils, 212 189

En içteki tüm yolları ve çağrıları oluşturur

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

Giriş <1 ise çöküyor


ilk iki satırı birleştirebilirsiniz:import os,itertools as t
DenDenDo

@DenDenDo itertools tamamen kaldırıldı
user80551
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.