ASCII 아트로 간단한 방 만들기


15

방은 연결된 직사각형, 예를 들어 L 자형 방으로 구성 될 수 있습니다. 이러한 공간은 각 사각형의 크기를 설명하는 차원 목록으로 설명 할 수 있습니다.

두 개의 입력 목록이 있다고 가정하십시오. 첫 번째는 서로 수직으로 쌓인 직사각형의 너비를 포함합니다. 두 번째는 사각형의 높이를 포함합니다.

예를 들어, 입력 [4 6][3 2]은 6x2 사각형 위에 4x3 사각형이됩니다. 아래 그림은이 모양을 보여줍니다. 벽은 "얇은"것으로 간주되므로 입력에 의해 결정되는 벽 사이의 공간입니다.

[4 6][3 2]
 ____
|    |
|    |
|    |_
|      |
|______|

해결 방법은 다음과 같습니다. 치수 목록을 입력으로 취하고 회의실 모양을 ASCII 아트로 출력합니다. 형식은 샘플 그림과 같아야합니다.

  • 모든 수평 벽은 밑줄로 표시됩니다
  • 모든 수직 벽은 막대를 사용하여 표시됩니다
  • 직사각형이 연결된 벽은 없어야한다
  • 왼쪽 벽은 똑바로
  • 자세한 내용은 테스트 사례를 살펴보십시오.

가정 할 수있는 가정 :

  • 모든 치수는 [1 ... 20]
    • 모든 수평 치수는 짝수입니다
  • 사각형의 개수는 [1 ... 10]
  • 유효한 입력 만 제공됩니다
  • 선택적인 입력 형식 (입력 차원의 순서를 결정할 수 있습니다. 답을 지정하십시오).

테스트 사례 :

[2][1]
 __
|__|

---

[4][2]
 ____
|    |
|____|

---

[2 6 2 4][2 2 1 3]
 __
|  |
|  |___
|      |
|   ___|
|  |_
|    |
|    |
|____|

---

[2 14 6 8 4 18 2 10 4 2][1 2 3 1 2 1 1 1 2 1]
 __
|  |___________
|              |
|       _______|
|      |
|      |
|      |_
|     ___|
|    |
|    |_____________
|   _______________|
|  |______
|     ____|
|    |
|   _|
|__|

입력 차원의 순서를 결정할 수 있습니다. 행과 열을 바꾸고 뒤집을 수 있습니까? 다음과 같이 : 입력 형식 예 : [2 14 6 8 4 18 2 10 4 2][1 2 3 1 2 1 1 1 2 1]-> (스왑 및 역방향)-> 내 입력 형식 :[1 2 1 1 1 2 1 3 2 1][2 4 10 2 18 4 8 6 14 2]
daavko

예, 괜찮습니다. :-)
Stewie Griffin

감사. 아마 그것들을 뒤집을 필요가 없으며 스왑 만하면됩니다.
daavko

답변:


1

망막 169 150 113 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

\ d +
$ *
{+ r`1 (1 * ¶ [^ |] * (1+))
$ 1¶ | $ 2 |
}`(¶. *) 1+
$ 1
1
_
(\ | _ +) \ | (? = ¶ \ 1 _ (_ +))
$ 1 | $ 2
T`w``(\ | _ +) _? (? = _ * \ |. * ¶ \ 1)
^ ¶
 

코드는 후행 줄 바꿈에 후행 공백을 포함합니다.

입력 형식 :

높이 (공백으로 구분)
너비 (공백으로 구분)

예를 들면 다음과 같습니다.

12 34 1 1 2 1
2 14 6 8 4 18 2 10 4 2

온라인으로 사용해보십시오!


4

자바 스크립트 (ES6) 174

유일하게 중요한 부분은 너비가 다른 두 부분을 연결하는 가로 행이며 가운데 막대 또는 오른쪽 끝에 세로 막대가 있습니다.

(p,h,q=-1,R=(n,s=' ')=>s.repeat(n))=>[...p,0].map((x,i)=>(x>q?p=x:(p=q,q=x),(~q?`
|`+R(q+(x<p)-!x)+R(x>q,'|'):' ')+R(p+~q+!x,'_')+R(x<p,'|')+R(h[i]-1,`
|${R(q=x)}|`))).join``

테스트

f=(p,h,q=-1,R=(n,s=' ')=>s.repeat(n))=>[...p,0].map((x,i)=>(x>q?p=x:(p=q,q=x),(~q?`
|`+R(q+(x<p)-!x)+R(x>q,'|'):' ')+R(p+~q+!x,'_')+R(x<p,'|')+R(h[i]-1,`
|${R(q=x)}|`))).join``

// Less golfed

F=(p,h, q=-1, 
   R=(n,s=' ')=>s.repeat(n)
  )=>
  [...p, 0].map((x,i)=> (
    x>q? p=x : (p=q,q=x),
    (q>=0?`\n|`+R(q+(x<p)-!x)+R(x>q,'|'):' ')
    + R(p+~q+!x,'_') + R(x<p,'|')
    + R(h[i]-1,`\n|${R(q=x)}|`)
  )).join``

console.log=x=>O.textContent+=x+'\n'

;[  
  [[2],[1]],
  [[4],[2]],
  [[2, 6, 2, 4],[2, 2, 1, 3]],
  [[2, 14, 6, 8, 4, 18, 2, 10, 4, 2],[1, 2, 3, 1, 2, 1, 1, 1, 2, 1]]
].forEach(t=>{
  var w=t[0],h=t[1]
  console.log('['+w+'] ['+h+']\n'+f(w,h)+'\n')
})
<pre id=O></pre>


4

파이썬 3 230 223 222 217 바이트

def f(a):b=a[0]+[0];m=' _';print('\n'.join([' '+'_'*b[0]+' ']+['|'+' '*min(b[l],b[l+1])+m[b[l+1]<1]*(b[l]>b[l+1])+m[k]*(b[l]-b[l+1]-1)+'|'+m[k]*(b[l+1]-b[l]-1)for l,i in enumerate(zip(*a))for k in[0]*(i[1]-1)+[1]]))

도움을 주신 @StewieGriffin @KevinLau에게 감사합니다

결과

>>> f([[2, 14, 6, 8, 4, 18, 2, 10, 4, 2],[1, 2, 3, 1, 2, 1, 1, 1, 2, 1]])
 __ 
|  |___________
|              |
|       _______|
|      | 
|      | 
|      |_
|     ___|
|    |             
|    |_____________
|   _______________|
|  |_______
|     _____|
|    |
|   _|
|__|

세미콜론! 그들은 당신의 과제를 분리하고 원치 않는 들여 쓰기에서 당신을 저장합니다! ( a=1;b=2)
CalculatorFeline

"solutoin"> 솔루션
Matt

문자열 인덱싱! m=' _'대신 m=[' ','_']5 바이트 를 절약합니다.
Value Ink

3

루비 191

처음으로 골프를 타는 것도 루비와 함께한 첫날이기 때문에 아마도 세계에서 가장 우아한 것은 아닐 것입니다.

def f(x)
a=x[0]+[0]
puts" #{'_'*a[0]} "
for i in 0..x[1].length-1
n,m=a[i,2].sort
puts"|#{' '*a[i]}|\n"*(x[1][i]-1)+'|'+' '*n+(a[i+1]<1?'_':m>a[i]?'|':' ')+'_'*(m-n-1)+(n<a[i]?'|':'')
end
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.