Buatkan saya pagar!

15

Tantangan

Ini adalah tantangan sederhana. Diberi dua bilangan bulat positif w dan hbuat pagar ASCII dengan lebar wdan tinggi h. Pagar harus dibangun menggunakan aturan berikut:

  • The +karakter akan mewakili posting.
  • The -karakter akan digunakan untuk mewakili lebar pagar.
  • Ini |akan digunakan untuk mewakili ketinggian pagar.
  • Setelah tepat tiga -karakter dikeluarkan, satu +karakter harus dikeluarkan sesudahnya. Tidak termasuk keempat sudut, waktu lain Anda menghasilkan a +tidak valid. Anda diizinkan mengikuti aturan ini mulai dari kiri atau kanan (lihat contoh), tetapi Anda harus konsisten.
  • Setelah tepat dua |karakter telah dikeluarkan, satu +karakter harus dikeluarkan sesudahnya. Tidak termasuk keempat sudut, waktu lain Anda menghasilkan a +tidak valid. Anda diperbolehkan mengikuti aturan ini mulai dari atas atau bawah (lihat contoh), tetapi Anda harus konsisten.
  • Setiap pagar akan memiliki tepat empat sudut, dan setiap sudut akan diwakili dengan a +.

Dengan kata lain: Di setiap tiga -karakter, Anda harus menampilkan a +. Dan pada setiap dua |karakter, Anda harus menampilkan a +.

Anda dapat mengasumsikan bahwa pagar akan selalu menjadi persegi panjang, dan bahwa keduanya wdan htidak akan pernah lebih besar 100atau kurang dari itu 1. Trailing dan / atau spasi putih sebelumnya diizinkan.

Contoh / Kasus Uji

w = 1
h = 1

+-+ 
| |
+-+


w = 3
h = 2

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


w = 5
h = 7

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

w = 10
h = 5

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


w = 4
h = 4

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

Aturan

Christian Dean
sumber
terkait
vroomfondel
3
Apakah saya benar untuk mengerti bahwa mungkin tidak ada +sentuhan dua orang ?
xnor
@xnatau Ya, itu benar.
Christian Dean
3
Omong-omong, tantangan pertama yang hebat.
xnor
1
@ LeakyNun Hakmu. Itu adalah kasus yang tidak ada dalam pikiran saya ketika membuat aturan. Saya menambahkan aturan untuk menyatakan mengapa +-+-+-+-+-+tidak valid. Maaf bila membingungkan.
Christian Dean

Jawaban:

9

C, 131 byte

#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;}

Cobalah online!

Penjelasan:

// 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
sumber
5

Python 3 , 140 137 128 119 106 105 byte

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')

Cobalah online!

GarethPW
sumber
2
Sudah lebih lama sekarang tetapi masalah telah diperbaiki.
GarethPW
1
Anda bisa menghemat satu byte dengan menghapus spasi di antara indan [w+1+(w-1)//3]]di bagian terakhir.
Christian Dean
1
Selamat datang di PPCG! Anda dapat menghapus ruang '\n') forjuga. Juga, Anda dapat mengubah (w-1)ke ~-wyang memungkinkan Anda untuk menghapus tanda kurung karena operator unary memiliki prioritas lebih tinggi daripada yang biner. Sama untuk (h-1)-> ~-hdan (a-1)-> ~-a. Cobalah online - 128 byte
musicman523
1
Juga karena semua output Anda dicetak, def f(w,h)sama panjangnya lambda w,h, tetapi memungkinkan Anda untuk menggunakan beberapa baris jika itu membantu Anda menambahkan kode lebih jauh
musicman523
1
a=~-w//3-~w;untuk menghemat 1 byte
Felipe Nardi Batista
4

Mathematica, 165 byte

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
sumber
4

Pip , 38 byte

37 byte kode, +1 untuk -nbendera.

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

Mengambil lebar dan tinggi sebagai argumen baris perintah. Cobalah online!

Penjelasan

                         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
sumber
4

Arang, 47 45 40 byte

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

Penjelasan: Pekerjaan dengan menggambar setiap sisi yang -s / |s pada gilirannya, memasukkan +s di mana diperlukan, kemudian finishing dengan +. Setelah menggambar sisi atas dan kanan, melompat kembali ke awal untuk menggambarnya dalam urutan terbalik, secara efektif menggambar sisi kiri dan bawah. Saya tidak tahu apakah simetri rotasi diizinkan, tetapi jika demikian, maka untuk 27 25 byte:

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

Membawa ide di atas ke ekstrem dengan menggambar sisi atas, berputar ke kiri, menggambar sisi kanan, berputar lagi, dan kemudian mengulangi untuk menggambar sisi bawah dan sisi kiri secara terbalik.

Neil
sumber
1
@ LeakyNun Terakhir kali saya mengalahkan Pyth adalah untuk Menggandakan beberapa berlian, dan itupun hanya lebih pendek.
Neil
4

JavaScript (ES6), 133 132 byte

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

Mengambil input dalam sintaks currying: f(width)(height).

Cuplikan Tes

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
sumber
2

Java (OpenJDK 8) , 178 177 byte

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;}

Cobalah online!

-1 byte terima kasih kepada @KevinCruijssen

Olivier Grégoire
sumber
Anda dapat menyimpan byte dengan mencari parameter: w->h-> Coba di sini.
Kevin Cruijssen
Yap, saya selalu lupa tentang kari ... Ini bukan sesuatu yang saya temukan alami: s
Olivier Grégoire
1

Arang , 47 45 37 byte

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

Cobalah online!

  • 2 byte disimpan setelah bermain dengan tanda-tanda dalam pembuatan string.
  • 8 byte disimpan berkat Neil, yang datang dengan cara yang jauh lebih sederhana untuk menghitung panjang pagar.

Pendekatan yang berbeda dari @ Neil's : pertama saya membuat string αdan βberisi karakter di perbatasan horizontal dan vertikal, menggunakan Rangeoperator yang membuat pengulangan string hingga panjang yang diberikan tercapai. Lalu saya mencetaknya dengan urutan yang benar:

  • Cetak α tanpa menggerakkan kursor.
  • Cetak β ke bawah.
  • Cetak α.
  • Cetak "+".
  • Gerakkan kursor ke atas dan ke kiri.
  • Cetak β ke atas, terbalik.

Tautan ke versi verbose .

Charlie
sumber
1
Terima kasih telah mengingatkan saya tentang hal itu Range, yang menghemat 3 byte pada pendekatan kedua saya!
Neil
@Neil itu bagus karena saya baru saja mengalahkan Anda dan saya tidak bisa mempercayainya. :-)
Charlie
1
Lebih baik lagi, saya berhasil mengoptimalkan ekspresi Anda, menghemat 8 byte: A…+---÷⁺²×⁴N³αA…+||÷⁺¹×³N²βPα↓βα+↖↑⮌β.
Neil
@Neil Wow. Optimasi seperti itu. Sangat arang.
Charlie
0

05AB1E , 58 byte

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

Cobalah online!

Lebih keras di 05AB1E daripada yang saya kira.

Guci Gurita Ajaib
sumber