H Baumverzeichnisse


12

Programmierer sind oft besessen davon , Fraktale zu zeichnen . Ich denke, wir brauchen ein neues computerbasiertes Medium.

Der H-Baum ist eine ziemlich einfache Art von Fraktalen, die aus horizontalen und vertikalen Linien bestehen. Hier ist es bei der zehnten Iteration (mit freundlicher Genehmigung von Wikipedia ):

H Baum

Stellen Sie sich nun vor, jede der Zeilen im Bild ist ein Verzeichnis (Ordner) in einem Standard-Computer-Dateisystem. Alle außer den kleinsten Linien kreuzen zwei Linien, die kleiner sind als sie selbst; Diese beiden kleineren Zeilen sind Unterverzeichnisse der größeren Zeile. Somit ist die große horizontale Linie in der Mitte das Elternverzeichnis der beiden größten vertikalen Linien, die wiederum Eltern, Großeltern usw. der übrigen Linien im Bild sind.

Herausforderung

Schreiben Sie ein Programm, das eine positive Ganzzahl N über stdin oder die Befehlszeile (oder die nächstgelegene Alternative) aufnimmt und einen Verzeichnisbaum erstellt, der die N-te Iteration des H-Baum-Fraktals widerspiegelt.

Die erste Iteration (N = 1) ist eine einzelne horizontale Linie. In jeder nachfolgenden Iteration wird ein neuer Satz vertikaler oder horizontaler Linien an die Enden der aktuellen Linien angefügt. Für N = 2 werden also zwei vertikale Linien hinzugefügt (wodurch eine H-Form entsteht), für N = 3 werden vier horizontale Linien hinzugefügt usw.

Der Name des Stammverzeichnisses muss immer sein tree. Die Namen der Unterverzeichnisse müssen die Richtung passen sie in Bezug auf ihre Elternlinie sind, mit right, left, upund down.

Da das Stammverzeichnis immer eine horizontale Linie ist, hat es immer rightund leftUnterverzeichnisse. Aber diese beiden haben upund downUnterverzeichnisse, und diese haben rightund leftwieder und so weiter.

Die Verzeichnisse am Ende des Iterationslimits sollten leer sein.

Beispiel

Für N = 3 sollte der Verzeichnisbaum so aussehen:

tree
    right
        up
        down
    left
        up
        down

Zusätzliche Information

  • Idealerweise wird das treeVerzeichnis in demselben Ordner angezeigt, in dem sich der Quellcode befindet, aber es ist in Ordnung, wenn es in ein Arbeitsverzeichnis verschoben wird.
  • Sie können davon ausgehen, dass es treean dem Ort, an dem Ihr Verzeichnis erstellt wird, kein bereits vorhandenes Verzeichnis gibt .
  • Sie können davon ausgehen, dass Ihr Programm immer auf demselben modernen Betriebssystem (Mac / Windows / Linux) ausgeführt wird. Grundsätzlich sollten Sie sich keine Gedanken über die Verwendung eines Dateitrennzeichens machen, das nicht in allen Betriebssystemen funktioniert.

Wertung

Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes .


Müssen die Unterverzeichnisse von treeimmer leftund rightstatt upund sein down?
KSFT

1
@KSFT Ja: "Da das Stammverzeichnis immer eine horizontale Linie ist, hat es immer die rechten und linken Unterverzeichnisse."
Calvins Hobbys

Antworten:


5

Ruby, 127 Bytes

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

Getestet unter Windows. Übernimmt die Eingabe über STDIN.

fgeneriert rekursiv eine Liste der benötigten Blätter des Baumes und füttere sie dann einfach mit einem einzigen Systemaufruf von 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)

Es ist etwas kürzer zu tunfrom os import*;s=system
DenDenDo

Zwei weitere Dinge: Sie können auch tun ["left","up"][n%2]und die Klammern fallen lassen, um (0,1)zu gebenfor i in 0,1:
Sp3000

2

Python 2 + * nix coreutils, 212 189

Erzeugt alle innersten Pfade und Aufrufe

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

Abstürze bei Eingabe <1


Sie können die ersten beiden Zeilen kombinieren:import os,itertools as t
DenDenDo

@DenDenDo Itertools vollständig entfernt
user80551
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.