Схеми пірамід


13

Піраміди майя були (і є) важливою частиною античної архітектури, яку зазвичай використовували в релігійних цілях.

Зазвичай вони були сходовими пірамідами, але сходи на кожній були занадто крутими, щоб піднятися. Священики піднімаються до їх вершин через альтернативні сходи для проведення церемоній. Піраміди також використовувались як орієнтири через їх висоту, а іноді навіть використовувались як місця поховань для високопосадовців.


Змагання

Напишіть програму, яка може роздрукувати схему піраміди на основі специфікацій користувача (див. Нижче).


Вимоги

  • Візьміть вхід двох змінних пробілів.

  • Вхід повинен бути прийнятий через STDIN (або найближчу альтернативу).

  • Вихід повинен бути через STDOUT (або найближчу альтернативу).


Вхідні дані

  • Висота як будь-яке додатне ціле число. Він використовується як ширина базового рівня (в блоках). Кожен наступний рівень піраміди має ширину, n - 1де ширина nпопереднього поверху (в блоках).

  • Розмір блоку, який буде дорівнює 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%)

Ваш бал - це лише ціла кількість. Якщо ваш результат десятковий, округлете ціле число.


Який мінімальний вхід? 1 1?
mınxomaτ

Так, який би був єдиний блок. @minxomat Це пояснено у розділі "Введення".
Zach Gates

Що б дало вхід 3 2?
Hand-E-Food

Відповідно до другої кулі в розділі "Введення", друге вхідне ціле число повинно бути непарним. @ Hand-E-Food Якщо ви хотіли запитати, що станеться з таким входом 2 3, він би вийшов, колиn - 1 = 0 , де nце ширина попереднього Floor в блоках.
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

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

Використовуючи рядки шаблону, два нових рядки є значущими і підраховуються.

Випробуйте запуск фрагмента нижче в браузері EcmaScript 6. Firefox добре, а не Chrome, оскільки йому не вистачає підтримки для присвоєння деструктуризації .

Код пояснено після фрагмента.

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

Я використовував множення рядків і позбавляв зайвих пробілів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.