キーの森が見えない


16

などの任意の合理的な便利なフォーマットで整数の空でないリストを取り込みプログラムまたは機能書く4, 0, -1, -6, 2かを[4 0 -1 -6 2]

リストをASCIIアートフォレストとして表示する文字列を印刷するか、返します。各数値は、高さが比例したツリーになります。各ツリーは、次のように出力で4列のテキストを使用します。

  • 正の整数Nは、ベースが__|_でトップが ^ / \、その間にN層あるツリーになります。

    たとえば、N = 1の場合、ツリーは

      ^
     / \
    __|_
    

    N = 2の場合、ツリーは

      ^
     / \
     / \
    __|_
    

    N = 3の場合、ツリーは

      ^
     / \
     / \
     / \
    __|_
    

    等々。

  • 負の整数Nは、対応する正のツリーのようになりますが、垂直バーがスペースではなくブランチスラッシュの間にある点が異なります。

    たとえば、N = -1の場合、ツリーは

      ^
     /|\
    __|_
    

    N = -2の場合、ツリーは

      ^
     /|\
     /|\
    __|_
    

    N = -3の場合、ツリーは

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

    等々。

  • 整数が0の場合、技術的にはツリーがなく、4つのアンダースコアの空のスペースのみがあります。

    ____
    

各ツリーのベースのアンダースコアは、出力に並んでいる必要があります。つまり、すべてのツリーのベースは同じレベルでなければなりません。また、最後のツリーの後のアンダースコアの行の最後に単一のアンダースコアが追加されます。これにより、すべてのツリーの両側に「空気」の空の列ができます。

一例として、の出力には4 0 -1 -6 2なるであろう

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

ツリーパターンには常に空白の先頭列がありますが、最後のツリーの右側を埋めるためにアンダースコアを追加する必要があることに注意してください。

また:

  • 任意の行の末尾のスペースは問題ありませんが、不必要な先行スペースはありません。
  • 先頭の改行は許可されておらず(最も高いツリーは出力テキストグリッドの上部に接する必要があります)、末尾の改行は1つまでしか許可されません。
  • リストには、-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ありがとう、末尾のを完全に見落としていました_
ジャクベ

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

非ゴルフ

$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

ルビー、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]]
              ^     
             /|\    
  ^          /|\    
 / \         /|\    
 / \         /|\  ^ 
 / \      ^  /|\ / \
 / \     /|\ /|\ / \
__|_______|___|___|__

ピースを最初のマップから返すのではなく、別の配列に収集すると、reduceの使用を回避できるはずです。
マナトワーク

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.