Skema Piramida

13

Piramida Maya (dan) adalah bagian penting dari arsitektur kuno, yang umumnya digunakan untuk tujuan keagamaan.

Mereka biasanya menginjak piramida, tetapi tangga di masing-masing terlalu curam untuk didaki. Para pendeta akan naik ke puncak mereka melalui tangga alternatif untuk melakukan upacara. Piramida juga digunakan sebagai landmark karena tingginya, dan kadang-kadang bahkan digunakan sebagai situs pemakaman bagi pejabat tinggi.


Tantangan

Tulis program yang dapat mencetak skema piramida berdasarkan spesifikasi pengguna (lihat di bawah).


Persyaratan

  • Ambil input dari dua variabel yang dipisahkan ruang.

  • Masukan harus diterima melalui STDIN (atau alternatif terdekat).

  • Output harus melalui STDOUT (atau alternatif terdekat).


Memasukkan

  • Tinggi sebagai bilangan bulat positif. Ini digunakan sebagai lebar level dasar (dalam blok). Setiap level berikutnya dari piramida memiliki lebar di n - 1mana lebar nlantai sebelumnya (dalam blok).

  • Ukuran blok yang akan menjadi 1 atau aneh, bilangan bulat positif ≤ (kurang dari) 10.


Blok

Ukuran blok yang diberikan menentukan lebar (dan tinggi) dari masing-masing bagian. Pada dasarnya, ada i^2ruang di dalam kotak yang terlihat di mana iukuran blok.

Blok 1x1 akan terlihat seperti ini:

+++
| |
+++

Sedangkan blok 5x5 akan terlihat seperti ini:

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

Blok Berdampingan Secara Horizontal

Blok berdampingan secara horizontal harus memiliki dinding tengahnya digabung menjadi satu.

Anda harus memiliki ini:

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

Alih-alih sesuatu seperti ini:

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

Blok Berdekatan Vertikal (-5% bonus)

Blok berdampingan secara vertikal memiliki pengecualian khusus: dinding tengah dapat digabung menjadi satu.

Jadi, bukannya 1x1 blok yang terlihat seperti ini:

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

Mereka bisa terlihat seperti ini:

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

Contohnya

Input: 3 1

Output:

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

OR

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

Input: 2 3

Output:

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

OR

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

Papan angka

Untuk diperingkatkan di papan skor, tulis jawaban Anda dalam format ini:

# Language, Score

Atau jika Anda mendapat bonus -5%:

# Language, Score (Bytes - 5%)

Skor Anda hanya angka keseluruhan. Jika skor Anda adalah desimal, bulatkan ke seluruh angka.

Zach Gates
sumber
Apa input minimum? 1 1?
mınxomaτ
Ya, yang akan menjadi satu blok. @ minxomat Ini dijelaskan di bawah bagian "Input".
Zach Gates
Apa yang akan 3 2dihasilkan input ?
Hand-E-Food
Menurut peluru kedua di bawah bagian "Input", bilangan bulat input kedua harus ganjil. @ Hand-E-Food Jika Anda ingin bertanya seperti apa inputnya 2 3, itu akan keluar ketika di n - 1 = 0mana nlebar lantai sebelumnya dalam balok.
Zach Gates
@ZachGates, terima kasih! Jangan pedulikan aku. Jelas kopi telah mengecewakan saya.
Hand-E-Food

Jawaban:

1

Pyth, 45 (47 byte - 5%)

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

Cobalah di sini .

                                                   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
Sok
sumber
1
+1. Lebih baik terlambat daripada tidak sama sekali. : P
Zach Gates
11

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

Menggunakan string template, 2 baris baru itu penting dan dihitung.

Tes menjalankan cuplikan di bawah ini di browser EcmaScript 6. Firefox ok, bukan Chrome karena tidak memiliki dukungan untuk penataan yang merusak .

Kode dijelaskan setelah cuplikan.

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

Kurang Golf

[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)    
edc65
sumber
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]

Dengan komentar

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
Level River St
sumber
Jangan lupa tentang bonus Anda -5% (membawa skor Anda ke 124). Kerja bagus!
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

Idenya adalah untuk membangun atas batu bata psebagai +++++++++dan sisi vsebagai | | |. Bagian atas dimulai sebagai +dan ditambah oleh n+1 +setiap lapisan. Sisi dimulai sebagai |dan ditambah oleh nspasi dan a |. Setiap lapisan, kami menambah bagian atas dan samping, lalu mencetak satu bagian atas dan nsisi.

Untuk memusatkannya, pertama-tama kita mencetak indentasi l. Ini terdiri dari sejumlah ruang yang bersisik dengan ketinggian saat ini h. Untuk memperbaruinya, kami mengurangi variabel ketinggian hhingga menyentuh 0, setelah itu lapisan saat ini rata terhadap tepi kiri layar. Kami mencetak bagian atas sekali lagi untuk membuat lapisan bawah, dan kami selesai.

Tidak
sumber
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)

Saya menggunakan perkalian string dan membuka spasi ekstra.

Zach Gates
sumber