의자 분석


11

이 도전은 Downgoat 's Adjust your chair 에 기반 합니다 .

도전

당신은 당신의 새로운 의자를 조정했습니다! 완벽하게 맞습니다. 그러나 휠이 삐걱 거리며 수리 담당자가 조정을 변경한다는 것을 알고 있습니다. 문제는, 당신은 통치자가 없기 때문에 그것을 측정 할 프로그램을 작성해야한다는 것입니다. 수리 담당자는 너무 오래 기다릴 수 있습니다. 따라서 코드는 가능한 짧아야합니다.
조절 가능한 의자의 예

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

5,3,2,2,1

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

3,5,2,3,5

O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO

2,13,1,1,13

의자 부품

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

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

자세한 의자 설명

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


머리 받침 : 항상 등받이 위에 하나의 머리 받침이 있습니다.

O
|

등받이 : 개수 |등받이 높이

O
|
|

좌석 : 의 수 _좌석 너비 이며 |, 팔걸이의 중간에 있습니다.

__|__

팔걸이 : 의 수 |팔걸이 높이 입니다. 좌석 중앙에 삽입됩니다.

_
|
|

다리 : 개수 |다리 높이입니다

|
|

바퀴 : 바퀴는 다리 아래 중앙에 있습니다. 둘 이상인 경우 중앙 휠을 제외한 모든 휠이 _위 선에 표시됩니다.

_ _
OOO

산출

의자가 주어지면 다양한 변수가 출력됩니다.

출력은 다음 순서로되어 있어야합니다.

  1. 등받이 높이
  2. 좌석 폭은 항상 홀수
  3. 팔걸이 높이 항상 등받이 높이 미만
  4. 다리 높이
  5. 휠 수는 항상 시트 폭보다 작거나 같 으며 항상 홀수

출력에는 줄 바꿈 문자가 있거나 함수 인 경우 배열 / 목록 형식 일 수 있습니다.

리더 보드

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 개의 숫자를 포함 시키려면 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

# Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

팔걸이는 측정됩니까?
J Atkin

답변:


3

루아, 187 바이트

골프를 좀 더 할 수있을 것 같지만, 지금은 이것이 좋다고 생각합니다. 또한 출력을 쉼표로 분리 해야하는 경우 수정할 수는 있지만 여전히 요구 사항을 충족시킵니다.

또한 입력은 한 번에 한 줄로 공급됩니다. 휠이 입력 된 후 빈 줄로 Enter 키를 누르면 입력이 완료됩니다.

c={}i=1t=""while c[i-1]~=""do c[i]=io.read():gsub("%s+","")t=t..c[i]a=(not a and c[i]:find("_")and i or a)s=(not s and c[i]:find("_|_")and i or s)i=i+1 end print(s-1,c[s]:len()-1,s-a,#c-s-2,c[#c-1]:len())

언 골프

c={}
i=1
while c[i-1]~=""do 
    c[i]=io.read():gsub("%s+","")          --remove spaces
    a=(not a and c[i]:find"_"and i or a)   --armrest position
    s=(not s and c[i]:find"_|_"and i or s) --seat position
    i=i+1
end
print(s-1, c[s]:len()-1, s-a, #c-s-2, c[#c-1]:len())

위치는 위에서 아래로 측정되므로 상단 'O'는 위치 1이고 휠은 가장 큰 위치입니다.

  • 등받이 높이는 시트에서 1을 뺀 위치이며 상단의 'O'를 보정합니다.
  • 시트 크기는 등받이를 보상하는 시트 위치에서 줄의 길이에서 1을 뺀 길이입니다.
  • 팔걸이 높이는 좌석 위치에서 팔걸이 위치를 뺀 위치입니다.
  • 다리 높이는 #c바퀴와 시트를 보정하기 위해 의자 높이 ( )에서 시트 빼기 2의 위치를 ​​뺀 값입니다.
  • 휠 수는 최종 문자열의 길이입니다.

3

Groovy, 161 바이트 !!!

예 !! 마지막이 아닙니다 !!

f={s->a=s.split(/\n/)
b=a.findIndexOf{it.contains('|_')}
d=b-a.findIndexOf{it.contains('_')}
print"$b,${a[b].count('_')+1},$d,${a.size()-b-2},${s.count('O')-1}"}

언 골프 드 :

f={String s ->
    split = s.split(/\n/)
    bottomOfChairBack = split.findIndexOf {it.contains('|_')}
    armHeight = bottomOfChairBack-split.findIndexOf {it.contains('_')}
    width = split[bottomOfChairBack].count('_')+1
    height = split.size() - bottomOfChairBack - 2

    wheelCount = s.count('O')-1
    return [bottomOfChairBack, width, armHeight, height, wheelCount]
}

ungolfed 프로그램의 테스트 :

assert f('''O
|
|
| _
| |
|_|_
  |
  |
  O''') == [5, 3, 2, 2, 1]

assert f('''O
|  _
|  |
|__|__
   |
   |
 __|__
 OOOOO''') == [3,5,2,3,5]

assert f('''O
|  _
|  |
|__|__
   |
   |
 __|__
 OOOOO''') == [3,5,2,3,5]

assert f('''O
|      _
|______|______
 ______|______
 OOOOOOOOOOOOO''') == [2,13,1,1,13]

2

피스, 57 54 53 50 바이트

아마 더 골프를 칠 수 있습니다. 단일 문자열 트릭을위한 issacg 덕분에 -3 바이트

=kjb.z
=H/k+b\|
-/k\_=G-/k\O2
--/k\|H=Nt/k+bd
N
hG

설명:

=kjb.z
=k              Assign k
     z          Input
  jb.           Join list by newlines

=H/k+b\|
=H              Assign H
  / +b\|        Count occurrences of "\n|"
   k            In input
                (Implicit: print backrest height)

-/k\_=G-/k\O2
     =G         Assign G
       -/k\O2   The number of wheels minus 1
-/k\_           Count the number of "_"
                (Implicit: print seat width)

--/k\|H=Nt/k+bd
       =N       Assign N
          /k+bd Count the number of lines starting with " "
         t      Subtract 1 (N is now the leg height)
  /k\|          Count the number of "|"
 -    H         Subtract the "|" for the backrest
-               Subtract leg height
                (Implicit: print armrest height)

N               Print leg height

hG              Print the number of wheels

1
한 문자로 된 문자열을 만들려면을 사용하십시오 \. 그래서 "_"=\_
isaacg

그렇습니다, 나는 이것을 이길 방법이 없습니다;)
J Atkin

2

펄, 93 + 2 = 95 90 + 1 = 91 83 + 1 = 84 바이트

분명히 출력은 쉼표로 구분할 필요가 없습니다.

perl -n chair.pl chairInput(플래그에 대해 1B 페널티)로 호출 하십시오.

END{print$b,2+$u-$o,$a,$.-$b-2,$o-1}$u+=s/_//g;$o+=s/O//g;s/^\|//&&$b++&&/\|/&&$a++

언 골프 드 :

END{         # Put the END block first to save 1 ;
    print
        $b,   
    2+$u-$o,
    $a,
    $.-$b-2, # $. is the number of lines total
    $o-1
}
$u+=s/_//g; # count _s incrementally
$o+=s/O//g; # count Os incrementally
s/^\|// && $b++ # it's backrest if it starts with |
    && /\|/ && $a++ # and it's armrest if it has another one

이전 버전:

호출 perl -0n chair.pl < chairInput

s/^\|//&&$b++?/\|/&&$a++:$h++for split"
",$_;$,=",";print$b,2+s/_//g-($o=s/O//g),$a,$h-3,$o-1

설명:

s/^\|// && $back++   # the backrest is all lines starting with |
    ? /\|/ && $arm++ # the armrest is all of those lines with another |
    : $height++      # otherwise it counts for the seat height
    for split"
",$_;       # literal newline for 1 byte saved
$,=",";     # output separator
print
    $back,
    2+s/_//g-($o_count=s/O//g),  # you can find the seat size
                                 # from the different between the number
                                 # of Os and _s
    $arm,
    $height-3,
    $o_count-1

1

파이썬 3 160 158 바이트

이 코드는 다음 조건에서만 작동합니다. 1) armrest height > 0그렇지 않으면 _카운트가 중단되고 2) seat width > 1그렇지 않으면 팔걸이가 너비 1 자리를 차단하고 _카운트가 중단됩니다.

def f(s):
 a=s.split("\n");x=[];y=[];l=len(a)
 for i in range(l):
  m=a[i].count("_")
  if m:x+=i,;y+=m,
 return x[1],y[1]+1,x[1]-x[0],l-x[1]-2,s.count("O")-1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.