의자 조정


18

도전

당신은 아주 새로운 의자를 샀습니다! 문제는 제어 방법을 모른다는 것이므로이를 위해 프로그램을 작성해야합니다.

조절 가능한 의자의 예

조정되지 않은 의자에만 오래 앉아있을 수 있습니다. 따라서 코드는 가능한 짧아야합니다.

5,3,2,2,1

O
|
|
| _
| |
|_|_
  |
  |
  O

3,5,2,3,5

O
|  _
|  |
|__|__
   |
   |
 __|__
 OOOOO

2,13,1,1,13

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

나는 이것이 비행기처럼 보인다고 생각하는 유일한 사람인가?

의자 부품

의자에는 다양한 구성 요소가 있습니다.

O
|
|  <- Backrest
|  _  <- Armrest
|  |
|__|__ <- Seat
   |  
   |   <- Leg
  _|_
  OOO  <- Wheels

입력

다양한 변수가 주어진 의자를 출력합니다.

입력은 다음 순서로 이루어지며 모든 입력은 양의 정수 (항상 0보다 큼)가되며 항상 제공됩니다.

  1. 등받이 높이
  2. 좌석 폭은 항상 홀수
  3. 팔걸이 높이 항상 등받이 높이 미만
  4. 다리 높이
  5. 휠 카운트 항상 유저와 동일한 폭보다 작거나 그리고 항상 홀수

자세한 부품 설명

의자 부분은 다음과 같습니다.


등받이 : 이 정도 |등받이 높이

O
|
|

좌석 : 의 양은 _는 IS 좌석 폭이 하는 삽입 |팔걸이에 대한 중간에.

__|__

팔걸이 : 금액 |은 IS 팔걸이 높이 . 좌석 중앙에 삽입해야합니다.

_
|
|

다리 : 양은 다리 높이에| 의해 결정됩니다

|
|

바퀴 : 바퀴는 다리 아래 중앙에 있습니다. 둘 이상인 경우 중앙 휠을 제외한 모든 휠이 _위의 라인에 있어야 합니다.

_ _
OOO

산출

출력에 줄 바꿈이있을 수 있습니다. 각 줄에는 후행 공백이있을 수 있습니다. 선행 공백은 허용되지 않습니다


세 번째 테스트 사례가 잘못된 것 같습니다. 좌석 너비는 2보다 훨씬 큽니다.
손잡이

@Doorknob 冰 으악, 입력 순서에 문제가있어서 고쳤습니다.
Downgoat

"비행기" 는 Super Mario Bros 3 의 많은 전차를 상기시킵니다 .
El'endia Starman

답변:


2

LabVIEW, 146 LabVIEW 프리미티브

이것은 내가 상상했던 것보다 훨씬 더 커졌습니다 ...

다른 한편으로는 크기가 크기 때문에 다른 한편으로는 모든 데이터 흐름을 추적 할 수있는 방법이 없기 때문에 이번에는 GIF가 없습니다.

LabVIEW를 사용하지 않고 파일 호스팅을 제안하지 않으면 작동하지 않습니다.


9

JavaScript (ES6), 197 바이트

(b,s,a,l,w)=>eval('o="";for(i=0;i<b+l+2;i++)o+=(i?i>b?x[r](s/2-w/2+1)+(i>b+l?"O"[r](w):(p=(i<b+l?x:"_")[r](w/2))+"|"+p):"|"+(p=(i-b?x=" ":"_")[r="repeat"](s/2))+(i>b-a?"|":i<b-a?x:"-")+p:"O")+`\n`')

설명

글쎄요, 이것은 꽤 빨리 복잡해졌습니다. 각 라인이 높은 수준에서 수행하는 작업에 대해서만 언급하겠습니다. 이 형식을 사용하면 모든 삼항 연산자를 따르는 것이 어렵지 않습니다.

(b,s,a,l,w)=>
  eval(
    o="";
    for(i=0;i<b+l+2;i++)                        // for each line
      o+=(i?                                    // add to output

        // Leg lines
        i>b?
          x[r](s/2-w/2+1)                       // spaces before wheels
          +(
            i>b+l?
              "O"[r](w)                         // wheels
            :
              (p=(i<b+l?x:"_")[r](w/2))         // spaces or wheel cover before leg
              +"|"                              // leg
              +p                                // spaces or wheel cover after leg
          )

        // Backrest lines
        :
          "|"                                   // backrest
          +(p=(i-b?x=" ":"_")[r="repeat"](s/2)) // spaces or seat before armrest
          +(i>b-a?"|":i<b-a?x:"-")              // armrest
          +p                                    // spaces or seat after armrest

      // Headrest line
      :"O")
      +\`\n\`
  )

테스트


3

파이썬 2, 157 바이트

b,s,a,l,w=input()
y,z,n,A='|_\n '
s/=2;W=w/2;x=A*s;X=n+A*(s-W+1);Y=n+y
print'O'+Y*(b-a-1)+Y+x+z+(Y+x+y)*(a-1)+n+(y+z*s)*2+(n+A+x+y)*(l-1)+X+z*W+y+z*W+X+'O'*w

예:

3,7,1,2,5

O
|
|   _
|___|___
    |
  __|__
  OOOOO

3

자바 스크립트 (ES6), 182

익명의 기능. 템플릿 문자열을 사용하면 바이트 수에 포함 된 3 개의 줄 바꿈이 있습니다.

(b,s,a,l,w,R=(x=s/2,c=' ')=>c.repeat(x),f=`
`+R(s/2+1-w/2),h=R(s/2,'_'),g=R(w/2,'_'),v='|')=>'O'+R(b+~a,u=`
`+v)+u+R()+'_'+R(a-1,u+R()+v)+u+h+v+h+R(l-1,`
 `+R()+v)+f+g+v+g+f+R(w,'O')

동일한 목적으로 반복을 사용하여 루프가 없습니다.

덜 골프

(b, s, a, l, w, // parameters
 // local variables as parameters with default values
 R = (x=s/2,c=' ')=>c.repeat(x), // shortcut for repeat 
 f = `\n`+R(s/2+1-w/2), // filler before the wheels (used twice)
 h = R(s/2,'_'), // half seat (used twice)
 g = R(w/2,'_'), // last wheel support (used twice)
 v = '|', // vertical bar (used many times)
 u = `\n`+v // newline + bar (define below in the golfed version)
)=>
  'O'+R(b+~a, u)+  // backrest 
  u+R()+'_'+       // backrest + armrest top
  R(a-1, u+R()+v)+ // backrest + armrest
  u+h+v+h+         // seat
  R(l-1, `\n`+R()+v)+ // leg
  f+g+v+g+         // wheels support
  f+R(w, 'O')      // wheels

테스트 스 니펫

f=(b,s,a,l,w,R=(x=s/2,c=' ')=>c.repeat(x),f=`
`+R(s/2+1-w/2),h=R(s/2,'_'),g=R(w/2,'_'),v='|')=>'O'+R(b+~a,u=`
`+v)+u+R()+'_'+R(a-1,u+R()+v)+u+h+v+h+R(l-1,`
 `+R()+v)+f+g+v+g+f+R(w,'O')
  
console.log=x=>O.innerHTML=x+'\n'

function test()
{
  p=I.value.match(/\d+/g).map(x=>+x)
  console.log(p+'\n'+f(...p)+'\n')
}
Input <input type="text" id="I" value="5,5,3,2,3" />
<button onclick="test()">Go</button>
<pre id="O"></pre>


1
함수 본문보다 함수 매개 변수에 더 많은 바이트가 있으면 +1입니다.
user81655

1

SpecBAS- 185 168 바이트

1 INPUT b's'a'l'w: sx=(s/2)+1,wx=sx-(w/2)
2  ?"o"'("|"#13)*b
3  ?AT b,1;"_"*s;AT b+l,wx;"_"*w;AT b-a,sx;"-"
4 FOR i=b+1-a TO b+l: ?AT i,sx;"|": NEXT i
5  ?AT b+l+1,wx;"0"*w

이제 SpecBAS를 사용할 ?수 있고 변수를 할당하기 전에 PRINT필요하지 않기 때문에 LET골프에서 조금 나아지기 시작합니다.

또한 간격을 많이 사용하지 않아도 y, x 인쇄 위치를 지정할 수 있습니다. 이것은 등받이, 좌석, 팔, 다리를 인쇄 한 다음 바퀴를 인쇄합니다.

편집하다:

뒷면을 인쇄하려면 FOR...NEXT루프를 파이프 + 리턴에 높이 ( ("|"#13)*b)를 곱한 값으로 바꿉니다.

여기에 이미지 설명을 입력하십시오


1

펄, 181 바이트

+1을 포함한다 -n. 파일을 넣고echo 5,3,2,2,1 | perl -n file.pl

($b,$s,$a,$l,$w)=/\d+/g;$,=$/;print'O',('|')x($b-$a-1),($D='|'.$"x($s/=2)).'_',("$D|")x--$a,($q='|'.'_'x$s).$q,($"x$s.' |')x--$l,($x=$"x(1+$s-($W=$w/2))).'_'x$W.'|'.'_'x$W,$x.O x$w

의견 :

#!/usr/bin/perl -n              # -n: iterate stdin, put in $_

($b,$s,$a,$l,$w)=/\d+/g;        # get the parameters

$,=$/;                          # set $OUTPUT_FIELD_SEPARATOR to \n;
                                # this is printed between each of print's args

print                           # shorter than `-p` and @_=(...); $"=$/; $_="@_";
    'O',                        # the headrest

    ('|')x($b-$a-1),            # space between headrest and armrest.
                                # (...) x $n: produces $n lists.

    ($D='|' . $"x($s/=2))       # backrest and padding ($"=' ') up to armrest
    . '_',                      # armrest.

    ("$D|")x--$a,               # backrest, padding, armrest

    ($q='|' . '_'x$s) . $q,     # backrest bottom and 1/2 seat, armrest bottom and 1/2 seat

    ($" x $s . ' |' ) x --$l,   # padding before leg and leg, repeated leg-1 times

    ( $x =                     
      $" x (1+$s - ($W=$w/2) )  # padding before wheel top
    )
    . '_'x$W . '|'              # left side of wheel top, wheel top,
    . '_'x$W,                   # right side of wheel top

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