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


13

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

Обычно они были ступенчатыми пирамидами, но ступеньки на каждой ступени были слишком крутыми, чтобы карабкаться. Священники поднимались на их вершины по альтернативным лестницам, чтобы совершать церемонии. Пирамиды также использовались как ориентиры из-за их высоты, а иногда даже использовались как места захоронения для высокопоставленных чиновников.


Соревнование

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


Требования

  • Возьмите ввод двух разделенных пробелами переменных.

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

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


вход

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

  • Размер блока, который будет 1 или любое нечетное, положительное целое число ≤ (меньше) 10.


Блоки

Данный размер блока определяет ширину (и высоту) каждого отдельного куска. По сути, естьi^2 внутри видимого поля есть места, гдеi находится размер блока.

Блок 1x1 будет выглядеть так:

+++
| |
+++

Хотя блок 5х5 будет выглядеть так:

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

Горизонтально смежные блоки

Горизонтально бок о бок блоки должны быть объединены в одну среднюю стенку.

Вы должны иметь это:

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

Вместо чего-то вроде этого:

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

Вертикально смежные блоки (бонус -5%)

Вертикально расположенные бок о бок блоки имеют особое исключение: среднюю стенку можно объединить в одну.

Итак, вместо блоков 1х1, выглядящих так:

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

Они могут выглядеть так:

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

Примеры

Input: 3 1

Output:

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

OR

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

Input: 2 3

Output:

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

OR

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

Табло

Чтобы попасть на табло, поместите свой ответ в следующем формате:

# Language, Score

Или, если вы получаете бонус -5%:

# Language, Score (Bytes - 5%)

Ваша оценка - это всего лишь целое число. Если ваш счет десятичный, округлите до целого числа.


Какой минимальный вклад? 1 1?
Минсхома

Да, который будет одним блоком. @minxomat Это объясняется в разделе «Вход».
Зак Гейтс

Что 3 2произвел бы вклад ?
Hand-E-Food

Согласно второму пункту в разделе «Ввод», второе входное целое число должно быть нечетным. @ Hand-E-Food Если вы имели в виду , чтобы спросить , что случилось бы для входа , как 2 3он будет выходить , когда , n - 1 = 0где nэто ширина предыдущего Floor в блоках.
Зак Гейтс

@ 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
Зак Гейтс

11

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

Используя строки шаблона, 2 новых строки значимы и подсчитаны.

Попробуйте запустить приведенный ниже фрагмент в браузере 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). Хорошая работа!
Зак Гейтс

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

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)

Я использовал умножение строк и убрал лишние пробелы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.