Anahtarlar için ormanı göremiyorum


16

Gibi herhangi bir makul uygun formatta tamsayılar bir boş olmayan listesinde götüren bir program veya fonksiyon yazın 4, 0, -1, -6, 2veya [4 0 -1 -6 2].

Listeyi ASCII sanat ormanı olarak tasvir eden bir dize yazdırın veya döndürün; burada her sayı orantılı yükseklikte bir ağaç olur. Her ağaç çıktıdaki dört metin sütununu aşağıdaki gibi alır:

  • Pozitif bir tamsayı N, tabanı __|_ve üstü olan ^ ve aralarındaki N katmanları olan bir ağaç olur / \.

    Örneğin, N = 1 olduğunda ağaç

      ^
     / \
    __|_
    

    N = 2 olduğunda ağaç

      ^
     / \
     / \
    __|_
    

    N = 3 olduğunda ağaç

      ^
     / \
     / \
     / \
    __|_
    

    ve bunun gibi.

  • Negatif bir tamsayı N, karşılık gelen pozitif ağaç gibi olur, ancak dikey çubuk, boşluk yerine dal eğik çizgileri arasındadır.

    Örneğin, N = -1 olduğunda ağaç

      ^
     /|\
    __|_
    

    N = -2 olduğunda ağaç

      ^
     /|\
     /|\
    __|_
    

    N = -3 olduğunda ağaç

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

    ve bunun gibi.

  • Tam sayı 0 olduğunda, teknik olarak hiçbir ağaç yoktur, sadece dört alt çizgiden oluşan boş bir alan vardır:

    ____
    

Her ağacın tabanındaki alt çizgiler çıktıda sıralanmalıdır, yani tüm ağaçların tabanları aynı seviyede olmalıdır. Ayrıca, son ağaçtan sonra alt çizgi çizgisinin sonuna tek bir alt çizgi eklenir. Bu, her ağacın her iki tarafında boş bir "hava" sütununa sahip olmasını sağlar.

Bir örnek olarak, çıkış 4 0 -1 -6 2olur

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

Ağaç desenlerinin her zaman önde gelen boş bir sütuna nasıl sahip olduğunu, ancak son ağacın sağ tarafını doldurmak için bir alt çizginin eklenmesi gerektiğini unutmayın.

Ayrıca:

  • Herhangi bir satırdaki sondaki boşluklar iyidir, ancak gereksiz önde gelen boşluklar olmamalıdır.
  • Baştaki satırsonlarına izin verilmez (en uzun ağacın çıktı metni ızgarasının üst kısmına dokunması gerekir) ve yalnızca bir satır sonrasına izin verilir.
  • Liste, -250 ila 250 dahil herhangi bir tam sayı içerebilir. Uzun ağaçların kullanılması gerekli değildir.

Bayt cinsinden en kısa kod kazanır.

Daha fazla örnek

3:

  ^
 / \
 / \
 / \
__|__

-2:

  ^
 /|\
 /|\
__|__

0:

_____

0, 0:

_________

0, 1, 0:

      ^
     / \
______|______

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

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

Yanıtlar:


6

Pyth, 48 bayt

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

Çevrimiçi deneyin: Gösteri veya Test Paketi

Tam bir açıklama için çok tembel. İşte kısa bir bakış:

Önce sütunları oluşturuyorum. Yani görüntü:

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

şu şekilde oluşturulur:

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

Dikkat edin, sadece alt kısmı üretiyorum (boşluklar olmayan her şey). Ve onları aşağıdan yukarıya doğru da üretiyorum. Bu oldukça basit bir şekilde yapılır.

Sonra .ther dizenin eşit uzunlukta olması için dizeleri boşluk eklemek için yöntemi kullanabilirsiniz . Sonra siparişi tersine çevirip yazdırıyorum.


Not: Bu gerçek bir çıktıysa _, son ağaçtan sonra bir iz (alt çizgi) eklemeyi unutmuş olabilirsiniz .
insertusernameburada

1
@insertusernamehere Teşekkürler, izlemeyi tamamen gözden kaçırdı _.
Jakube

7

Python 2, 165 bayt

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

Bu, listeyi girdi olarak kabul eden tam bir programdır. Hala bu korkunç pisliği golf oynuyorum.


4

PHP, 231277 bayt

Bu zorluğun güzel bir çıktısı var.

$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))."_";

Virgülle ayrılmış bir liste okur (boşluklar isteğe bağlıdır) 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))."_";

Düzenlemeler

  • 46 bayt kaydedildi . Atılan dizi başlatma, if/elseüçlü işleçlerle değiştirildi ve birkaç baytı kaydetmek için bazı değişkenleri hareket ettirdi.

2

Yakut, 157 156 153 karakter

->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*''}*$/+?_}

Başlangıçta Array.transposeiyi bir fikir gibi göründüğü için yazılmıştır . Artık değil.

Örnek çalışma:

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]]
              ^     
             /|\    
  ^          /|\    
 / \         /|\    
 / \         /|\  ^ 
 / \      ^  /|\ / \
 / \     /|\ /|\ / \
__|_______|___|___|__

Parçaları ilk haritadan döndürmek yerine ayrı bir diziye toplamak, indirgeme kullanımından kaçınmaya izin vermelidir.
manatwork

0

C #, 318 bayt

Diziyi aktarmayı denedim. Bunun en iyi çözüm olup olmadığından emin değilim.

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;}

Girinti ve netlik için yeni satırlar:

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;
}
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.