키의 숲을 볼 수 없습니다


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 개인 빈 공간입니다.

    ____
    

각 트리의 밑줄에있는 밑줄은 출력에 정렬되어야합니다. 즉, 모든 트리의베이스가 같은 수준이어야합니다. 또한 마지막 트리 이후에 밑줄 줄 끝에 단일 밑줄이 추가됩니다. 이것은 모든 나무가 양쪽에 "공기"의 빈 기둥을 갖도록합니다.

예를 들어 출력 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메서드를 사용하여 문자열에 공백을 추가하여 각 문자열의 길이가 동일하게 할 수 있습니다. 그리고 나서 순서를 바꾸고 인쇄합니다.


참고 : 실제 출력 인 _경우 마지막 트리 다음에 후행 (밑줄) 을 추가하지 않았을 수 있습니다 .
insertusername 여기

1
@insertusernamehere 감사합니다 _. 후행을 완전히 간과했습니다 .
Jakube

7

파이썬 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 사용을 피할 수 있습니다.
manatwork

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.