Piramit Şemaları


13

Maya piramitleri, genellikle dini amaçlar için kullanılan eski mimarinin önemli bir parçasıydı (ve).

Genellikle basamak piramitleriydi, ancak her birindeki basamaklar tırmanmak için çok dikti. Rahipler, törenler yapmak için alternatif merdivenlerle üstlerine tırmanacaklardı. Piramitler ayrıca yüksekliklerinden dolayı yer işareti olarak kullanıldı ve hatta bazen yüksek rütbeli yetkililer için mezar alanı olarak kullanıldı.


Meydan okuma

Kullanıcı özelliklerine göre bir piramit şeması yazdırabilen bir program yazın (aşağıya bakın).


Gereksinimler

  • İki boşlukla ayrılmış değişken girdisi alın.

  • Giriş STDIN (veya en yakın alternatif) aracılığıyla kabul edilmelidir.

  • Çıktı STDOUT (veya en yakın alternatif) aracılığıyla olmalıdır.


Giriş

  • Herhangi bir pozitif tamsayı olarak yükseklik. Bu, taban seviyesinin genişliği (bloklar halinde) olarak kullanılır. Piramidin birbirini takip eden her seviyede bir genişliğe sahiptir (bloklar) önceki katın genişliğidir.n - 1n

  • 1 veya tek, pozitif tamsayı ≤ (daha küçük) olacak blok boyutu 10.


Bloklar

Verilen blok boyutu her bir parçanın genişliğini (ve yüksekliğini) belirler. Esasen, i^2görünür kutunun içinde iblok boyutunun olduğu boşluklar vardır .

1x1'lik bir blok şöyle görünür:

+++
| |
+++

5x5'lik bir blok şöyle görünür:

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

Yatay Bitişik Bloklar

Bloklar yan-yana Yatay gerekir onların orta duvarları içine birleştirilir.

Sen gerekir bu var:

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

Bunun gibi bir şey yerine:

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

Dikey Bitişik Bloklar (-5% bonus)

Dikey olarak yan yana blokların özel bir istisnası vardır: orta duvar birle birleştirilebilir.

Yani, 1x1 bloklar yerine şöyle görünür:

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

Onlar olabilir şuna benzer:

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

Örnekler

Input: 3 1

Output:

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

OR

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

Input: 2 3

Output:

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

OR

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

sayı tahtası

Skorbordda sıralamak için cevabınızı şu biçimde yerleştirin:

# Language, Score

Veya bonusu -5% alırsanız:

# Language, Score (Bytes - 5%)

Puanınız sadece bir tam sayıdır. Puanınız ondalıksa, tam sayıya yuvarlayın.


Minimum girdi nedir? 1 1?
mınxomaτ

Evet, bu tek bir blok olurdu. @minxomat "Giriş" bölümünde açıklanmıştır.
Zach Gates

Girdi ne 3 2üretecekti?
E-Yiyecek

"Giriş" bölümünün altındaki ikinci madde işaretine göre, ikinci giriş tamsayısının tek olması gerekir. Eğer böyle bir giriş için ne olacağını sormak istedim Eğer El-E-Gıda @ 2 3zaman, çıkarsınız n - 1 = 0nerede nbloklar halinde önceki katın genişliğidir.
Zach Gates

@ZachGates, teşekkürler! Bana aldırma. Açıkçası kahve başarısız oldu.
E-Yiyecek

Yanıtlar:


1

Pyth, 45 (47 bayt -% 5)

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

Burada deneyin .

                                                   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. Geç olsun güç olmasın. : P
Zach Gates

11

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

Şablon dizelerini kullanarak, 2 yeni satır önemlidir ve sayılır.

Aşağıdaki pasajı bir EcmaScript 6 tarayıcısında çalıştırmayı test edin. Firefox tamam, Chrome değil, çünkü tahribatlı atama desteği yok .

Kod pasajdan sonra açıklandı.

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

Daha Az 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)    

9

Yakut, 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]

Yorumlarla

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

Bonusunuzu -5% (puanınızı 124'e getirin) unutmayın. İyi iş!
Zach Gates

2

Python 2, 117 (123 bayt)

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

Fikir tuğla kontör oluşturmaktır polarak +++++++++ve yan volarak | | |. Üst +, n+1 +her katmanın olduğu gibi başlar ve arttırılır . Yan |, nboşluklar ve a ile başlar ve artar |. Her katman, üstleri ve kenarları arttırır, daha sonra bir üst ve nyanları yazdırırız .

Onları ortalamak için önce bir girinti yazdırıyoruz l. Geçerli yükseklikle ölçeklenen bir dizi boşluktan oluşur h. Güncellemek için, yükseklik değişkenini hvurana kadar azaltırız 0, ardından geçerli katman ekranın sol kenarına yaslanır. Alt katmanı yapmak için üst kısmı bir kez daha yazdırıyoruz ve işimiz bitti.


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)

Dize çarpımı kullandım ve fazladan boşluk bıraktım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.