Đề án Kim tự tháp


13

Kim tự tháp của người Maya là (và đang) là một phần quan trọng của kiến ​​trúc cổ đại, thường được sử dụng cho mục đích tôn giáo.

Chúng thường là các kim tự tháp bậc thang, nhưng các bước trên mỗi cái quá dốc để leo lên. Các linh mục sẽ leo lên đỉnh của họ thông qua các cầu thang thay thế để thực hiện các nghi lễ. Các kim tự tháp cũng được sử dụng làm mốc vì chiều cao của chúng, và đôi khi còn được sử dụng làm nơi chôn cất cho các quan chức cấp cao.


Các thách thức

Viết chương trình có thể in sơ đồ kim tự tháp dựa trên thông số kỹ thuật của người dùng (xem bên dưới).


Yêu cầu

  • Lấy một đầu vào của hai biến phân tách không gian.

  • Đầu vào phải được chấp nhận thông qua STDIN (hoặc thay thế gần nhất).

  • Đầu ra phải thông qua STDOUT (hoặc thay thế gần nhất).


Đầu vào

  • Chiều cao như bất kỳ số nguyên dương. Điều này được sử dụng như chiều rộng của cấp cơ sở (tính theo khối). Mỗi cấp độ tiếp theo của kim tự tháp có chiều rộng n - 1nơi nlà chiều rộng đáy trước (trong các khối).

  • Kích thước khối sẽ là 1 hoặc bất kỳ số nguyên dương, lẻ (nhỏ hơn) 10.


Khối

Kích thước khối đã cho xác định chiều rộng (và chiều cao) của từng mảnh riêng lẻ. Về cơ bản, có những i^2khoảng trống bên trong hộp có thể nhìn thấy trong đó ilà kích thước khối.

Một khối 1x1 sẽ trông như thế này:

+++
| |
+++

Trong khi một khối 5x5 sẽ trông như thế này:

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

Các khối liền kề theo chiều ngang

Các khối nằm cạnh nhau phải có các bức tường giữa được hợp nhất thành một.

Bạn phải có điều này:

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

Thay vì một cái gì đó như thế này:

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

Các khối liền kề theo chiều dọc (tiền thưởng -5%)

Các khối cạnh nhau theo chiều dọc có một ngoại lệ đặc biệt: bức tường giữa có thể được hợp nhất thành một.

Vì vậy, thay vì các khối 1x1 trông như thế này:

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

Họ có thể trông như thế này:

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

Ví dụ

Input: 3 1

Output:

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

OR

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

Input: 2 3

Output:

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

OR

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

Bảng điểm

Để được xếp hạng trên bảng điểm, hãy đặt câu trả lời của bạn ở định dạng này:

# Language, Score

Hoặc nếu bạn nhận được tiền thưởng -5%:

# Language, Score (Bytes - 5%)

Điểm của bạn chỉ là một con số. Nếu điểm của bạn là số thập phân, làm tròn đến toàn bộ số.


Đầu vào tối thiểu là gì? 1 1?
mınxomaτ

Vâng, đó sẽ là một khối duy nhất. @minxomat Nó được giải thích trong phần "Đầu vào".
Zach Gates

Đầu vào sẽ 3 2sản xuất cái gì?
Thực phẩm điện tử

Theo dấu đầu dòng thứ hai trong phần "Đầu vào", số nguyên đầu vào thứ hai phải là số lẻ. @ Hand-E-Thực phẩm Nếu bạn có nghĩa là để hỏi chuyện gì sẽ xảy ra cho một đầu vào như 2 3, nó sẽ thoát ra khi n - 1 = 0nơi nlà chiều rộng sàn trước trong khối.
Zach Gates

@ZachGates, cảm ơn! Đừng bận tâm đến tôi. Rõ ràng cà phê đã làm tôi thất bại.
Thực phẩm điện tử

Câu trả lời:


1

Pyth, 45 (47 byte - 5%)

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

Hãy thử nó ở đây .

                                                   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. Muộn còn hơn không. : P
Zach Gates

11

JavaScript (ES6), 161 (169-5%) 166 (174-5%)

Sử dụng chuỗi mẫu, 2 dòng mới là quan trọng và được tính.

Kiểm tra chạy đoạn mã dưới đây trong trình duyệt EcmaScript 6. Firefox ok, không phải Chrome vì nó thiếu hỗ trợ cho việc hủy bỏ nhiệm vụ .

Mã giải thích sau đoạn trích.

/*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>

Ít chơi gôn

[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

Ruby, 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]

Với nhận xét

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

Đừng quên phần thưởng của bạn -5% (nâng điểm số của bạn lên 124). Làm tốt lắm!
Zach Gates

2

Python 2, 117 (123 byte)

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

Ý tưởng là để xây dựng lên đỉnh gạch pnhư +++++++++và bên vnhư | | |. Đỉnh bắt đầu như +và được tăng thêm bởi n+1 +mỗi lớp. Các bên bắt đầu như |và được tăng thêm bởi nkhông gian và a |. Mỗi lớp, chúng tôi gia tăng phần ngọn và mặt, sau đó in một mặt trên và nmặt bên.

Để tập trung vào chúng, đầu tiên chúng ta in một vết lõm l. Nó bao gồm một số không gian tỷ lệ với chiều cao hiện tại h. Để cập nhật nó, chúng tôi giảm biến chiều cao hcho đến khi nó chạm vào 0, sau đó lớp hiện tại được đặt sát vào cạnh trái của màn hình. Chúng tôi in trên cùng một lần nữa để tạo lớp dưới cùng, và chúng tôi đã hoàn thành.


0

Python 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)

Tôi đã sử dụng phép nhân chuỗi và tước thêm khoảng trắng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.