金字塔计划


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在“输入”部分中进行了说明。
扎克·盖茨

输入会3 2产生什么?
Hand-E-Food

根据“输入”部分下的第二个项目符号,第二个输入整数必须为奇数。@ Hand-E-Food如果您想询问类似的输入会发生什么,当前一层的宽度在哪里(以块为单位)2 3时,它将退出。n - 1 = 0n
扎克·盖茨

@ZachGates,谢谢!别管我 显然,咖啡使我失望了。
Hand-E-Food

Answers:


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

使用模板字符串,两条换行符很重要并已计数。

测试在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空格和扩展|。每一层,我们增加顶部和侧面,然后打印一个顶部和n侧面。

为了使它们居中,我们首先打印一个缩进l。它由许多与当前高度成比例的空间组成h。要对其进行更新,我们递减height变量,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)

我使用了字符串乘法并去除了多余的空格。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.