มองไม่เห็นป่าไม้สำหรับกุญแจ


16

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในรายการว่างของจำนวนเต็มในรูปแบบที่สะดวกใด ๆ ที่เหมาะสมเช่นหรือ4, 0, -1, -6, 2[4 0 -1 -6 2]

พิมพ์หรือส่งคืนสตริงที่แสดงรายการเป็นฟอเรสต์ ASCII ที่แต่ละหมายเลขกลายเป็นต้นไม้ที่มีความสูงตามสัดส่วน ต้นไม้แต่ละต้นใช้ข้อความสี่คอลัมน์ในเอาต์พุตดังนี้:

  • จำนวนเต็มบวก N จะกลายเป็นต้นไม้ที่มีฐานเป็น__|_และบนคือ ^ มีชั้นของ N / \ในระหว่าง

    ตัวอย่างเช่นเมื่อ N = 1 ต้นไม้คือ

      ^
     / \
    __|_
    

    เมื่อ N = 2 ต้นไม้คือ

      ^
     / \
     / \
    __|_
    

    เมื่อ N = 3 ต้นไม้คือ

      ^
     / \
     / \
     / \
    __|_
    

    และอื่น ๆ

  • จำนวนเต็มลบ N กลายเป็นเหมือนต้นไม้ในเชิงบวกที่เกี่ยวข้องยกเว้นแถบแนวตั้งอยู่ระหว่างกิ่งสแลชแทนที่จะเป็นช่องว่าง

    ตัวอย่างเช่นเมื่อ N = -1 ต้นไม้คือ

      ^
     /|\
    __|_
    

    เมื่อ N = -2 ต้นไม้คือ

      ^
     /|\
     /|\
    __|_
    

    เมื่อ N = -3 ต้นไม้จะเป็น

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

    และอื่น ๆ

  • เมื่อจำนวนเต็มเป็น 0 จะไม่มีต้นไม้ในทางเทคนิคเพียงแค่พื้นที่ว่างสี่ขีดล่าง:

    ____
    

ขีดล่างที่ฐานของต้นไม้แต่ละต้นจะต้องเรียงกันในเอาท์พุทนั่นคือต้นไม้ทั้งหมดจะต้องมีฐานในระดับเดียวกัน นอกจากนี้ขีดล่างเดียวจะถูกเพิ่มในตอนท้ายของบรรทัดขีดล่างหลังต้นไม้สุดท้าย สิ่งนี้ทำให้ต้นไม้ทุกต้นมีคอลัมน์ "อากาศ" ว่างเปล่าที่ด้านข้างของต้นไม้

ตัวอย่างเช่นผลลัพธ์สำหรับ4 0 -1 -6 2จะเป็น

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

สังเกตว่าลวดลายต้นไม้มีคอลัมน์นำของพื้นที่ว่างเสมอ แต่จะต้องเพิ่มขีดล่างเพื่อเสริมด้านขวาของต้นไม้สุดท้าย

นอกจากนี้:

  • ช่องว่างต่อท้ายบนบรรทัดใดก็ได้ แต่ไม่ควรมีช่องว่างนำหน้าที่ไม่จำเป็น
  • ไม่อนุญาตให้ขึ้นบรรทัดใหม่นำหน้า (ต้นไม้ที่สูงที่สุดควรแตะที่ด้านบนสุดของตารางข้อความเอาต์พุต) และอนุญาตให้ขึ้นบรรทัดใหม่ได้สูงสุดหนึ่งบรรทัดเท่านั้น
  • รายการอาจมีจำนวนเต็มตั้งแต่ -250 ถึง 250 ไม่จำเป็นต้องใช้ต้นไม้สูง

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่างเพิ่มเติม

3:

  ^
 / \
 / \
 / \
__|__

-2:

  ^
 /|\
 /|\
__|__

0:

_____

0, 0:

_________

0, 1, 0:

      ^
     / \
______|______

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

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

คำตอบ:


6

Pyth, 48 ไบต์

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

ลองออนไลน์: การสาธิตหรือชุดทดสอบ

ขี้เกียจเกินไปสำหรับคำอธิบายแบบเต็ม นี่เป็นเพียงภาพรวมสั้น ๆ :

ฉันสร้างคอลัมน์ก่อน ดังนั้นภาพ:

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

ถูกสร้างเป็น:

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

โปรดสังเกตว่าฉันกำลังสร้างเฉพาะส่วนล่าง (ทุกสิ่งที่ไม่มีช่องว่าง) และฉันยังสร้างพวกเขาจากล่างขึ้นบน นี่ทำตรงไปตรงมา

จากนั้นฉันสามารถใช้.tวิธีต่อท้ายช่องว่างกับสตริงเพื่อให้แต่ละสตริงมีความยาวเท่ากัน หลังจากนั้นฉันกลับคำสั่งซื้อและพิมพ์


ตามหมายเหตุ: หากนี่เป็นเอาท์พุทที่เกิดขึ้นจริงคุณอาจลืมที่จะเพิ่มต่อท้าย_(ขีดล่าง) หลังต้นไม้สุดท้าย
insertusernamehere

1
@insertusernamehere _ขอบคุณสมบูรณ์มองข้ามต่อท้าย
Jakube

7

Python 2, 165 ไบต์

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

นี่เป็นโปรแกรมเต็มรูปแบบที่รับรายการเป็นอินพุต ฉันยังคงเล่นกอล์ฟเป็นระเบียบนี้น่ากลัว


4

PHP, 231 277ไบต์

ความท้าทายนี้มีผลลัพธ์ที่สวยงาม

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

อ่านรายการที่คั่นด้วยเครื่องหมายจุลภาค (ช่องว่างเป็นทางเลือก) จาก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))."_";

การแก้ไข

  • ที่บันทึกไว้ 46 ไบต์ ยกเลิกการกำหนดค่าเริ่มต้นของอาร์เรย์แทนที่if/elseด้วยตัวดำเนินการประกอบไปด้วยและย้ายตัวแปรบางส่วนไปเพื่อบันทึกสองสามไบต์

2

Ruby, 157 156 153 ตัวอักษร

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

เขียนเพียงเพราะเริ่มแรก Array.transposeดูเหมือนความคิดที่ดี ไม่อีกแล้ว.

วิ่งตัวอย่าง:

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

รวบรวมชิ้นส่วนลงในอาร์เรย์แยกต่างหากแทนที่จะส่งกลับจากแผนที่แรกควรอนุญาตให้หลีกเลี่ยงการใช้ลด
จัดการ

0

C #, 318 ไบต์

ฉันพยายามย้ายอาเรย์ ฉันไม่แน่ใจว่านั่นเป็นทางออกที่ดีที่สุดหรือไม่

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

การเยื้องและการขึ้นบรรทัดใหม่เพื่อความชัดเจน:

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.