ทำให้ฉันเป็นรั้ว!


15

ท้าทาย

นี่เป็นความท้าทายที่เรียบง่าย ป.ร. ให้ไว้สองจำนวนเต็มบวก wและhสร้างรั้ว ASCII ที่มีความกว้างของและความสูงของw hควรสร้างรั้วโดยใช้กฎต่อไปนี้:

  • +ตัวละครจะเป็นตัวแทนของการโพสต์
  • -ตัวละครจะถูกนำมาใช้เพื่อเป็นตัวแทนของความกว้างของรั้ว
  • |จะถูกนำมาใช้เพื่อเป็นตัวแทนของความสูงของรั้ว
  • หลังจากแสดงอักขระสามตัวอย่างแน่นอน-แล้ว+อักขระจะต้องถูกแสดงหลังจากนั้น หากไม่รวมสี่มุมเวลาอื่น ๆ ที่คุณให้เอ+จะเป็นโมฆะ คุณได้รับอนุญาตให้ปฏิบัติตามกฎนี้โดยเริ่มจากด้านซ้ายหรือด้านขวา (ดูตัวอย่าง) แต่คุณจะต้องสอดคล้องกัน
  • หลังจากเอาต์พุต|อักขระสองตัวที่ตรงกันแล้ว+อักขระต้องถูกเอาต์พุตหลังจากนั้น หากไม่รวมสี่มุมเวลาอื่น ๆ ที่คุณให้เอ+จะเป็นโมฆะ คุณได้รับอนุญาตให้ปฏิบัติตามกฎนี้โดยเริ่มจากด้านบนหรือด้านล่าง (ดูตัวอย่าง) แต่คุณจะต้องสอดคล้องกัน
  • +แต่ละรั้วจะมีตรงสี่มุมและแต่ละมุมจะแสดงด้วย

ในคำอื่น ๆ : ในทุกสามตัวละครที่คุณต้องส่งออก- +และในทุก ๆ สองตัวละครที่คุณต้องส่งออก|+

คุณสามารถคิดว่ารั้วจะเสมอเป็นรูปสี่เหลี่ยมผืนผ้าและว่าทั้งสองwและhไม่เคยจะมากกว่าหรือน้อยกว่า100 1อนุญาตการต่อท้ายและ / หรือช่องว่างก่อนหน้าได้

ตัวอย่าง / กรณีทดสอบ

w = 1
h = 1

+-+ 
| |
+-+


w = 3
h = 2

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


w = 5
h = 7

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

w = 10
h = 5

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


w = 4
h = 4

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

กฎระเบียบ

  • ช่องโหว่ตามมาตรฐาน
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!


3
ฉันถูกต้องที่จะเข้าใจ+หรือไม่
xnor

@xnor ใช่ถูกต้องแล้ว
Christian Dean

3
ความท้าทายครั้งแรกที่ยอดเยี่ยมโดยวิธีการ
xnor

1
@LeakyNun สิทธิ์ของคุณ นั่นเป็นกรณีที่ฉันไม่ทราบเมื่อสร้างกฎ ฉันเพิ่มกฎเพื่อระบุสาเหตุที่+-+-+-+-+-+ไม่ถูกต้อง ขอโทษสำหรับความสับสน.
Christian Dean

คำตอบ:


9

C, 131 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

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

Python 3 , 140 137 128 119 106 105 ไบต์

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

ลองออนไลน์!


2
อีกต่อไปแล้ว แต่ปัญหาได้รับการแก้ไขแล้ว
GarethPW

1
คุณสามารถบันทึกไบต์โดยการลบช่องว่างระหว่างinและ[w+1+(w-1)//3]]ในส่วนสุดท้าย
คริสเตียนดีน

1
ยินดีต้อนรับสู่ PPCG! คุณสามารถลบพื้นที่ได้'\n') forเช่นกัน นอกจากนี้คุณยังสามารถเปลี่ยน(w-1)ไป~-wซึ่งจะช่วยให้คุณสามารถลบวงเล็บตั้งแต่ผู้ประกอบการเอกภาคมีลำดับความสำคัญสูงกว่าคนไบนารี เหมือนกันสำหรับ(h-1)-> ~-hและ->(a-1) ลองออนไลน์ - 128 ไบต์~-a
musicman523

1
นอกจากนี้เนื่องจากงานพิมพ์ทั้งหมดของคุณพิมพ์ออกมาdef f(w,h)มีความยาวเท่าlambda w,hกัน แต่ให้คุณใช้หลายบรรทัดหากช่วยให้คุณเขียนโค้ดได้มากขึ้น
musicman523

1
a=~-w//3-~w;บันทึก 1 byte
Felipe Nardi Batista

4

Mathematica, 165 ไบต์

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 ไบต์

รหัส 37 ไบต์ +1 สำหรับการ-nตั้งค่าสถานะ

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

รับความกว้างและความสูงเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ลองออนไลน์!

คำอธิบาย

                         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

ถ่าน47 45 40 ไบต์

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

คำอธิบาย: ธิการโดยการวาดแต่ละด้านของ-s / |s ในการเปิดการใส่+s +ที่จำเป็นแล้วจบด้วย หลังจากวาดด้านบนและด้านขวาแล้วกระโดดกลับไปที่จุดเริ่มต้นเพื่อวาดพวกเขาในลำดับย้อนกลับได้อย่างมีประสิทธิภาพวาดด้านซ้ายและด้านล่าง ฉันไม่รู้ว่าสมมาตรการหมุนนั้นได้รับอนุญาตหรือไม่ แต่ถ้าเป็นเช่นนั้น 27 25 ไบต์:

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

นำแนวคิดข้างต้นไปสู่สุดโต่งโดยการวาดด้านบนหมุนซ้ายวาดด้านขวาหมุนอีกครั้งจากนั้นทำซ้ำเพื่อวาดด้านล่างและด้านซ้ายย้อนกลับ


1
@LeakyNun ครั้งที่แล้วที่ฉันเอาชนะ Pyth นั้นก็เพื่อเพิ่มเพชรบางส่วนและถึงตอนนั้นมันก็แค่สั้นลงเท่านั้น
Neil

4

JavaScript (ES6), 133 132 ไบต์

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

จะเข้าในไวยากรณ์ f(width)(height)currying:

ตัวอย่างการทดสอบ

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>



2

Java (OpenJDK 8) , 178 177 ไบต์

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

ลองออนไลน์!

-1 ไบต์ขอบคุณ @KevinCruijssen


คุณสามารถบันทึก byte โดยการพารามิเตอร์พารามิเตอร์: w->h-> ลองที่นี่
Kevin Cruijssen

ใช่ฉันมักจะลืมเกี่ยวกับการสาป ... มันไม่ใช่สิ่งที่ฉันพบตามธรรมชาติ: s
Olivier Grégoire

1

ถ่าน , 47 45 37 ไบต์

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

ลองออนไลน์!

  • บันทึก 2 ไบต์หลังจากเล่นด้วยเครื่องหมายในการสร้างสตริง
  • บันทึกได้ 8 ไบต์ขอบคุณ Neil ผู้คิดค้นวิธีที่ง่ายกว่ามากในการคำนวณความยาวของรั้ว

แนวทางที่แตกต่างจาก@ Neil's : ก่อนอื่นฉันสร้างสตริงαและβบรรจุตัวอักษรในแนวนอนและแนวตั้งโดยใช้Rangeโอเปอเรเตอร์ที่สร้างการซ้ำซ้อนของสตริงจนกว่าจะถึงความยาวที่กำหนด จากนั้นฉันพิมพ์ตามลำดับที่เหมาะสม:

  • พิมพ์αโดยไม่เลื่อนเคอร์เซอร์
  • พิมพ์βลง
  • พิมพ์α
  • พิมพ์ "+"
  • เลื่อนเคอร์เซอร์ขึ้นและไปทางซ้าย
  • พิมพ์ wards ขึ้นไปกลับด้าน

เชื่อมโยงไปยังรุ่นอย่างละเอียด


1
ขอบคุณที่เตือนฉันเกี่ยวกับRangeที่ช่วย 3 ไบต์ในแนวทางที่สองของฉัน!
Neil

@ นีลก็ดีนะเพราะฉันเพิ่งจะทำให้คุณผิดหวังและฉันก็ไม่อยากเชื่อ :-)
Charlie

1
ยังดีกว่าฉันจัดการเพื่อเพิ่มประสิทธิภาพของการแสดงออกของคุณประหยัด 8 A…+---÷⁺²×⁴N³αA…+||÷⁺¹×³N²βPα↓βα+↖↑⮌βไบต์:
Neil

@ Neil Wow การเพิ่มประสิทธิภาพดังกล่าว ถ่านมาก
Charlie

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.