Tidak dapat melihat hutan untuk kunci


16

Tulis program atau fungsi yang menggunakan daftar bilangan bulat kosong dalam format apa pun yang masuk akal seperti 4, 0, -1, -6, 2atau [4 0 -1 -6 2].

Cetak atau kembalikan string yang menggambarkan daftar sebagai hutan seni ASCII di mana setiap angka menjadi pohon dengan tinggi proporsional. Setiap pohon membutuhkan empat kolom teks dalam output sebagai berikut:

  • Bilangan bulat positif N menjadi pohon dengan alas __|_dan puncaknya ^ , dengan lapisan N / \di antaranya.

    Misalnya, ketika N = 1 pohonnya

      ^
     / \
    __|_
    

    ketika N = 2 pohonnya adalah

      ^
     / \
     / \
    __|_
    

    ketika N = 3 pohonnya

      ^
     / \
     / \
     / \
    __|_
    

    dan seterusnya.

  • Bilangan bulat negatif N menjadi seperti pohon positif yang sesuai kecuali bilah vertikal berada di antara garis miring cabang bukannya spasi.

    Misalnya, ketika N = -1 pohonnya

      ^
     /|\
    __|_
    

    ketika N = -2 pohonnya adalah

      ^
     /|\
     /|\
    __|_
    

    ketika N = -3 pohonnya adalah

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

    dan seterusnya.

  • Ketika bilangan bulat adalah 0 secara teknis tidak ada pohon, hanya ruang kosong empat garis bawah:

    ____
    

Garis bawah pada dasar setiap pohon harus berbaris dalam output, yaitu semua pohon harus memiliki basis pada tingkat yang sama. Juga, satu garis bawah ditambahkan ke akhir garis garis bawah setelah pohon terakhir. Ini membuatnya begitu setiap pohon memiliki kolom kosong "udara" di kedua sisi itu.

Sebagai contoh, hasilnya 4 0 -1 -6 2adalah

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

Perhatikan bagaimana pola pohon selalu memiliki kolom ruang kosong terdepan tetapi garis bawah harus ditambahkan untuk menempel di sisi kanan pohon terakhir.

Juga:

  • Ruang tambahan pada garis apa pun baik-baik saja, tetapi seharusnya tidak ada ruang utama yang tidak perlu.
  • Baris baru terkemuka tidak diizinkan (pohon tertinggi harus menyentuh bagian atas kotak teks keluaran) dan hanya hingga satu baris tambahan yang dibolehkan.
  • Daftar ini dapat berisi bilangan bulat mulai dari -250 hingga 250 inklusif. Menangani pohon yang lebih tinggi tidak diperlukan.

Kode terpendek dalam byte menang.

Lebih banyak contoh

3:

  ^
 / \
 / \
 / \
__|__

-2:

  ^
 /|\
 /|\
__|__

0:

_____

0, 0:

_________

0, 1, 0:

      ^
     / \
______|______

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

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

Jawaban:


6

Pyth, 48 byte

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

Cobalah online: Demonstrasi atau Test Suite

Terlalu malas untuk penjelasan lengkap. Ikhtisar singkat di sini:

Saya menghasilkan kolom pertama. Jadi gambar:

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

dihasilkan sebagai:

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

Perhatikan, bahwa saya hanya menghasilkan bagian bawah (semuanya tanpa spasi). Dan saya juga menghasilkan mereka dari bawah ke atas. Ini dilakukan dengan sangat mudah.

Lalu saya bisa menggunakan .tmetode untuk menambahkan spasi ke string, sehingga setiap string memiliki panjang yang sama. Dan setelah itu saya membalik urutan dan mencetak.


Sebagai catatan: Jika ini adalah output aktual, Anda mungkin lupa menambahkan trailing _(garis bawah) setelah pohon terakhir.
insertusernamehere

1
@insertusernamehere Terima kasih, benar-benar mengabaikan jejaknya _.
Jakube

7

Python 2, 165 byte

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

Ini adalah program lengkap yang menerima daftar sebagai masukan. Saya masih bermain golf kekacauan mengerikan ini.


4

PHP, 231 277 byte

Tantangan ini memiliki hasil yang indah.

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

Membaca daftar yang dipisahkan koma (spasi putih opsional) dari STDIN:

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

Tidak disatukan

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

Suntingan

  • Disimpan 46 byte . Inisialisasi array yang dibuang, diganti if/elsedengan operator ternary dan memindahkan beberapa variabel sekitar untuk menghemat beberapa byte.

2

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

Ditulis hanya karena awalnya Array.transposeterlihat seperti ide yang bagus. Tidak lagi.

Contoh dijalankan:

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

Mengumpulkan potongan-potongan ke dalam array yang terpisah alih-alih mengembalikannya dari peta pertama harus memungkinkan untuk menghindari penggunaan pengurangan.
manatwork

0

C #, 318 byte

Saya mencoba transposing array. Saya tidak yakin apakah itu solusi terbaik.

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

Lekukan dan baris baru untuk kejelasan:

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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.