Zrób mi ogrodzenie!

15

Wyzwanie

To proste wyzwanie. Biorąc pod uwagę dwie dodatnie liczby całkowite w i hutwórz ogrodzenie ASCII o szerokości wi wysokości h. Ogrodzenie należy zbudować zgodnie z następującymi zasadami:

  • +Postać będzie reprezentować stanowisko.
  • -Znak będzie wykorzystywany do reprezentowania szerokości ogrodzenia.
  • |Zostaną wykorzystane do reprezentowania wysokość ogrodzenia.
  • Po dokładnie trzy -znaki zostały wyprowadzone, A +charakter muszą być wyprowadzane później. Wyłączając cztery rogi, każde inne wyjście +będzie nieważne. Możesz przestrzegać tej reguły, zaczynając od lewej lub prawej (patrz przykłady), ale musisz być konsekwentny.
  • Po wypisaniu dokładnie dwóch |znaków, +znak musi zostać wypisany później. Wyłączając cztery rogi, każde inne wyjście +będzie nieważne. Możesz przestrzegać tej reguły, zaczynając od góry lub od dołu (patrz przykłady), ale musisz być konsekwentny.
  • Każde ogrodzenie będzie miało dokładnie cztery rogi, a każdy róg będzie oznaczony symbolem +.

Innymi słowy: co trzy -znaki musisz wypisać a +. I na każde dwa |znaki musisz wypisać a +.

Można założyć, że ogrodzenie będzie zawsze być prostokątem, a zarówno wi hnigdy nie będzie większa niż 100lub poniżej 1. Dozwolone jest końcowe i / lub poprzedzające białe znaki.

Przykłady / przypadki testowe

w = 1
h = 1

+-+ 
| |
+-+


w = 3
h = 2

+---+
|   |
|   |
+---+


w = 5
h = 7

+---+--+ or +--+---+
|      |    |      |
|      |    +      +
+      +    |      |
|      |    |      |
|      |    +      +
+      +    |      |
|      |    |      |
|      |    +      +
+      +    |      |
|      |    |      |
+---+--+    +--+---+

w = 10
h = 5

+---+---+---+-+  or +-+---+---+---+
|             |     |             |
|             |     +             +
+             +     |             |
|             |     |             |
|             |     +             +
+             +     |             |
|             |     |             |
+---+---+---+-+     +-+---+---+---+


w = 4
h = 4

+---+-+ or +-+---+
|     |    |     |
|     |    |     |
+     +    +     +
|     |    |     |
|     |    |     |
+---+-+    +-+---+

Zasady

Christian Dean
źródło
powiązane
vroomfondel
3
Czy mam rację, rozumiejąc, że dwoje nie może się +dotykać?
xnor
@ xnor Tak, to prawda.
Christian Dean
3
Nawiasem mówiąc, świetne pierwsze wyzwanie.
xnor
1
@LeakyNun Twoje prawo. To przypadek, o którym nie myślałem przy tworzeniu moich zasad. Dodałem regułę określającą, dlaczego +-+-+-+-+-+jest nieważna. Przepraszam za zamieszanie.
Christian Dean

Odpowiedzi:

9

C, 131 bajtów

#define L for(i=0,j=w;j;)putchar(i++%4?--j,45:43);puts("+")
f(w,h,i,j,c){L;for(j=1;h;printf("%c%*c\n",c,i,c))c=j++%3?--h,124:43;L;}

Wypróbuj online!

Wyjaśnienie:

// The first and the last line are always similar, so let's use a macro
// to avoid code duplication.
#define L

// Let's initialize 'i' and 'j'. 'i' will be used to keep track of which
// character ('+' or '-') we should print, whereas 'j' starts from the
// input width and the loop terminates when 'j' reaches zero.
for(i=0,j=w;j;)

// We post-increment 'i' and take a modulo 4 of its previous value.
// If i%4 == 0, we print '+' (ASCII 43), otherwise we decrement 'j'
// and print '-' (ASCII 45).
putchar(i++%4?--j,45:43);

// After the loop we print one more '+' and newline.
puts("+")

// The function declaration which takes the two input parameters, and
// also declares three integer variables. These three variables could
// also be declared as global variables with the same bytecount.
f(w,h,i,j,c)

// The start of the function body. We use the macro 'L' to print the 
// first line along with a newline.
{L;

// This loop prints all the lines between the first and the last. 'j'
// keeps track of when we should output a '+' instead of a '|'. 'h',
// which is the input parameter for height, serves as a terminator
// for the loop as it reaches zero.
for(j=1;h;<stuff missing from here>)

// We post-increment 'j' and check if its previous value is divisible
// by three, and if it isn't, we decrement 'h' and assign 124 (ASCII
// value for '|') to 'c'. Otherwise we assign '+' (ASCII 43) to 'c'.
c=j++%3?--h,124:43;

// The following is inside the 'increment' part of the 'for' loop.
// We print the character corresponding to the value of 'c', then
// the same character again, but padded with i-1  spaces before it 
// ('i' hasn't been touched since the first loop, so it still stores
// the length of the first line), then a newline.
printf("%c%*c\n",c,i,c)

// Lastly we print the first line again using the same macro 'L'.
L;}
Steadybox
źródło
5

Python 3 , 140 137 128 119 106 105 bajtów

def f(w,h):a=~-w//3-~w;b=("+---"*w)[:a]+'+';print(b,*[i+' '*~-a+i for i in"||+"*h][:h+~-h//2],b,sep='\n')

Wypróbuj online!

GarethPW
źródło
2
Jest już dłużej, ale problem został rozwiązany.
GarethPW
1
Możesz zapisać bajt, usuwając spację między ini [w+1+(w-1)//3]]w ostatniej części.
Christian Dean
1
Witamy w PPCG! Możesz również usunąć to miejsce '\n') for. Możesz także zmienić (w-1)na, ~-wktóry pozwala usunąć nawiasy, ponieważ operatory jednoargumentowe mają wyższy priorytet niż binarne. To samo dotyczy (h-1)-> ~-hi (a-1)-> ~-a. Wypróbuj online - 128 bajtów
musicman523
1
Ponieważ wszystkie wydruki są drukowane, def f(w,h)ma taką samą długość jak lambda w,h, ale pozwala na użycie wielu linii, jeśli to pomaga w dalszym golfie kodu
musicman523
1
a=~-w//3-~w;zapisać 1 bajt
Felipe Nardi Batista
4

Mathematica, 165 bajtów

v=Column;d[w_,y_,m_,n_]:=Table[If[Mod[i,y]==0&&i!=w,m,n],{i,w}];(a="+"<>d[#,3,"-+","-"]<>"+";b=v@d[#2,2,"|\n+","|"];v[{a,Row[{b,""<>Table[" ",#+Floor[#/3]],b}],a}])&
J42161217
źródło
4

Pip , 38 bajtów

37 bajtów kodu, +1 dla -nflagi.

Ph:'-Xa<>3JW'+PsX#h-2WR:'|Xb<>2J'+^xh

Przyjmuje szerokość i wysokość jako argumenty wiersza poleceń. Wypróbuj online!

Wyjaśnienie

                         a,b are cmdline args; s is space; x is empty string (implicit)
Ph:'-Xa<>3JW'+
   '-Xa                  String of hyphens of length a
       <>3               grouped into substrings of (maximum) length 3
          JW'+           Join on +, also wrapping the result in +
 h:                      Assign that string to h (mnemonic: "header")
P                        and print it (with newline)

PsX#h-2WR:'|Xb<>2J'+^xh
          '|Xb           String of pipes of length b
              <>2        grouped into substrings of (maximum) length 2
                 J'+     joined on +
                    ^x   and split on empty string (i.e. converted to list of chars)
 sX#h-2                  String of len(h)-2 spaces
       WR:               Wrap the spaces with the list of chars
                         Note 1: WR operates itemwise on lists, so the result is a list,
                          each item of which consists of the spaces wrapped in an item
                          from the list of chars
                         Note 2: the : compute-and-assign meta-operator is here abused
                          to give WR: lower precedence than J and ^ and avoid parentheses
P                        Print that list, newline-separated (-n flag)
                      h  Autoprint the header a second time as the footer
DLosc
źródło
4

Węgiel drzewny, 47 45 40 bajtów

F⁴«¿﹪ι³FIη↓⁺×+¬﹪κ²|FIθ⁺×+¬﹪κ³-P+¿⁼ι¹J⁰¦⁰

Objaśnienie: Działa, rysując kolejno -s / |s każdej ze stron , wstawiając +s w razie potrzeby, a następnie kończąc na +. Po narysowaniu górnej i prawej strony przeskakuje z powrotem na początek, aby narysować je w odwrotnej kolejności, skutecznie rysując lewą i dolną stronę. Nie wiem, czy symetria rotacyjna jest dozwolona, ​​ale jeśli tak, to dla 27 25 bajtów:

F⁴«FI⎇﹪ι²ηθ⁺×+¬﹪κ⁻³﹪ι²-⟲T

Przekracza powyższy pomysł do końca, rysując górną stronę, obracając w lewo, rysując prawą stronę, obracając ponownie, a następnie powtarzając, aby narysować dolną i lewą stronę w odwrotnej kolejności.

Neil
źródło
1
@LeakyNun Ostatni raz, gdy pokonałem Pytha, podwoiłem trochę diamentów, a nawet wtedy było to tylko krótsze.
Neil
4

JavaScript (ES6), 133 132 bajty

w=>h=>(a="-".repeat(w).replace(/--?-?/g,"+$&")+`+`)+(`
|`.padEnd(a.length)+`|`).repeat(h).replace(/(\|( +)\|\n)\1/g,`$&+$2+
`)+`
`+a

Trwa wejście w składni currying: f(width)(height).

Test Snippet

f=
w=>h=>(a="-".repeat(w).replace(/--?-?/g,"+$&")+`+`)+(`
|`.padEnd(a.length)+`|`).repeat(h).replace(/(\|( +)\|\n)\1/g,`$&+$2+
`)+`
`+a
O.innerHTML=f(W.value=5)(H.value=10)
<div oninput="O.innerHTML=f(+W.value)(+H.value)">
W <input id=W type=number min=1> H <input id=H type=number min=1>
</div>
<pre id=O>

Justin Mariner
źródło
2

Java (OpenJDK 8) , 178 177 bajtów

w->h->{int i=0;String t="",m,r;for(;i<w;)t+=i++%3<1?"+-":"-";r=t+="+\n";m=t.format("|%"+(t.length()-3)+"s|\n","");for(i=0;i<h;)r+=i++%2<1&i>1?m.replace("|","+")+m:m;return r+t;}

Wypróbuj online!

-1 bajt dzięki @KevinCruijssen

Olivier Grégoire
źródło
Możesz zapisać bajt, curry parametrów: w->h-> Wypróbuj tutaj.
Kevin Cruijssen
Tak, ciągle zapominam o curry ... To nie jest coś naturalnego: s
Olivier Grégoire
1

Węgiel drzewny , 47 45 37 bajtów

A…+---÷⁺²×⁴N³αA…+||÷⁺¹×³N²βPα↓βα+↖↑⮌β

Wypróbuj online!

  • 2 bajty zapisane po zagraniu znakami podczas tworzenia łańcucha.
  • 8 bajtów zaoszczędzonych dzięki Neilowi, który wymyślił znacznie prostszy sposób obliczania długości ogrodzeń.

Inne podejście niż @ Neila : najpierw tworzę ciągi znaków αi βzawierają znaki w granicach poziomych i pionowych, używając Rangeoperatora, który tworzy powtórzenie ciągu znaków, aż do osiągnięcia określonej długości. Następnie drukuję je w odpowiedniej kolejności:

  • Wydrukuj α bez przesuwania kursora.
  • Wydrukuj β w dół.
  • Wydrukuj α.
  • Wydrukuj „+”.
  • Przesuń kursor w górę i w lewo.
  • Wydrukuj β w górę, odwrócony.

Link do pełnej wersji .

Charlie
źródło
1
Dzięki za przypomnienie mi Range, że oszczędzam 3 bajty przy drugim podejściu!
Neil
@ Neil, to miłe, bo właśnie cię obezwładniłem i po prostu nie mogę w to uwierzyć. :-)
Charlie
1
Jeszcze lepiej, udało mi się zoptymalizować wyrażeń, oszczędzając 8 bajtów: A…+---÷⁺²×⁴N³αA…+||÷⁺¹×³N²βPα↓βα+↖↑⮌β.
Neil
@Neil Wow. Taka optymalizacja. Bardzo węgiel drzewny.
Charlie
0

05AB1E , 58 bajtów

D3/ó+DU'-×'+.ø©'|DXú«²D2/ó+.D®»'-4×D'+3ǝ.:¶¡ø'|3×D'+2ǝ.:ø»

Wypróbuj online!

W 05AB1E trudniej niż myślałem.

Urna Magicznej Ośmiornicy
źródło