Schematy piramid

13

Piramidy Majów były (i są) ważną częścią starożytnej architektury, które były na ogół wykorzystywane do celów religijnych.

Były to zazwyczaj piramidy schodkowe, ale stopnie na każdej z nich były zbyt strome, aby się wspinać. Kapłani wspinali się na ich szczyt przez alternatywne schody, aby odprawiać ceremonie. Piramidy były również używane jako punkty orientacyjne ze względu na ich wysokość, a czasem nawet jako miejsca pochówku dla wysokich rangą urzędników.


Wyzwanie

Napisz program, który może wydrukować schemat piramidy na podstawie specyfikacji użytkownika (patrz poniżej).


Wymagania

  • Weź dwie zmienne rozdzielone spacjami.

  • Dane wejściowe muszą zostać zaakceptowane przez STDIN (lub najbliższą alternatywę).

  • Dane wyjściowe muszą być przesyłane przez STDOUT (lub najbliższą alternatywę).


Wejście

  • Wysokość jak każda dodatnia liczba całkowita. Jest to używane jako szerokość poziomu podstawowego (w blokach). Każdy kolejny poziom piramidy ma szerokość, n - 1gdzie njest szerokość poprzedniej podłogi (w blokach).

  • Rozmiar bloku, który będzie wynosił 1 lub dowolna nieparzysta, dodatnia liczba całkowita ≤ (mniejsza niż) 10.


Bloki

Podany rozmiar bloku określa szerokość (i wysokość) każdego pojedynczego elementu. Zasadniczo i^2w widocznym polu znajdują się spacje, w których ijest rozmiar bloku.

Blok 1x1 wyglądałby tak:

+++
| |
+++

Podczas gdy blok 5x5 wyglądałby tak:

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

Bloki przylegające poziomo

Poziomo obok siebie bloki muszą mieć połączone środkowe ściany w jedną.

Państwo musi mieć w ten sposób:

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

Zamiast czegoś takiego:

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

Bloki przylegające pionowo (bonus -5%)

Bloki ustawione pionowo obok siebie mają specjalny wyjątek: środkową ścianę można połączyć w jedną.

Zamiast bloków 1x1 wygląda to tak:

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

Oni mógłby wyglądać następująco:

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

Przykłady

Input: 3 1

Output:

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

OR

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

Input: 2 3

Output:

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

OR

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

Tablica wyników

Aby znaleźć się na liście wyników, umieść odpowiedź w tym formacie:

# Language, Score

Lub jeśli otrzymasz bonus -5%:

# Language, Score (Bytes - 5%)

Twój wynik to tylko liczba całkowita. Jeśli twój wynik jest dziesiętny, zaokrąglij w górę do liczby całkowitej.

Zach Gates
źródło
Jaki jest minimalny wkład? 1 1?
mınxomaτ
Tak, co byłoby pojedynczym blokiem. @minxomat Wyjaśniono to w części „Wejście”.
Zach Gates
Co 3 2wytworzy wkład ?
Hand-E-Food,
Zgodnie z drugim punktem w sekcji „Wejście” druga liczba całkowita wejściowa musi być nieparzysta. @ Hand-E-Food Jeśli oznaczało zapytać, co by się stało, jak do wejścia 2 3, to wyjść, kiedy n - 1 = 0, gdzie njest szerokość poprzedniego piętrze w blokach.
Zach Gates
@ZachGates, dzięki! Nie przejmuj się mną Najwyraźniej kawa mnie zawiodła.
Hand-E-Food,

Odpowiedzi:

1

Pyth, 45 (47 bajtów - 5%)

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

Wypróbuj tutaj .

                                                   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
źródło
1
+1. Lepiej późno niż wcale. : P
Zach Gates
11

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

Za pomocą ciągów szablonów 2 nowe znaki są znaczące i zliczane.

Przetestuj poniższy fragment kodu w przeglądarce EcmaScript 6. Firefox ok, nie Chrome, ponieważ nie obsługuje przypisania do destrukcji .

Kod wyjaśniony po fragmencie.

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

Mniej golfa

[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
źródło
9

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

Z komentarzami

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
źródło
Nie zapomnij o swojej premii -5% (podnosząc swój wynik do 124). Dobra robota!
Zach Gates
2

Python 2, 117 (123 bajty)

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

Chodzi o to, aby zbudować górę cegieł ptak jak +++++++++i bok vjako | | |. Góra zaczyna się od +i jest powiększana o n+1 +każdą warstwę. Strona zaczyna się |i jest powiększona o nspacje i a |. Każdą warstwę powiększamy blaty i boki, a następnie drukujemy jeden blat i nboki.

Aby je wyśrodkować, najpierw drukujemy wcięcie l. Składa się z wielu spacji, które skalują się z bieżącą wysokością h. Aby go zaktualizować, zmniejszamy zmienną wysokości, haż uderzy 0, po czym bieżąca warstwa przylega do lewej krawędzi ekranu. Ponownie drukujemy górę, aby utworzyć dolną warstwę, i gotowe.

xnor
źródło
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)

Użyłem mnożenia ciągów i usunąłem dodatkowe spacje.

Zach Gates
źródło