바보 같은 낡은 알람 시계 시뮬레이션


25

나는 두 개의 버튼이있는 바보 같은 오래 된 알람 시계를 가지고 hourminute. hour버튼 설정된 알람 시간을 증가하고, minute설정된 알람의 분 시간이 증가합니다. 그러나 일부 스마트 디자이너는 동시에 두 버튼을 누르면 의미를 가질 것을 깨달았다 눌러 결정 hourminute동시에하면 알람이 설정되도록 할 것입니다 12:00 am/ 0:00. 당신의 임무는이 동작을 시뮬레이션하는 것입니다.

태스크

시작 시간과 일련의 버튼 상태가 주어지면 종료 시간을 알아냅니다.

시작 시간부터 시작 발생할 때마다 시간을 증가 (1,0), 각각의 발생에 대한 분을 증가 (0,1)하고, 시간을 설정 0:00나타난 각 (1,1). (0,0)어떤 버튼도 누르지 않기 때문에 상태 는 무시해야합니다.

분과 시간에 더할 때 분 / 시간이 최대 값을 초과하면로 설정하십시오 0. 즉, 분 값을 증분으로 59설정하고 분 값을 0증분으로 23설정하고 시간 값을 증분하면 시간 값을로 설정해야합니다 0. 자신의 한계의 분 / 시간 값을 증가 시켜도의 분 증가, 예를 들어, 다른 값에 영향을 미치지 않습니다 10:59수율을 10:00하지 11:00.

입력 시간이 주어 13:58및 단계를 [(0,1),(0,1),(0,1),(0,0),(1,1),(1,0)],

  1. (0,1). 이것은 minute누르는 것에 해당합니다 . 시간은 지금 13:59이다.
  2. (0,1). 이것은 minute누르는 것에 해당합니다 . 시간은 지금 13:00이다.
  3. (0,1). 이것은 minute누르는 것에 해당합니다 . 시간은 지금 13:01이다.
  4. (0,0). 이것은 어느 버튼도 누르지 않는 것에 해당합니다. 영향을받지 않은 시간은 이제13:01
  5. (1,1). 이것은 두 버튼을 모두 누르는 것에 해당합니다. 시간은 지금 0:00이다.
  6. (1,0)이것은 hour누르는 것에 해당합니다 . 시간은 지금 1:00이다.

로 끝나기 때문에 1:00출력입니다.

I / O

입력은 시간과 일련의 버튼 상태로 구성됩니다. 출력은 한 번입니다.

입력 시간과 출력 시간은

  • 2의 튜플 (hour, minute)또는 (minute, hour)에서 24와 같은 -hour 시간 (13, 30)( hour범위 023minute범위 059)
  • 그러나 이전에 동일한 12-hour 시간 부울 am/ pm스위치 ( hour범위 011하거나 12111minute0까지 59).
  • 0:00810 이후부터 몇 분 (0에서 1439까지 포함)
  • 동일한 정보를 인코딩하는 다른 형식

버튼 상태 순서는 예를 들어 부울 2 튜플 목록을 나타냅니다.

  • 튜플 목록 : [(0,1),(1,0),(0,0),(1,1)]
  • 공백으로 구분 된 문자열 : "01 10 00 11"
  • 문자열 : "01100011"
  • 4 기 : [1,2,0,3]
  • 정수로 변환 : 99
  • 동일한 정보를 인코딩하는 다른 형식

테스트 사례

time,steps -> output
06:49,[(0, 1)] -> 06:50
12:23,[(1, 0)] -> 13:23
02:23,[(0, 1), (1, 0)] -> 03:24
21:40,[(0, 1), (0, 1), (0, 1), (0, 1)] -> 21:44
13:10,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (1, 1), (0, 1), (0, 1)] -> 00:02
21:33,[(1, 0), (0, 1), (1, 0), (0, 1)] -> 23:35
14:21,[(0, 1), (0, 1), (0, 1)] -> 14:24
02:39,[(0, 0), (0, 1)] -> 02:40
16:07,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1)] -> 19:16
17:55,[(0, 1), (1, 0), (0, 1)] -> 18:57
15:55,[(1, 0), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0)] -> 23:00
22:11,[(0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1)] -> 00:19
03:58,[(1, 0), (0, 0), (0, 0), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1)] -> 07:03
13:02,[(0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0)] -> 16:06
04:37,[(1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (1, 0)] -> 08:47
00:01,[(0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1)] -> 03:08
02:58,[(1, 0), (1, 0), (0, 1)] -> 04:59
01:43,[(0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1)] -> 04:52
07:54,[(1, 0), (0, 1), (1, 0), (1, 0), (1, 1)] -> 00:00
09:33,[(0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1)] -> 10:38
09:01,[(0, 1), (0, 1)] -> 09:03
19:04,[(0, 1), (1, 0), (0, 1), (1, 0)] -> 21:06
11:17,[(0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (1, 1), (0, 1), (0, 1)] -> 00:02
19:32,[(0, 1), (1, 0), (0, 1), (1, 0), (1, 0), (1, 0)] -> 23:34
17:31,[(0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 0), (1, 1), (0, 1)] -> 00:01
06:46,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1)] -> 18:16



하나의 목록으로 두 데이터 세트의 입력 형식이 허용됩니까? 예를 들어 [[initialHour, initialMinute], [hourPressed1, minuitePressed1], [hourPressed2, minuitePressed2], ...]?
Jonathan Allan

@JonathanAllan 예.
fireflame241

1200am은 정상적인 디지털 시간에서 무엇을 의미합니까?
Ferrybig

답변:


8

젤리 , 13 바이트

_`+Ạ}?/%24,60

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


OP 상태가 "버튼 상태 시퀀스는 목록의 표현"이기 때문에 계속해서 입력 형식을 사용할 수 있는지 확실하지 않습니다.
Jonathan Allan

@JonathanAllan 그래서 다음 OP는 내 대답에 대해 언급 할 경우,하지만 난 당신이 당신의 코멘트에 사용되는 정확한 형식을 사용하고 ... 때로는 영업 이익은 게으른 것을 또는 도전 업데이트하는 것을 잊었다
에릭 Outgolfer


6

젤리 ,  21  (17?) 19 바이트

17 바이트? -입력 형식 [[initHour, initMinute], [a1, b1], [a2, b2], ...]이 허용되는 경우 모나 딕 링크 W;가 있고 두 번째 줄의 시작 부분에서 제거 될 수 있습니다 .

참고 : 이것은 이제 Erik Out Outferfers Jelly 답변 으로 수렴하고 있으므로 골프를 더 이상 귀찮게하지 않을 것입니다 (보지 못했습니다) ...

N⁹⁹Ạ¤?+⁸
W;ç/%24,60

정수로 초기 시간의 목록을 복용 이항 링크를 [hour, minute]왼쪽 (24 시간)과 버튼 상태의 목록 [[hourPressed, minPressed], ...]오른쪽에
다시 정수로 최종 결과 시간의 목록을 반환 [hour, minute](24 시간).

온라인으로 사용해보십시오! 또는 시험 스위트를 참조하십시오

방법?

N⁹⁹Ạ¤?+⁸ - Link 1, nextState: list, currentState [cH, cM]; list, presses [pH, pM]
     ?   - if:
    ¤    - ...condition: nilad followed by link(s) as a nilad:
  ⁹      -   chain's right argument, presses
   Ạ     -   all truthy? (1 for [1,1] 0 otherwise)
N        - ...then: negate (the left argument, currentState, i.e. [-cH, -cM])
 ⁹       - ...else: chain's right argument, presses
       ⁸ - chain's left argument, currentState
      +  - add
           i.e.: if presses was [1,1] then [cH+-cH,cM+-cM]=[0,0]
                 otherwise [cH+pH,cM+cM]

W;ç/%24,60
     24,60 - literal list of integers [24,60]
    %      - modulo by (vectorises)

로 교체 ⁹Ạ¤하여 -1 바이트Ạ} . 허용되는 형식을 사용하기위한 또 다른 -2 입니다. 마지막으로, 다른 -1 전과 체인 때문에 µ여기에 ..은 다이 애드로 불린다
에릭 Outgolfer

6

파이썬 2 , 84 75 바이트

lambda c,a:reduce(lambda(h,m),(d,e):(d&e)and(0,0)or((h+d)%24,(m+e)%60),a,c)

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

튜플 (시간, 분)로 시간이 걸리는 기능; 같은 방식으로 출력합니다.


all(b)대신 다음을 사용하여 -3 바이트 b[0]&b[1]:lambda c,a:reduce(lambda t,b:all(b)and((t[0]+b[0])%24,(t[1]+b[1])%60)or(0,0),a,c)
Erik the Outgolfer


lambda(h,m),(d,e):이 패턴이 파이썬에서 일치합니까?!
Quelklef

5

망막 , 75 바이트

.*,1:1
:
\d+
$*
O`\D1*
,

1>`:

+`1{24}:|:1{60}
:
(?<=^|:)1*
$.&
\b\d\b
0$&

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

.*,1:1
:

마지막 이중 버튼 누름을 포함하여 모든 것을 삭제하고 빈 시간으로 교체하십시오 (마지막 버튼 누름 인 경우).

\d+
$*

단항으로 변환합니다.

O`\D1*

분을 끝까지 정렬하십시오.

,

함께 시간을 추가하십시오.

1>`:

분을 함께 추가하되 시간은 별도로 유지하십시오.

+`1{24}:|:1{60}
:

적절하게 시간과 분 모듈로 24 또는 60을 줄입니다.

(?<=^|:)1*
$.&

십진수로 변환합니다.

\b\d\b
0$&

두 자리로 포맷하십시오.


4

파이썬 3 135 117 115 바이트

Jonathan Frech 덕분에 -20 바이트

def a(m,f):
 for b,c in f:
  if b&c:m=[0,0]
  elif b:m[0]=-~m[0]*(m[0]<23)
  elif c:m[1]=-~m[1]*(m[1]<59)
 return m

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

시간을 양식의 목록으로 사용합니다 [hour, minute].


당신은 대체 할 수 있습니다 (m[0]+1)-~m[0]if m[0]<23 else 0함께 *(m[0]<23).
Jonathan Frech

로 또한, bc부울 값은 항상, 당신은 대체 할 수 b+c>1와 함께 b&c.
Jonathan Frech

76 바이트 (주석 박스로 인해 TIO가 커져서 단축 된 링크)
Halvard Hummel


4

자바 스크립트 (ES6), 55 바이트

t=>a=>a.map(x=>x>2?t=[0,0]:t[x-1]++)&&[t[0]%60,t[1]%24]

배열 형식의 시작 시간 [min, hour]과 4 차 배열의 단계 와 함께 카레 구문으로 입력을 받습니다. 출력 시간은 입력 시간과 같은 형식입니다.

테스트 사례



3

펄 5 , 70 바이트

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

s/.*d/0:0/;/(.*):(\d+)/;printf"%02d:%02d",($1+y/c//)%24,($2+y/b//)%60

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

입력 형식

hh:mm,abcdabcdabcdaddccbbaa

어디에:

hh=start hour
mm=start minute
 a = (0, 0) = no buttons pressed
 b = (0, 1) = minute button pressed
 c = (1, 0) = hour button pressed
 d = (1, 1) = both buttons pressed

프레스들 사이의 공간 또는 다른 분리기는 중요하지 않다.

설명

s/.*d/0:0/;    # If both buttons were ever pressed, previous presses
               # don't matter.  Get rid of them and set start time to midnight.
/(.*):(\d+)/;  # Extract start hour and minute
printf"%02d:%02d",            # Output numbers with leading 0
($1+y/c//)%24,                # Take starting hour, add number of presses, remainder 24
($2+y/b//)%60                 # Take starting minute, add number of presses, remainder 24

3

스위프트 , 106 96 바이트

Xcoder 덕분에 -10

func x(m:(Int,Int),n:[(Int,Int)]){let i=n.reduce(m){($0.0+$1.0,$0.1+$1.1)};print(i.0%24,i.1%60)}

아이디어로 사용해보십시오!

함수는 초기 값과 튜플 배열을 사용하여 최종 시간을 반환합니다.


대신 STDOUT으로 인쇄하여 96 바이트 : func x(m:(Int,Int),n:[(Int,Int)]){let i=n.reduce(m){($0.0+$1.0,$0.1+$1.1)};print(i.0%24,i.1%60)}. 이것도 제거 typealias됩니다.
Mr. Xcoder

1
그건 그렇고, PPCG에 오신 것을 환영합니다! 놀라운 첫 번째 대답.
Mr. Xcoder

정말 감사합니다. 실제로 print ()를 먼저 사용했지만 다른 구현 간을 전환 한 후에 잊어 버렸습니다. 도와 주셔서 감사합니다.
Naresh

1

테라 핀 로고, 304 바이트

최적화되지 않았습니다. 많은 공간.

MAKE "M :B MAKE "H :A LABEL "L IF EMPTY? :I OP LIST :H :M MAKE "C FIRST :I IF AND ((ITEM 2 :C)=1) ((ITEM 1 :C) = 0) MAKE "M :M+1 IF :M=60 MAKE "M 0 IF AND ((ITEM 1 :C) = 1) ((ITEM 2 :C)=1 MAKE "M 0 MAKE "H 0 IF AND ((ITEM 1 :C)-1) ((ITEM 2 :C) = 0) MAKE "H :H + 1 IF :H = 23 MAKE "H 0 MAKE "I BF :I GO "L

목록을 첫 번째 입력으로, 시작 시간 + 분 (별도 입력)을 각각 두 번째 및 세 번째로 사용합니다.

시험판 버전이므로 Terrapin Logo에서 복사하거나 붙여 넣을 수 없습니다.


1

R , 61 바이트

function(I,B){for(b in B)I=I+"if"(sum(b)>1,-I,b)
I%%c(24,60)}

버튼 I의 길이 2 벡터 c(H,M)와 길이 2 벡터 B목록으로 사용합니다 c(H,M). 합계가이면 B설정 I을 반복합니다 . 그런 다음 끝에 수정됩니다. 버튼 테스트를 모두 테스트하려면 버튼 누름을 올바른 R 형식으로 변환하는 기능도 헤더에 있습니다. 배열 을 문자열로 사용합니다.c(0,0)2[(H,M),...]

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


1

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

(n,l)=>{for(int i=0,x;i<n.Length;){x=n[i++];if(x>1)l[0]=l[1]=0;else{l[x]=++l[x]%(24+36*x);}}}

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

0 == (1,0), 1 == (0,1), 2 == (1,1), 인덱스 0이 시간이고 1이 분인 배열의 시간을 기본으로 입력합니다. 시간 배열을 수정합니다.



0

수학, 54 바이트

Switch[#2,a={0,0},#,a+1,a,_,Mod[+##,{24,60}]]&~Fold~#&

익명의 기능. 2- 튜플 목록을 입력으로 사용하고 2- 튜플을 출력으로 반환합니다.


0

스칼라 , 116 바이트

시작 시간을 func ( hm) 의 첫 번째 두 매개 변수로 사용하고 입력 시퀀스를 Array [Tuple2]로 사용합니다.

var x=h
var y=m
for(u<-a)u match{case (0,1)=>y=(y+1)%60
case (1,0)=>x=(x+1)%24
case (1,1)=>{x=0;y=0}
case _=>}
(x,y)

나는 ... func 선언 def time(h:Int,m:Int,a:Array[Tuple2[Int,Int]]):Tuple2[Int,Int]={과 결말 }을 바이트 수로 세어야 합니까?

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

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