울타리 만들어 줘!


15

도전

이것은 간단한 도전입니다. 두 개의 양의 정수가 주어 w지고 h너비 w와 높이가 ASCII 울타리를 만듭니다 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

파이썬 (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]]마지막 부분에서 공백을 제거하여 바이트를 절약 할 수 있습니다.
Christian Dean

1
PPCG에 오신 것을 환영합니다! 공간을 제거 할 수도 '\n') for있습니다. 또한, 당신은 변경할 수 있습니다 (w-1)~-w단항 연산자가 진 것보다 더 높은 우선 순위를 가지고 있기 때문에 당신이 괄호를 제거 할 수있다. 에 대한 동일 (h-1)-> ~-h(a-1)-> ~-a. 온라인으로 시도 - 128 바이트
musicman523

1
모든 출력이 인쇄되기 때문에, def f(w,h)같은 길이입니다 lambda w,h,하지만 당신의 코드를 추가로 골프를하는 데 도움이 경우 여러 줄을 사용할 수 있습니다
musicman523

1
a=~-w//3-~w;1 바이트를 절약하기
Felipe Nardi Batista

4

수학, 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

, 38 바이트

37 바이트의 코드, -n플래그의 경우 +1

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 다시 삽입 +의 필요한 경우는 다음과 마무리 +. 윗면과 오른쪽면을 그린 후 시작 부분으로 건너 뛰어 역순으로 그림을 그리면 왼쪽과 밑면을 효과적으로 그립니다. 회전 대칭이 허용되는지 알 수 없지만 그렇다면 그렇다면 27 25 바이트입니다.

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

윗면 그리기, 왼쪽 회전, 오른쪽 그리기, 다시 회전 및 반복하여 아래쪽과 왼쪽을 반대로하여 위의 아이디어를 최대한 활용합니다.


1
@LeakyNun 마지막으로 Pyth를 이겼을 때는 다이아몬드를 두 배로 늘리는 것이었고 심지어는 짧았습니다.
Neil

4

자바 스크립트 (ES6) 133 132 바이트

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

카레 구문으로 입력을 f(width)(height)받습니다 : .

테스트 스 니펫

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

자바 (오픈 JDK 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;}

온라인으로 사용해보십시오!

@KevinCruijssen 덕분에 -1 바이트


매개 변수를 카레하여 바이트를 저장할 수 있습니다 w->h-> . 여기에서 시도하십시오.
Kevin Cruijssen

그래, 나는 항상 카레를 잊어 버린다 ... 그것은 자연스럽지 않은 것이 아니다 : s
Olivier Grégoire

1

, 47 45 37 바이트

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

온라인으로 사용해보십시오!

  • 문자열 생성에서 부호를 사용한 후 2 바이트가 절약되었습니다.
  • 펜스 길이를 계산하는 훨씬 간단한 방법을 찾은 Neil 덕분에 8 바이트가 절약되었습니다.

와는 다른 방식 닐 @는 제 I의 문자열을 작성 : αβ은 USING, 수평 및 수직 경계의 문자를 포함하는 Range소정 길이에 도달 할 때까지 캐릭터의 반복을 생성 연산자. 그런 다음 올바른 순서로 인쇄합니다.

  • 커서를 움직이지 않고 α를 인쇄하십시오.
  • β를 아래쪽으로 인쇄하십시오.
  • α를 인쇄하십시오.
  • "+"를 인쇄하십시오.
  • 커서를 위와 왼쪽으로 이동하십시오.
  • β를 위로, 반대로 뒤집습니다.

자세한 버전으로 연결합니다 .


1
에 대해 알려 주셔서 감사합니다. Range두 번째 접근 방식에서 3 바이트를 절약합니다!
Neil

@Neil 방금 당신을 능가했고 그것을 믿을 수 없기 때문에 좋았습니다. :-)
찰리

1
더 나은 방법으로, 나는 8 바이트를 절약하면서 식을 최적화했습니다 A…+---÷⁺²×⁴N³αA…+||÷⁺¹×³N²βPα↓βα+↖↑⮌β.
Neil

@ 닐 와우. 그런 최적화. 매우 숯.
Charlie

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.