Bana bir çit yap!


15

Meydan okuma

Bu basit bir zorluk. Verilen iki pozitif tamsayı w ve hgenişliği wve yüksekliği ile bir ASCII çit oluşturmak h. Çit aşağıdaki kurallar kullanılarak inşa edilmelidir:

  • +Karakter bir yazı temsil edecek.
  • -Karakter çit genişliğini temsil etmek için kullanılır.
  • |Çitin yüksekliği temsil etmek kullanılacaktır.
  • Tam olarak üç -karakter çıktıktan sonra , bir +karakterin daha sonra çıkması gerekir . Dört köşeyi hariç tuttuğunuzda, a çıktısını verdiğiniz herhangi bir +zaman geçersiz olur. Bu kuralı soldan veya sağdan başlayarak izlemenize izin verilir (örneklere bakın), ancak tutarlı olmalısınız.
  • Sonra tam iki |karakter outputted edilmiş bir +karakter gerekir sonrasında çıktılanmasını. Dört köşeyi hariç tuttuğunuzda, a çıktısını verdiğiniz herhangi bir +zaman geçersiz olur. Bu kuralı üstten veya alttan başlayarak izlemenize izin verilir (örneklere bakın), ancak tutarlı olmalısınız.
  • Her çit tam olarak dört köşeye sahip olacak ve her köşe bir ile temsil edilecektir +.

Diğer bir deyişle: Her üç -karakterde bir a çıktısı almalısınız +. Ve her iki |karakterde bir çıktı almalısınız +.

Çitin her zaman bir dikdörtgen olacağını ve her ikisinin de wve hasla büyük 100veya küçük olmayacağını varsayabilirsiniz 1. Sondaki ve / veya önceki boşluklara izin verilir.

Örnekler / Test Örnekleri

w = 1
h = 1

+-+ 
| |
+-+


w = 3
h = 2

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


w = 5
h = 7

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

w = 10
h = 5

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


w = 4
h = 4

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

kurallar



3
İki +dokunuş olmayabileceğini anlayabiliyor muyum ?
xnor

@xnor Evet, doğru.
Christian Dean

3
Bu arada büyük bir ilk meydan okuma.
xnor

1
@LeakyNun Hakkınız. Bu kurallarimi yaparken aklıma gelmeyen bir durum. Neden +-+-+-+-+-+geçersiz olduğunu belirtmek için bir kural ekledim . Karışıklık için özür dilerim.
Christian Dean

Yanıtlar:


9

C, 131 bayt

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

Çevrimiçi deneyin!

Açıklama:

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

5

Piton 3 , 140 137 128 119 106 105 bayt

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

Çevrimiçi deneyin!


2
Artık daha uzun ama sorun çözüldü.
GarethPW

1
Son kısımdaki inve sonundaki boşluğu kaldırarak bir bayt kaydedebilirsiniz [w+1+(w-1)//3]].
Christian Dean

1
PPCG'ye Hoşgeldiniz! Alanı da kaldırabilirsiniz '\n') for. Ayrıca, değiştirebilir (w-1)için ~-wtekli operatörler ikili olanlardan daha yüksek bir önceliğe sahip beri parantez kaldırmak olanak sağlayan. (h-1)-> ~-hve (a-1)-> için de aynıdır ~-a. Çevrimiçi deneyin - 128 bytes
musicman523

1
Ayrıca, tüm çıktılarınız basıldığından, def f(w,h)aynı uzunluktadır lambda w,h, ancak kodunuzu daha da golf
oynamanıza

1
a=~-w//3-~w;1 byte tasarruf
Felipe Nardi Batista

4

Mathematica, 165 bayt

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}])&

4

Pip , 38 bayt

37 bayt kod, -nbayrak için +1 .

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

Genişlik ve yüksekliği komut satırı bağımsız değişkenleri olarak alır. Çevrimiçi deneyin!

açıklama

                         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

4

Kömür, 47 45 40 bayt

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

Açıklama: Her bir tarafın -s / |s'lerini sırayla çizerek , +gerektiğinde s yerleştirip ardından a ile bitirerek çalışır +. Üst ve sağ tarafları çizdikten sonra, ters sırada çizmek için başlangıca geri atlar, sol ve alt tarafları etkili bir şekilde çizer. Dönme simetrisine izin verilip verilmediğini bilmiyorum, ama eğer öyleyse, 27 25 bayt için:

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

Üst tarafı çizerek, sola döndürerek, sağ tarafı çizerek, tekrar döndürerek ve ardından alt ve sol tarafları tersine çizmek için tekrarlayarak yukarıdaki fikri uç noktalara taşır.


1
@LeakyNun Pyth'i en son yendiğimde, bazı elmasları ikiye katladım ve o zaman bile sadece daha kısaydı.
Neil

4

JavaScript (ES6), 133 132 bayt

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

Tımar sözdiziminde girişi Alır: f(width)(height).

Test Parçacığı

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>




1

Kömür , 47 45 37 bayt

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

Çevrimiçi deneyin!

  • Dize oluşturmadaki işaretlerle oynadıktan sonra 2 bayt kaydedildi.
  • Çitlerin uzunluklarını hesaplamak için çok daha basit bir yol sunan Neil sayesinde 8 bayt tasarruf etti.

Dan farklı bir yaklaşım Neil @ ilk ipleri oluşturun: αve βkullanma, yatay ve dikey sınırları içinde karakter içeren Rangebelirli bir uzunluk elde edilene kadar bir dize tekrarını oluşturur operatörü. Sonra onları uygun sırayla yazdırıyorum:

  • İmleci hareket ettirmeden α yazdırın.
  • Β aşağı doğru yazdırın.
  • Yazdır α.
  • Bir "+" yazdırın.
  • İmleci yukarı ve sola hareket ettirin.
  • Β yukarı, ters çevrilmiş şekilde yazdırın.

Bir bağlantı Ayrıntılı sürümü .


1
Hatırlattığınız için teşekkürler Range, bu benim ikinci yaklaşımımda 3 bayt tasarruf sağlıyor!
Neil

@Neil bu güzel çünkü seni daha önce geçtim ve inanamıyorum. :-)
Charlie

1
Daha da iyisi, 8 bayt tasarruf ederek ifadelerinizi optimize etmeyi başardım A…+---÷⁺²×⁴N³αA…+||÷⁺¹×³N²βPα↓βα+↖↑⮌β.
Neil

@Neil Wow. Böyle bir optimizasyon. Çok Kömür.
Charlie

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.