Ich kann den Wald für die Schlüssel nicht sehen

16

Schreiben Sie ein Programm oder eine Funktion, die eine nicht leere Liste von ganzen Zahlen in einem angemessenen Format wie 4, 0, -1, -6, 2oder enthält [4 0 -1 -6 2].

Drucken Sie eine Zeichenfolge, die die Liste als ASCII-Gesamtstruktur darstellt, oder geben Sie sie zurück, wobei jede Zahl zu einem Baum proportionaler Höhe wird. Jeder Baum nimmt wie folgt vier Textspalten in der Ausgabe auf:

  • Eine positive ganze Zahl N wird zu einem Baum, dessen Basis __|_und Spitze ^ N Schichten / \dazwischen haben.

    Wenn beispielsweise N = 1 ist, ist der Baum

      ^
     / \
    __|_
    

    wenn N = 2 ist, ist der Baum

      ^
     / \
     / \
    __|_
    

    wenn N = 3 ist, ist der Baum

      ^
     / \
     / \
     / \
    __|_
    

    und so weiter.

  • Eine negative ganze Zahl N wird genau wie der entsprechende positive Baum, außer dass ein vertikaler Strich zwischen den Verzweigungsschrägstrichen anstelle eines Leerzeichens steht.

    Wenn beispielsweise N = -1 ist, ist der Baum

      ^
     /|\
    __|_
    

    wenn N = -2 ist der Baum

      ^
     /|\
     /|\
    __|_
    

    wenn N = -3 ist der Baum

      ^
     /|\
     /|\
     /|\
    __|_
    

    und so weiter.

  • Wenn die Ganzzahl 0 ist, gibt es technisch gesehen keinen Baum, nur eine leere Stelle mit vier Unterstrichen:

    ____
    

Die Unterstriche an der Basis jedes Baums müssen in der Ausgabe ausgerichtet sein, dh alle Bäume müssen ihre Basis auf derselben Ebene haben. Außerdem wird nach dem letzten Baum ein einzelner Unterstrich am Ende der Zeile mit Unterstrichen eingefügt. Dies macht es so, dass jeder Baum eine leere Luftsäule auf beiden Seiten hat.

Als Beispiel 4 0 -1 -6 2wäre die Ausgabe für

              ^
             /|\
  ^          /|\
 / \         /|\
 / \         /|\  ^
 / \      ^  /|\ / \
 / \     /|\ /|\ / \
__|_______|___|___|__

Beachten Sie, dass die Baummuster immer eine führende Spalte mit leerem Raum haben, aber ein Unterstrich hinzugefügt werden musste, um die rechte Seite des letzten Baums aufzufüllen.

Ebenfalls:

  • Nachgestellte Leerzeichen in allen Zeilen sind in Ordnung, es sollten jedoch keine unnötigen führenden Leerzeichen vorhanden sein.
  • Führende Zeilenumbrüche sind nicht zulässig (der höchste Baum sollte den oberen Rand des Ausgabetextgitters berühren), und es ist nur eine abschließende Zeile zulässig.
  • Die Liste kann ganze Zahlen von -250 bis 250 enthalten. Der Umgang mit höheren Bäumen ist nicht erforderlich.

Der kürzeste Code in Bytes gewinnt.

Mehr Beispiele

3:

  ^
 / \
 / \
 / \
__|__

-2:

  ^
 /|\
 /|\
__|__

0:

_____

0, 0:

_________

0, 1, 0:

      ^
     / \
______|______

0, -1, 2, -3, 4:

                  ^
              ^  / \
          ^  /|\ / \
      ^  / \ /|\ / \
     /|\ / \ /|\ / \
______|___|___|___|__
Calvins Hobbys
quelle

Antworten:

6

Pyth, 48 Bytes

j_.t+sm.i,J\_?d++\|sm?>d0\ \|d\^Jms+Jmkd"/\\"QJd

Probieren Sie es online aus: Demo oder Test Suite

Zu faul für eine vollständige Erklärung. Hier nur eine kurze Übersicht:

Ich erstelle die Spalten. Also das Bild:

      ^ 
  ^  /|\
 / \ /|\
__|___|__

wird generiert als:

["_", "_/", "| ^", "_\", "_", "_//", "|||^", "_\\", "_"]

Beachten Sie, dass ich nur den unteren Teil (alles ohne Leerzeichen) generiere. Und ich generiere sie auch von unten nach oben. Dies ist ziemlich unkompliziert.

Dann kann ich die .tMethode verwenden, um Leerzeichen an die Zeichenfolgen anzuhängen, sodass jede Zeichenfolge die gleiche Länge hat. Und danach kehre ich die Reihenfolge um und drucke.

Jakube
quelle
Als Hinweis: Wenn dies eine tatsächliche Ausgabe ist, haben Sie möglicherweise vergessen, _nach dem letzten Baum einen abschließenden (Unterstrich) einzufügen.
Insertusernamehere
1
@insertusernamehere Danke, habe das Nachziehen komplett übersehen _.
Jakube,
7

Python 2, 165 Bytes

a=input()
l=max(map(abs,a))
while l+2:s=' _'[l<0];print(s+s.join((([' ^ ','//| \\\\'[x>0::2],'   '][cmp(abs(x),l)],'_|_')[l<0],s*3)[x==0]for x in a)+s).rstrip();l-=1

Dies ist ein vollständiges Programm, das eine Liste als Eingabe akzeptiert. Ich spiele immer noch dieses schreckliche Durcheinander.

xsot
quelle
4

PHP, 231 277 Bytes

Diese Herausforderung hat eine schöne Leistung.

$x=fgetcsv(STDIN);for(;$i<2+max(array_map(abs,$x));$i++)for($j=0;$j<count($x);){$_=$x[$j++];$o[$i].=!$i?$_?'__|_':____:(abs($_)>=$i?0>$_?' /|\\':' / \\':($i-1&&abs($_)==$i-1?'  ^ ':'    '));}echo implode("
",array_reverse($o))."_";

Liest eine durch Kommas getrennte Liste (Leerzeichen sind optional) von STDIN:

$ php trees.php
> 1, 2, 0, -4, 6

Ungolfed

$x=fgetcsv(STDIN);
for(;$i<2+max(array_map(abs,$x));$i++)
    for($j=0;$j<count($x);){
        $_=$x[$j++];
        $o[$i] .= !$i ? $_?'__|_':____
                      : (abs($_)>=$i ? 0>$_?' /|\\':' / \\'
                                     : ($i-1&&abs($_)==$i-1 ? '  ^ ' : '    '));
    }
echo implode("\n",array_reverse($o))."_";

Bearbeitungen

  • 46 Bytes gespeichert . Die Array-Initialisierung wurde verworfen, durch if/elseternäre Operatoren ersetzt und einige der Variablen verschoben, um einige Bytes zu sparen.
insertusernamehere
quelle
2

Ruby, 157 156 153 Zeichen

->h{r=[]
h.map{|i|j=i.abs
r+=[s=?_,?/*j+s,i==0?s:?^+(i>0?' ':?|)*j+?|,?\\*j+s].map{|l|l.rjust(h.map(&:abs).max+2).chars}}
r.transpose.map{|l|l*''}*$/+?_}

Geschrieben, nur weil es anfangs Array.transposewie eine gute Idee aussah. Nicht länger.

Probelauf:

2.1.5 :001 > puts ->h{r=[];h.map{|i|j=i.abs;r+=[s=?_,?/*j+s,i==0?s:?^+(i>0?' ':?|)*j+?|,?\\*j+s].map{|l|l.rjust(h.map(&:abs).max+2).chars}};r.transpose.map{|l|l*''}*$/+?_}[[4, 0, -1, -6, 2]]
              ^     
             /|\    
  ^          /|\    
 / \         /|\    
 / \         /|\  ^ 
 / \      ^  /|\ / \
 / \     /|\ /|\ / \
__|_______|___|___|__
Mann bei der Arbeit
quelle
Das Sammeln der Teile in einem separaten Array, anstatt sie von der ersten Karte zurückzugeben, sollte es ermöglichen, die Verwendung von Reduzieren zu vermeiden.
manatwork
0

C #, 318 Bytes

Ich habe versucht, das Array zu transponieren. Ich bin mir nicht sicher, ob das die beste Lösung war.

string F(int[]a){int i=a.Length,j,w=i*4+1,h=0;string f="",o=f;for(;i-->0;){j=a[i];f+=","+" _,".PadLeft(j=j>0?j+3:-j+3,'\\')+(j>3?"^"+"|_,".PadLeft(j,a[i]<0?'|':' '):"_,")+" _,_".PadLeft(j+1,'/');h=h<j?j:h;}f="_".PadLeft(h=h>3?h:2,'\n')+f;for(i+=h<3?1:0;++i<h;)for(j=w;j-->0;)o+=f.Split(',')[j].PadLeft(h)[i];return o;}

Einrückung und Zeilenumbrüche für mehr Klarheit:

string F(int[]a)
{
    int i=a.Length,
        j,
        w=i*4+1,
        h=0;
    string f="",o=f;
    for(;i-->0;){
        j=a[i];
        f+=","+" _,".PadLeft(j=j>0?j+3:-j+3,'\\')+(j>3?"^"+"|_,".PadLeft(j,a[i]<0?'|':' '):"_,")+" _,_".PadLeft(j+1,'/');
        h=h<j?j:h;
    }
    f="_".PadLeft(h=h>3?h:2,'\n')+f;
    for(i+=h<3?1:0;++i<h;)
        for(j=w;j-->0;)
            o+=f.Split(',')[j].PadLeft(h)[i];
    return o;
}
Hand-E-Food
quelle