경보 최적화


28

내 알람 시계

나는 미국인이고, (디지털) 자명종도 마찬가지입니다. 알람을 설정하기 위해 알람이 이전 시간에 시작됩니다. 시간 버튼을 누르면 1 시간 위로 이동하고 분 버튼을 누르면 1 분 위로 이동합니다. 두 버튼을 동시에 두드리면 자정 (오전 12시)으로 재설정되고 두 번의 버튼 누름으로 계산됩니다.

시간이 한도를 초과하면 (12) 1로 재설정되고 AM / PM 표시등이 전환됩니다. 분이 최대 한도 (59)를 초과하면 시간에 영향을주지 않고 0으로 재설정됩니다.

작업

작업은 시작 시간과 목표 시간이 주어지면서 알람을 목표 시간으로 설정하는 데 필요한 최적의 버튼 누름 수를 출력합니다.

가장 적합한 형식으로 입력 할 수 있습니다. 프로그램에 필요한 유일한 데이터는 두 입력에 대해 시간과 분입니다. 즉, 예를 들어, 에포크 이후 데이터를 밀리 초로 가져 와서 시간과 분을 추출 할 수 있지만 년, 월, 초 등으로 어떤 것도 인코딩 할 수 없습니다 . 예를 들어 "군사 시간"(또는 대부분의 세계에서 정규 시간)이지만 시계 작동 방식은 바뀌지 않습니다.

1:15 pm -> 2:30 am

두 버튼을 아래로 눌러 오전 12 시로 재설정 한 다음 오전 2시 30 분으로 증가시킬 수 있습니다 2+2+30 = 34. 오전 2시 30 분까지 증가시킬 수 있으며 이는 13+15 = 28버튼 누름입니다. 따라서 출력은 28입니다.

3:58 am -> 4:02 am

2+4+2 = 8버튼을 누르면 재설정 및 증분 할 수 있습니다 . 또한이 될 것이다, 증가 수있는 1+4 = 5버튼 누름. 따라서 출력은 5입니다.

10:55 pm -> 1:00 am

2+1 = 3버튼을 누르면 재설정 및 증분 할 수 있습니다 . 또한이 될 것이다, 증가 수있는 3+5=8버튼 누름. 따라서 출력은 3입니다.

1:00 am -> 1:59 pm

재설정하고 증분 할 수 있지만 증분보다 3 번 더 누르는 것입니다. 따라서 출력은 12+59 = 71입니다.

테스트 사례

Current  Target   = Output
1:15pm   2:30am   = 28
3:58am   4:02am   = 5
10:55pm  1:00am   = 3
1:00am   1:59pm   = 71
12:00am  12:00am  = 0
6:51pm   12:00am  = 2
2:01pm   11:00pm  = 25
2:01pm   11:01pm  = 9
12:59am  12:01am  = 2
11:50am  12:00pm  = 11


13
이런 세상에! 두 개의 버튼을 누르면 내 (유럽) 알람 시계도 0:00으로 재설정됩니다 ... 버튼을 여러 번 누르는 데 소비 한 모든 시간 ... O_o
Arnauld

8
"군사 시간 (또는 대부분의 세계에서 정규 시간)"... 당신이 찾고있는 용어는 "24 시간"입니다.
Jakob

12
@Jakob 아니오, 그가 찾고있는 용어는 "정규 시간"입니다. 미국인들은 불규칙한 시간, 불규칙한 날짜, 불규칙한 단위 등을 사용합니다.
Neil

1
@StepHen 저는 영국에 있으며 Jakob이 설명 할 때까지 "군사적 시간"이 무엇을 의미하는지 전혀 몰랐습니다. 24 시간은 제게 완벽합니다
대런 H

답변:


5

껍질 , 16 바이트

§▼ṁ→(Σz%e24 60z-

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

인수를 시작 및 종료 시간에 대해 24 시간 형식으로 두 개의 목록 [시간, 분]으로 취합니다.

이 골프를 얼마나 많이 할 수 있었는지에 대해 매우 기쁩니다.이 함수 구성에서 인수가 어떻게 관리되는지 흥미로운 것을 발견했습니다.

재설정이 허용되지 않은 경우 필요한 키 누름 수를 계산하는 기능은 다음과 같습니다.

Σz%e24 60z-
         z-    elementwise subtract the two times
 z%e24 60      take the hours difference modulo 24 and the minutes difference modulo 60
Σ              sum the two resulting numbers

흥미로운 부분은이 솔루션의 나머지 부분이 단일 목록을 인수로만 사용할 수 있기 때문에 전체 프로그램의 첫 번째 인수에 부분적으로 적용되어이를 "먹고"두 번째 인수 만 볼 수 있다는 것입니다. 나머지 프로그램.

다음으로 시간을 0:00으로 재설정하면 필요한 키 누름 수를 계산합니다.

ṁ→    take the sum of each element of the list increased by 1

앞에서 말했듯이 이것은 두 번째 인수 (최종 시간)에서만 작동 hours+minutes+2하며 골퍼처럼 계산합니다 .

마지막으로 §▼두 번째 인수를 두 함수 모두에 전달하고 두 결과 중 작은 값을 반환하는 부분입니다.


8

자바 스크립트 (ES6), 73 56 54 52 50 바이트

24 시간 형식을 사용합니다. 각 시간의 시간 및 분을 나타내는 4 개의 정수로 입력을받습니다.

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)
  • Arnauld 덕분에 2 바이트가 절약되었습니다 .

시도 해봐

:구분 기호를 사용하여 24 시간 형식으로 시간을 입력하십시오 .

o.innerText=(f=

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)

)(+(x=(i.value="01:00").split`:`)[0],+x[1],+(y=(j.value="13:59").split`:`)[0],+y[1]);oninput=_=>o.innerText=f(+(x=i.value.split`:`)[0],+x[1],+(y=j.value.split`:`)[0],+y[1])
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>Current: </label><input id=i type=time><label for=j>Target: </label><input id=j type=time><pre id=o>


설명

(곧 업데이트 예정)

(g,l,h,m)=>

파라미터 통해 인수로서 정수를 복용 익명 함수 g, l, hm, 여기서, gl이고, 각각 시간 및 현재 시각의 분, h및는 m시간 및 대상 시간 분이다.

2+h+m

먼저 시계를 재설정하면 필요한 버튼 누름 횟수를 계산합니다. 간단히 2 (재설정의 경우)에 목표 시간과 목표 시간을 더한 것입니다.

h-g+24*(h<g)

다음으로 목표 시간에 도달하는 데 필요한 버튼 누름 수를 계산합니다. 목표 시간에서 현재 시간을 빼서이 작업을 수행합니다. 현재 시간이 적은 목표보다 긴 경우 우리는 경우 확인을 곱한 24 추가하여 그것을 해결할 수 있도록하지만, 이것은 우리에게 부정적인 번호를 줄 것이다 h<g부울을 반환하지만 암시 적으로 정수로 캐스팅되는 ( 1true의 경우, 또는 0false의 경우는에 의해를 수학 연산.

+m-l+60*(m<l)

유사한 공식을 사용하여 현재 분에서 목표 분으로가는 프레스 수를 계산하고이를 시간 프레스에 추가합니다.

Math.min()

마지막으로 결과를 제공하기 위해 최소 2 개의 숫자를 얻습니다.


1
당신은 할 수 (h-g+24)%24+(m-l+60)%60있습니까?
Arnauld

7

Pyth , 29 바이트

이 도전은 분명히 골프 언어에 유리하지 않기 때문에 너무 길다. 반면에, Pyth가 Python 기반이라는 사실로 인해 개선되었으므로 음의 계수를 남용 할 수 있습니다.

hS,+%-eQ@Q1 60%-@Q2hQ24+2s>Q2

테스트 스위트. Pyth의 숫자는 선행 0을 지원하지 않습니다.



3

C # (. NET 코어) , 56 바이트

(H,M,h,m)=>Math.Min(((h+24-H)%24)+((m+60-M)%60),(2+h+m))

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

Javascript 답변과 매우 유사합니다. C #에서 Bools 그래서 대신 숫자로 쉽게 변환하지 않는 [diff]+24*(H<h)내가 한 ([diff]+24)%24효과적으로 같은 일을한다.


2+h+m-2 바이트 동안 괄호를 제거 할 수 있습니다 .
Kevin Cruijssen '

Java 8에서 답의 포트를 만들었 으며 더 많은 괄호를 제거하여 추가로 4 바이트를 골프화 할 수 있음을 알았습니다.(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
Kevin Cruijssen

1
당신은 그것을 만들 필요가 System.Math.Min없습니까?
LiefdeWen

3

하스켈, 41 바이트

(a#b)c d=min(a+b+2)$mod(a-c)24+mod(b-d)60

꽤 직설적 인. 24 시간을 사용하여 종료 시간, 종료 시간, 시작 시간, 시작 분 등 4 개의 인수로 입력을받습니다.


2

파이썬 3 , 43 바이트

lambda a,b,c,d:min((c-a)%24+(d-b)%60,2+c+d)

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

4 개의 정수 (시작-시간, 시작-분, 종료-시간, 종료-분)로 입력


@StepHen Whoops. 쉬운 수정.
HyperNeutrino

실패2 01 11 00 ? 대답에서 시간이 입력 AM인지 또는 PM입력으로 입력하지 않으면 어떻게 결정 합니까?
Mr. Xcoder

@ Mr.Xcoder; 13TIO를 사용하여 해당 입력을 얻 습니다. 정확합니다 (재설정 + 11 <9 + 59).
Shaggy

2
%파이썬에서 항상 양수를 반환 합니까 ?
Shaggy

4
@Shaggy 항상의 오른쪽 부호를 반환합니다 %. 1%24= 1, 1%-24= -23. 이 질문에 매우 도움이됩니다.
Stephen

2

자바 8, 54 50 바이트

(h,m,H,M)->Math.min((H-h+24)%24+(M-m+60)%60,H+M+2)

@ KamilDrakari 의 C # 답변 포트 ( 2 6 바이트 골프 후 ).

설명:

여기에서 시도하십시오.

(h,m,H,M)->       // Method with four integer parameter and integer return-type
  Math.min(       //  Return the lowest of the following two:
                  //   The hours:
   (H-h           //    Second hours - first hours inputs
       +24)       //    +24 so we won't have negative numbers
           %24    //    mod-24 to get the hours
   +              //   And add the minutes:
    (M-m          //    Second minutes - first minutes inputs
         +60)     //    +60 so we won't have negative numbers
             %60  //    mod-60 to get the minutes
    ,H+M          //  And compare it to the second hours + second minutes inputs
        +2)       //   +2 for the added +24 and +60 to get the positive modulo arguments

1

Perl 5 , 71 +2 (-ap) = 73 바이트

($w,$x,$y,$z)=@F;$_=($r=2+$y+$z)>($c=($y-$w+24)%24+($z-$x+60)%60)?$c:$r

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

24 시간 형식 (군사 시간)으로 공백, 구분 된 시작 시간, 종료 시간 (초)으로 구분하여 입력합니다. HH MM hh mm


1

망막 , 106 바이트

\d+
$*
 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2
(1*):(1* )\1(1{24})?
$2
(1*) (1*):\1(1{60})?
$2
(1+)#(?!\1)

\G1

온라인으로 사용해보십시오!링크에는 테스트 사례가 포함됩니다. 공백을 두 번 분리하여 정기적으로 24 시간 동안 현재 및 원하는 시간으로 입력을받습니다. 설명:

\d+
$*

단항으로 변환합니다.

 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2

이것은 두 가지 일을합니다. 원하는 시간과 분에 24 시간과 60 분을 추가하고 원래의 원하는 시간과 분의 합계에 2를 더합니다 (예 : 재설정을 사용하여 설정하기 위해 버튼을 누르는 횟수).

(1*):(1* )\1(1{24})?
$2

원하는 시간에서 현재 시간을 빼고 가능한 경우 추가 한 24를 빼십시오.

(1*) (1*):\1(1{60})?
$2

마찬가지로 분. 또한 두 결과를 더합니다.

(1+)#(?!\1)

현재 시간을 사용하여 설정할 프레스 수가 재설정을 사용하여 설정할 프레스 수보다 많으면 삭제하십시오.

\G1

나머지 첫 번째 숫자를 다시 십진수로 변환하십시오.

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