피라미드 구성표


13

마야 피라미드는 고대 건축의 중요한 부분이었으며 일반적으로 종교적 목적으로 사용되었습니다.

그들은 보통 계단 피라미드 였지만 각각의 계단은 너무 가파르게 올라갔습니다. 사제는 의식을 수행하기 위해 대체 계단을 통해 꼭대기로 올라갈 것입니다. 피라미드는 높이 때문에 랜드 마크로 사용되기도했으며 때로는 고위 관리들을위한 매장지로 사용되기도했습니다.


도전

사용자 사양에 따라 피라미드 회로도를 인쇄 할 수있는 프로그램을 작성하십시오 (아래 참조).


요구 사항

  • 공백으로 구분 된 두 변수를 입력하십시오.

  • STDIN (또는 가장 가까운 대안)을 통해 입력을 승인해야합니다.

  • 출력은 STDOUT (또는 가장 가까운 대안)을 통해 이루어져야합니다.


입력

  • 양의 정수로서의 높이입니다. 이것은 기본 레벨의 너비로 사용됩니다 (블록 단위). 피라미드의 각 성공 수준은 폭이 (블록) 이전 바닥의 폭을.n - 1n

  • 1 또는 임의의 홀수, 양의 정수 ≤ (10 미만) 인 블록 크기.


블록

주어진 블록 크기는 각 개별 조각의 너비와 높이를 결정합니다. 기본적으로 i^2표시 상자 안에는 i블록 크기가있는 공간이 있습니다 .

1x1 블록은 다음과 같습니다.

+++
| |
+++

5x5 블록은 다음과 같습니다.

+++++++
|     |
|     |
|     |
|     |
|     |
+++++++

가로로 인접한 블록

가로로 나란히 놓인 블록 가운데 벽이 하나로 통합 되어야합니다 .

당신은 있어야 이 있습니다 :

+++++
| | |
+++++

이와 같은 대신 :

++++++
| || |
++++++

수직 인접 블록 (-5 % 보너스)

세로로 나란히 놓인 블록에는 특별한 예외가 있습니다. 가운데 벽을 하나로 합칠 수 있습니다.

따라서 1x1 블록 대신 다음과 같이 보입니다.

 +++
 | |
 +++
+++++
| | |
+++++

그들은 다음과 같이 보일 수 있습니다 .

 +++
 | |
+++++
| | |
+++++

Input: 3 1

Output:

  +++
  | |
  +++
 +++++
 | | |
 +++++
+++++++
| | | |
+++++++

OR

  +++
  | |
 +++++
 | | |
+++++++
| | | |
+++++++

Input: 2 3

Output:

  +++++
  |   |
  |   |
  |   |
  +++++
+++++++++
|   |   |
|   |   |
|   |   |
+++++++++

OR

  +++++
  |   |
  |   |
  |   |
+++++++++
|   |   |
|   |   |
|   |   |
+++++++++

스코어 보드

점수 판에 순위를 매기려면 다음 형식으로 답하십시오.

# Language, Score

또는 보너스 -5 %를 얻는 경우 :

# Language, Score (Bytes - 5%)

당신의 점수는 정수입니다. 점수가 10 진수이면 정수로 반올림합니다.


최소 입력은 얼마입니까? 1 1?
mınxomaτ

예, 단일 블록입니다. @minxomat "입력"섹션에서 설명합니다.
Zach Gates

입력은 무엇을 3 2생산할까요?
Hand-E-Food

"입력"섹션의 두 번째 글 머리표에 따르면 두 번째 입력 정수는 홀수 여야합니다. @ Hand-E-Food와 같은 입력에 어떤 일이 발생하는지 물어 보려면 이전 층의 너비가 블록 단위 인 위치에서 2 3종료됩니다 . n - 1 = 0n
Zach Gates

@ZachGates, 감사합니다! 신경 쓰지 마 분명히 커피가 실패했습니다.
Hand-E-Food

답변:


1

Pyth, 45 (47 바이트-5 %)

AmvdczdVGjm.[Jh*GhHj*H?d\ \+*+2N?d\|\+\ hH;*J\+

여기서 사용해보십시오 .

                                                   Implicit: z=input(), d=' '
    czd                                            Split input on spaces
 mvd                                               Evaluate each part of the above (convert to int)
A                                                  Store the pair in G,H
             Jh*GhH                                J = 1+(G*(H+1))
       VG                                          For N in [0 to G-1]:
          m                             hH;          Map d in [0 to H] to:
                                ?d\|\+                 Get '|' or '+' (vertical edges or corners)
                            *+2N                       Repeat the above (N+2) times
                      ?d\ \+                           Get ' ' or '+' (block centre or horizontal edge)
                    *H                                 Repeat the above H times
                   j                                   Join (|/+) by (   /+++)
           .[J                        \                Centrally pad the above to width J using spaces
         j                                           Join on newlines, implicit print
                                           *J\+    Get J '+'s, implicit print

1
+1. 안하는 것보다 늦게하는 것이 낫다. : P
Zach Gates

11

자바 스크립트 (ES6), 161 (169-5 %) 166 (174-5 %)

템플릿 문자열을 사용하면 두 줄 바꿈이 중요하고 계산됩니다.

EcmaScript 6 브라우저에서 아래 스 니펫을 테스트하십시오. 할당 제거에 대한 지원이 부족하기 때문에 Chrome이 아닌 Firefox에 적합 합니다 .

스 니펫 다음에 코드가 설명되었습니다.

/*Test: redefine console.log*/ console.log=x=>O.innerHTML+=x+'\n';

for([h,b]=prompt().split` `,g='+'[R='repeat'](-~b),f=' '[R](b),n=o='';h--;o+=e+(d=g[R](++n)+`+
`)+f.replace(/./g,e+('|'+f)[R](n)+`|
`))e=' '[R](h*-~b/2);console.log(o+d)
<pre id=O></pre>

덜 골프

[h, b] = prompt().split` `; // get the space separated input values
c = -~b; // Add 1 to b. As b is of string type b+1 would be a string concatenation
g = '+'.repeat(c); // top border
f = ' '.repeat(b); // inner blank row
o = ''; // initialize output string
for(n = 0; h > 0; --h) // loop on height
{
   ++n;
   e = ' '.repeat(h*c/2); // blanks for offset from left margins
   d = g.repeat(n) + `+\n`; // top border repeated, then right end and newline
   // the block body is squared, there are as many rows as columns inside
   // so I can build the right number of rows replacing the chars in a single row
   o += e + d + f.replace(/./g, e + ('|'+f).repeat(n)+`|\n`)
}
o += d // add last top border as bottom
console.log(o)    

9

루비, 124 (130-5 %)

n=(g=gets).to_i
b=g[-2].to_i+1
a=(0..n*b-1).map{|i|[?+*(i/b*b+b+1),(?|+' '*(b-1))*(i/b+1)+?|][i%b<=>0].center(n*b+1)}
puts a,a[-b]

의견

n=(g=gets).to_i                                  #get input and interpret as a number for pyramid height (everything after the space is ignored)
b=g[-2].to_i+1                                   #the single-character block size is the second last character (just before the newline.) Add 1 to give the pitch between squares.
a=(0..n*b-1).map{|i|                             #run through all lines except the last one
[?+*(i/b*b+b+1),                                 #calculate number of + symbols
(?|+' '*(b-1))*(i/b+1)+?|]                       #or alternatively, pattern '|    |'
     [i%b<=>0]                                   #check if i%b is zero or positive to decide which to print
     .center(n*b+1)}                             #centre the text. It will be mapped to the array a.
puts a,a[-b]                                     #a contains the pyramid, minus its last line. Print it, and add the last line

보너스 -5 % (점수 124 점)를 잊지 마십시오. 잘 했어!
Zach Gates

2

Python 2, 117 (123 바이트)

h,n=map(int,raw_input().split())
p,v='+|'
while h:p+='+'*-~n;v+=' '*n+'|';h-=1;l=~n/-2*h*' ';print l+p+('\n'+l+v)*n
print p

아이디어는 벽돌 '위에 구축하는 p등의 +++++++++측면을 v| | |. 상단은로 시작하여 의 각 레이어에 +의해 보강됩니다 n+1 +. 측면은로 시작 |하고 n공백과 a로 확장됩니다 |. 각 레이어마다 상단과 측면을 보강 한 다음 상단과 측면을 인쇄 n합니다.

그것들을 가운데에 맞추기 위해 먼저 들여 쓰기를 인쇄합니다 l. 현재 높이로 확장되는 여러 공간으로 구성됩니다 h. 이를 업데이트하기 위해 높이 변수가에 도달 h할 때까지 감소한 0후 현재 레이어가 화면의 왼쪽 가장자리에 플러시됩니다. 맨 아래 레이어를 만들기 위해 맨 위를 한 번 더 인쇄하면 완료됩니다.


0

파이썬 2, 200 (210-5 %)

a,b=map(int,raw_input().split());c=0;a+=1;i=a*b+a-b;e=[i*'+']
while a-1:
 v=(('|'+' '*b)*a).rstrip();p=' '*((i-len(v))/2);a-=1;c+=1
 for u in range(b):e.insert(0,p+v)
 e.insert(0,p+'+'*len(v))
print'\n'.join(e)

문자열 곱셈을 사용하고 여분의 공백을 제거했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.