ASCII 아트 3D 스트리트 뷰


29

입력:

  1. stdin 또는 prompt를 통해 공급되는 일련의 정수를 얻습니다.
  2. 이 시리즈의 모든 정수 쌍은 건물의 너비 [유효 범위 : 1..10] 및 높이 [유효 범위 : 0..10]를 나타냅니다.
  3. 입력이 올바른 것으로 가정하십시오.

샘플 입력 (두 번째 줄은 데모 목적으로 만 사용) :

12 2112 1 3 1 2 2 1
WHWHWHWHWHWHWHH

해당 샘플 출력 :

                 ______
               / ______ / |
              | | | __
              | | / __ / |
     __ | | | | __
   / __ / | | | | / __ / |  
  | | | __ | | | | | ______
  | | / __ / | | | | | / ______ / |
  | | | | _ | | | | | |
  | _o_ | _o_ | / __ | _o _____ | _o_ | _o_ | _o _____ | /
  -------------------------------------  
 ------------- 
-------------------------------------

규칙 :

건물

  1. 기본 빌딩 블록은 다음과 같습니다 (1W, 1H)
   __
 / __ / | (이 질문에서는 기본 큐브가 빌려 온다 :
| | | http://stackoverflow.com/questions/1609702/code-golf-playing-cubes)
| ___ | /
  1. 우리의 관점은 (ahum) ~ 3D이므로 주변 건물은 다른 건물의 일부를 숨길 수 있습니다. 건물은 왼쪽에서 오른쪽으로 '논리적으로'렌더링됩니다.

  2. 첫 번째 건물 앞에는 두 개의 공백이 있습니다.

  3. WIDTH와 HEIGHT를 기본 큐브의 치수에 적용하여 모든 건물을 렌더링합니다 (제공된 샘플 출력을 살펴보십시오!). 참조 : 왼쪽에서 오른쪽으로 '벽'에 이르는 문자 수 (W> 1 인 건물의 경우) : (W * 5)-(W-1).

  4. 높이가 0보다 큰 건물에는 문이 하나 있습니다 ( o문자로 표시되며 '맨 아래'행의 '왼쪽'벽에서 두 문자에 위치 함).

도로 :

  1. 도로는 '상단', '중간'및 '하단'이라고하는 세 부분으로 구성됩니다.
  2. 'top'부분과 'bottom'부분은 'top'부분 앞에 두 개의 공백이 있다는 사실과는 동일합니다.
  3. 중간 부분 앞에는 공백이 하나 있으며 다음 패턴의 반복으로 구성됩니다.
    '-'
  4. 길이는 결합 된 건물의 총 너비에 의해 결정됩니다. 도로의 가장 오른쪽 부분은 '마지막'건물의 '오른쪽'벽의 위치와 일치합니다.

수상자 :

이것은 코드 골프입니다! 우승자는 가장 짧은 솔루션 (소스 코드 수 기준)을 가진 유자격 참가자입니다. 소스는 인쇄 가능한 ASCII 문자로만 구성되어야합니다. 즐기세요!

(무작위) 창문, 자동차 또는 보행자에 대한 가상 보너스 포인트.

사양이 명확하지 않은 경우 언제든지 의견을 말하십시오!


@user unknown : 실제로 규칙에 작은 오타가있었습니다. 지금 고쳐야합니다, 감사합니다!
ChristopheD

후행 공백이 허용됩니까? 당신은 예제에 일부가있는 것 같아서 그렇게 가정합니다.
피터 테일러

@ 피터 테일러 : 후행 공백이 허용됩니다.
ChristopheD

도로 부분 3, '-  '두 공간이 있어야 합니까? 편집 : 아, 두 공백은 표시되지 않습니다 : P. ASCII 255 (비 공백 공백, 숫자 키패드의 ALT + 255)를 사용하거나 여기 내 주석에서 복사하여 붙여 넣어 여러 공백을 표시 할 수 있습니다. 오어 ... 당신은 단지 그것의 반복의 말을 대신 할 수 ' - ':)
mellamokb

높이 유효 범위가 실제로는 [ 0 ..10] 인 것 같습니다. 또한 but you must not enforce this3)에서 무엇을 의미 합니까? IMO, 점수가 올라가면 모든 가정을 악용 할 수 있습니다. 따라서 문자 수를 줄이면 총 너비가 80보다 작은 경우 에만 작동하는 코드를 작성할 수 있습니다. 예를 들어, 너비가 80 인 디스플레이 버퍼 배열에 출력을 쓰면 더 높은 총 너비에서 충돌이 발생합니다. 너비를 지원하려면 가정을하지 마십시오. 두 가지를 모두 가질 수는 없습니다. P
mellamokb

답변:


10

하스켈, 396 자

w&h=take h((3," /|"++(w-3)#'_'++"o_|"):c[(3,"| |"++(w-1)#s++"|")])++[(2,"|/ "++(w-2)#'_'++"/"),(0,"  "++(w-2)#'_')]++c[(0,w#s)]
p(w,h)=r.z take[sum w+k|k<-[1..]]$([c"-",s:c"-  ","  "++c"-"]++).map r.foldl(z(%))((2+maximum h)#(5#s))$z(&)w h
main=interact$unlines.p.q.map read.words;y%(d,x)=x++drop d y;q(x:y:z)=(4*x:a,2*y:b)where(a,b)=q z
q x=(x,x);(#)=replicate;c=cycle;r=reverse;z=zipWith;s=' '

출력 예 :

$ runghc Streetview.hs <<< "1 1 1 3 1 2 1 0 2 4 2 2 1 3 3 1"
                     ______                          
                   /______ /|                        
         __       |       | |        __              
       /__ /|     |       | |      /__ /|            
      |   | |__   |       | |_____|   | |            
      |   |/__ /| |       |/______|   | |            
     _|   |   | | |       |       |   | |__________  
   /__|   |   | | |       |       |   |/__________ /|
  |   |   |   | |_|       |       |   |           | |
  |_o_|_o_|_o_|/__|_o_____|_o_____|_o_|_o_________|/
  -------------------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------------------

5
+1 codegolf.se에 최근에 제출 한 하스켈 제출물이 하스켈에 대해 조금 더 배우는 것에 대한 관심을 불러 일으켰습니다. 해결책이 될 수는 있지만 여전히 '판독 가능'한 상태로 남아 있습니다.
ChristopheD

8

파이썬, 415 자

I=eval(raw_input().replace(' ',','))
X=I[::2]
Y=I[1::2]
W=4*sum(X)+6
H=2*max(Y)+2
A=W*H*[' ']
p=W*H-W+2
for w,h in zip(X,Y):i=2*h;j=4*w;q=p-i*W;r=p+j;s=q+j;A[p+1:q+1:-W]=A[p+2:q+2:-W]=i*' ';A[p:q:-W]=A[r:s:-W]=A[r+2-W:s+2-W:-W]=i*'|';A[p+1:r]='_'*(j-1);A[q+2:s]=A[q+3-W:s+1-W]='_'*(j-2);A[q+1]=A[s+1]=A[r+1]='/';A[p+2]='_o'[h>0]; p+=j
A[W-1::W]='\n'*H
D=(W-5)*'-'
print''.join(A)+'  '+D+'\n'+(' - '*W)[:W-4]+'\n'+D

슬라이스를 사용하여 건물의 모든 부분을 그립니다.

$ echo "1 2 1 1 1 0 2 4 1 3 1 5 2 1" | ./streetview.py 
                             __          
                           /__ /|        
                 ______   |   | |        
               /______ /| |   | |        
              |       | |_|   | |        
              |       |/__|   | |        
     __       |       |   |   | |        
   /__ /|     |       |   |   | |        
  |   | |__   |       |   |   | |______  
  |   |/__ /| |       |   |   |/______ /|
  |   |   | |_|       |   |   |       | |
  |_o_|_o_|/__|_o_____|_o_|_o_|_o_____|/ 
  -------------------------------------
 -  -  -  -  -  -  -  -  -  -  -  -  -
-------------------------------------

+1 매우 좋습니다. 해결책은 이미 골프처럼 보인다 ;-)
ChristopheD

2
`p + = j` (@ 긴 줄의 끝)에 공간이 하나 손실되었습니다. 그 중 하나를 세면 확실치 않습니다 ;-)
ChristopheD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.