Pyramid Schemes


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-อาหารถ้าคุณหมายถึงการขอให้สิ่งที่จะเกิดขึ้นสำหรับการป้อนข้อมูลเหมือน2 3มันจะออกเมื่อn - 1 = 0ที่nเป็นความกว้างของชั้นก่อนหน้านี้ในบล็อก
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%)

การใช้สตริงเท็มเพลตบรรทัดใหม่ 2 รายการมีความสำคัญและถูกนับ

ทดสอบการเรียกใช้ตัวอย่างข้อมูลด้านล่างในเบราว์เซอร์ EcmaScript 6 Firefox ok ไม่ Chrome เพราะขาดการสนับสนุนสำหรับdestructuring ที่ได้รับมอบหมาย

รหัสอธิบายหลังจากตัวอย่างข้อมูล

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

หัก Golfed

[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 |แต่ละชั้นเราเพิ่มท็อปส์ซูและด้านข้างจากนั้นพิมพ์หนึ่งด้านบนและ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)

ฉันใช้การคูณสตริงและการเว้นวรรคพิเศษ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.