전기 차고 문이 열려 있습니까?


24

내 전기 차고 문은 다음과 같이 작동합니다.

  • 도어를 제어하는 ​​단 하나의 푸시 버튼이 있습니다
  • 문이 완전히 닫히고 버튼을 누르면 문이 열리기 시작합니다. 완전히 열려면 10 초가 걸립니다
  • 문이 완전히 열리고 버튼을 누르면 문이 닫히기 시작합니다. 완전히 닫히려면 10 초가 걸립니다
  • 문이 부분적으로 열리거나 닫히고 버튼을 누르면 문이 멈추고 부분적으로 열려 있습니다.
  • 개폐 동작의 자동 완료 또는 동작을 통해 버튼을 부분적으로 눌러 수동 중단으로 인해 도어가 움직이지 않을 때마다 메커니즘은 다음 동작의 방향을 되돌리고 기억합니다.
  • 도어가 멈춰 있지만 부분적으로 열렸을 때 버튼을 누르면 동작을 완료하는 데 걸리는 시간은 동작을 완료하기 위해 이동해야하는 양에 비례하여 10 초의 비율이됩니다.

시작시 도어가 완전히 닫혀 있다고 가정하십시오.

정수 입력 목록이 제공됩니다. 이 정수는 컨트롤 버튼을 연속해서 누를 때까지 기다리는 시간 (초)입니다.

다음 두 가지를 출력하십시오.

  • 모든 버튼 누름이 완료되고 도어가 정상 상태에 도달하면 도어의 상태를 나타내는 백분율. %기호 출력 은 선택 사항입니다.
  • 다음 버튼을 누를 때 문이 어떤 방향으로 움직 일지 분명하게 나타냅니다. 이것은 up/ down, U/ D, +/ -, 1/ 0또는 원하는 것이 될 수 있습니다.

문을 열고 닫는 동작을 완료하는 데 10 초 미만이 걸리는 것으로 가정 할 수 있습니다.

입력 예 :

<empty list>  # button was pushed just once
20            # button was pushed twice with 20 seconds between
10
5
20 20
10 10
5 5
1 2 3
8 9 10 11
11 10 9 8 7

위의 입력에 해당하는 예상 출력

100% D
0% U
0% U
50% D
100% D
100% D
0% U
100% D
0% U
20% U

마지막 테스트의 예제

  • 문이 닫히기 시작합니다. 버튼을 누른다
  • 11 초 기다립니다. 문이 완전히 열립니다. 버튼을 눌렀습니다.
  • 10 초 정도 기다립니다. 문이 완전히 닫힙니다. 버튼을 눌렀습니다.
  • 9 초 정도 기다립니다. 버튼을 눌렀습니다. 도어가 90 % 열린 상태에서 멈 춥니 다.
  • 8 초 정도 기다립니다. 버튼을 눌렀습니다. 문이 닫히기 시작합니다.
  • 7 초 동안 기다립니다. 버튼을 눌렀습니다. 도어가 20 % 열린 상태에서 멈 춥니 다. 다음 방향으로 올라갑니다.

닫을 때 버튼을 누르면 차고 문이 반쯤 열리지 않습니까? 광산은 개봉만을위한 것이 아닙니다.
Bálint

@ Bálint 내 길을
Digital Trauma

@Maltysen은 이제 백분율을 고수합니다.
디지털 외상

입력이 부동 소수점 숫자로 구성된 경우 부동 소수점 숫자가 출력 되더라도 괜찮습니까?
R. Kap

@ R.Kap 예, 좋습니다.
Digital Trauma

답변:


6

루아, 258 (248) 242 바이트

u,s,p=1>0,0>1,0;io.read():gsub("%d+",function(a)if(not s)then p=u and p+a or p-a;if(p>=10 or p<=0)then s,p=1>0,p>0 and 10 or 0;end;u,s=not u,not s else s=0>1;end end)if(not s)then p=u and 10 or 0;u=not u;end;print(10*p.."% "..(u and"U"or"D"))

언 골프

u,s,p=true,false,0;                          -- Up direction, Stopped, Position
io.read():gsub("%d+",function(t)             -- For each number in input
    if(not s)then                            -- If door wasn't stopped
        p=u and p+t or p-t;                  -- Position = Moving up ? +t : -t
        if(p>=10 or p<=0)then                -- If door fully opened or closed
            s,p=true,p>0 and 10 or 0;        -- Then door stopped at 0 or 10
        end 
        u,s=not u,not s;                     -- Toggle direction and toggle stopped
    else 
        s=false;                             -- If stopped, nothing happened, un-stop.
    end 
end)
-------------------- Done pressing the button --------------------
if(not s)then                                -- If left off moving
    p=u and 10 or 0;                         -- Finish movement
    u=not u;                                 -- Toggle direction
end 
print(10*p.."% "..(u and"U"or"D"))           -- Output answer

테스트 사례가 옳은지 모르겠습니다.

20 20 -- Initial push, after 20, garage is at 100, push to start it down, after 20, garage is at 0, push to start it up, garage finishes up.
10 10 -- Same as above
1 2 3 -- 0 U Moving, wait 1, 1 D Stopped, wait 2, 0 U stopped, wait 3, 100 D stopped

OP 고정


입국을 마쳤으며 귀하의 결과에도 동의합니다.
Neil


3

자바 스크립트 (ES6), 109 106 바이트

a=>a.map(e=>(s^=1)?(r-=e*(d=-d))>9?(s=0,r=10):r<1?(r=s=0):r:r,r=s=0,d=1)&&(s?r:5*++d)*10+(d-s?"% D":"% U")

@DigitalTrauma 최적화 오류 여야합니다. 나는 그것을 다시 최적화했고 어떻게 든 이번에는 3 바이트를 더 절약 할 수있었습니다!
Neil

3

루비, 152 바이트

->v{u,s,a=!!1,!0,0;v.map{|w|!s ?(a=u ? a+w : a-w;a>=10 ?(s,a=!!1,10):a<=0 ?(s,a=!!1,0):0;u,s=!u,!s):s=!0};!s ?(a=(u=!u)?0:10):0;p"#{10*a}% #{u ??U:?D}"}

테스트 사례 :

f=->v{u,s,a=!!1,!0,0;v.map{|w|!s ?(a=u ? a+w : a-w;a>=10 ?(s,a=!!1,10):a<=0 ?(s,a=!!1,0):0;u,s=!u,!s):s=!0};!s ?(a=(u=!u)?0:10):0;p"#{10*a}% #{u ??U:?D}"}

f[[]]            # => "100% D"
f[[20]]          # => "0% U"
f[[10]]          # => "0% U"
f[[5]]           # => "50% D"
f[[20,20]]       # => "100% D"
f[[10,10]]       # => "100% D"
f[[5,5]]         # => "0% U"
f[[1,2,3]]       # => "100% D"
f[[8,9,10,11]]   # => "0% U"
f[[11,10,9,8,7]] # => "20% U"

재미있는 참고 사항으로, (I think) 로 변경 ->v{하여 1 바이트의 비용으로 추가 브래킷에 대한 요구 사항을 제거 할 수 있습니다 ->*v{. 또한, 공간을 필요합니까 전에: 뿐만 아니라 이후에? 그리고 :a<=0파싱하지 않는 것이 확실 (:a) <= 0합니까?
기금 모니카의 소송 18

좋은 팁! var에 액세스하여 무게를 측정해야합니다. 에 관해서는 :a<=0, ArgumentError: comparison of Symbol with 0 failed그것이 작동하지 않으면 얻을 것 입니다. 파싱하고 ?삼항 연산자에 있다는 것을 알고 있기 때문에 작동합니다. 규칙은 실제로 이상합니다. 내가 좋아하는 구문 오류를 방지하는 데 필요한 장소에서 공백이나 괄호를 넣어 한 SyntaxError: unexpected tLABELNoMethodError: undefined method U를? ''.
br3nt

개선 된 부분이 있으면 언제든지 수정하십시오. 나는 제거 할 수 있도록 바라고 a=u ? a+w : a-w로 변경 a=a+w*dd이다 1또는 -1방향에 따라, 그러나 나는 아직 그것을 밖으로 일을하지 않았습니다.
br3nt

내가 이해 한 바에 따르면 코드를 개선하기위한 편집은 일반적으로 권장되지 않습니다. 대신 의견을 말해야합니다. 개선에 대한 당신의 아이디어에 관해서는, 나는 몰라; 그것은 효과가있는 것처럼 보이지만 나는 확신합니다.
Fund Monica의 소송 :

2

파이썬 3.5 193 187 185 181 175 173 172 바이트 :

def G(*p):
 O=100;y=0;l=10;z,v='UG'
 for g in[*p,O]:
  if v=='G':Q=O*g//10;y=min(max(0,[Q,y-Q][z=='D']),O);l=min(10,g);z='UD'[z=='U']
  v='GS'[(O>y>0)*(v!='S')]
 print(y,z)

예를 들어 1,2,3,4,5또는 쉼표로 구분 된 숫자 형식으로 입력을 1.2,3.4,7.8,9.2받습니다. 다음 단계의 도어가 U또는D 각각. 시간이 지남에 따라 더 골프를 칠 것입니다.

온라인으로 사용해보십시오! (Ideone) (여기서 입력은 쉼표로 구분 된 숫자로 구성된 목록 형식으로 표시됩니다 (예 :))[1,2,3,4,5] .


1

PHP, 128120 바이트

$d=$argv[]=10;
foreach($argv as$a)
  if($r){$p=min(max($p+$a*$d,0),100);$r=$p<1||99<$p;$d=-$d;}else$r=1;
echo"$p% ".DU[$d>0];

코드는 코드 상자에 맞도록 여기에 싸여 있습니다. 모든 것을 한 줄에 넣고 PHP 열린 마커를 앞에 놓고 파일로 저장하십시오. 또는 다음을 사용하여 명령 행에서 실행하십시오.php -d error_reporting=0 -r '...the code...' [arguments] .

ungolfed 소스 코드, 테스트 스위트 및 사용법 예제는 github 에서 찾을 수 있습니다 .

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