운명의 시계 바늘


9

당신은 의자에 묶여 있습니다. 그 아래에는 거대한 화산이 있습니다. 옆에있는 12 시간의 시계는 불길하게 똑딱 거리며, 뒤에서 체인으로 이어지는 전선이있어서 지구의 중심으로 떨어질 것입니다. 시계에 녹화 된 메모는 다음과 같습니다.

각 시계 바늘에는 전극이 있습니다. 두 시계 바늘이 같은 위치에 있으면 전원이 흐르고 죽습니다. 즉, 정확한 시간을 알려줄 수 없다면 가장 가까운 시간까지 말입니다.

모든 프로그래밍 언어를 알고있는 컴퓨터가 있습니다. 가장 짧은 것을 만들어야합니다 (이것은, 표준 허점 은 금지되어 있습니다. 프로그램은 시간과 분으로 구성된 모든 방법으로 입력해야합니다. 다음 시간과 분 (어떤 방법 으로든)이 발생하면이를 반환해야합니다.

OEIS 페이지 에 따르면 11 개의 중복 시간은 다음과 같습니다.

00:00:00 plus 0/11 s, 01:05:27 plus 3/11 s,
02:10:54 plus 6/11 s, 03:16:21 plus 9/11 s,
04:21:49 plus 1/11 s, 05:27:16 plus 4/11 s,
06:32:43 plus 7/11 s, 07:38:10 plus 10/11 s,
08:43:38 plus 2/11 s, 09:49:05 plus 5/11 s,
10:54:32 plus 8/11 s.

다음 시간은 12:00:00입니다. 이 과제에는 초와 소수 부분이 필요하지 않습니다. 가장 가까운 분으로 반올림하십시오.

테스트 사례 :

0:00 (Or 12:00) > 1:05
1:00 > 1:05
11:56 > 12:00 (Or 0:00)
6:45 > 7:38
5:00 > 5:27
6:30 > 6:33 (round up)

프로그램은 기능 또는 전체 프로그램 일 수 있습니다. 당신이 선택하면 난 상관 없어 0:0012:00, 둘 다 허용됩니다. 행운을 빕니다!


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Mego

답변:


6

JavaScript (Node.js) , 54 47 바이트 (가장 가까운 반올림)

-7 바이트 감사합니다 @ user202729

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60+.5|0]

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


JavaScript (Node.js) , 40 33 44 바이트 (0으로 반올림)

@Arnauld 덕분에 -3 바이트

@Kevin Cruijssen 덕분에 -4 바이트

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60|0]

설명

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60|0]    Full Code
a                                               Hours
   b                                            Minutes
    =>[                    ,               ]    return array with
       (a+=        )                            add to the current hour
           b>5.46*a                             1 if the minute's clock hand has 
                                                passed the hour's clock hand. Here we use
                                                equation 60*a/11 which is the same as 5.46*a
                    +a/11                       and add 1 when hour is 11
                         |0                     floor the result

                            a%12*65.46%60|0     Here we do equation ((720/11)*a) (mod 60)
                            a%12                In case of hour 12 we take 0
                                *65.46          multiply hour by 720/11 which can be shortened to
                                                65.46 to save 1 byte.
                                      %60       mod 60
                                         |0     floor the result

참고 : 수학에 대한 지식이 많은 사람이 골프를 치를 수 있다고 확신합니다. 합계와 곱하는 법을 거의 알지 못합니다.

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


실제 시계가 작동하는 방식을 취하면 올바르게 보이지 않습니다. datagenetics.com/blog/november12016/index.html
Night2

반올림 오류가 있습니다. 05:00SHOULD 출력 05:27하지만, 출력 05:25대신, 및 06:45출력해야 07:38하지만 출력 07:35대신. 여기 아마도 유용한 oeis 시퀀스가 ​​있습니다 : A178181
Kevin Cruijssen

1
@LuisfelipeDejesusMunoz 내가 준 두 가지 테스트 사례는 실제로 정확하지만 (또는 ) 대신 11:56출력되는 것 같습니다 . 00:0500:0012:00
Kevin Cruijssen

@KevinCruijssen 님. 나는 a=(a+=b>=a*5)%12조금 짧아 질 수 있다고 생각 하지만 나는 이것에 너무 좋지 않다
Luis felipe De jesus Munoz

1
아닌가요 Math.round(x)단지 0|x+.5?
user202729

5

J , 31 바이트

0.5<.@+>:@<.&.(11r720*12 60&#.)

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

J에서 숫자를 반올림하는 방법 0.5은 바닥 을 추가 하고 취하는 것입니다 ( <.). 너무 많은 바이트를 사용합니다 ...


설명

12 60&#. (혼합 기본 변환)은 [시간, 분]의 배열에서 0:00 이후로 전달 된 분으로 변환합니다.

12/11 시간 (즉, 720/11 분)마다 0:00부터 시작하여 두 손이 한 번 겹칩니다.

따라서 분 값이 주어지면 720/11의 가장 가까운 배수 (자체와는 다름)로 반올림하십시오. 이것은 *11/720 (J는 합리적인 숫자 리터럴을 가짐)에 의해 달성 될 수 있고 11r720, 바닥 을 잡고 <., 증가 >:시킨 다음 720/11을 곱합니다.

"11/720으로 곱하기"및 "720/11로 곱하기"는 "[시간, 분]에서 통과 한 분 수로의 변환"뿐만 아니라 반대의 2 가지 동작입니다. 다행스럽게도 J에는 기본 제공 기능이 &.있으며 변환을 적용한 후 일부 작업을 취소합니다.

0.5 +그런 다음 반올림을 수행하십시오 <..


5

R , 68 바이트

a=round(1:30*720/11);a[a>sum(scan()*c(60,1))][1]%/%c(60,1)%%c(12,60)

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

  • 주세페 덕분에 -2 바이트
  • 반올림 누락으로 인해 +7 바이트 :(

방정식을 활용 :

same_position_minutes = 720/11 * index

여기서 index첫 번째 겹치는 위치 (00:00)의 경우 0이고 두 번째의 경우 1입니다.


1
주변에 괄호가없는 것 같습니다(a[...]...c(60,1))
Giuseppe

@ 주세페 : 네, 그렇습니다 ... 감사합니다!
digEmAll

@digEmAll 이것은 잘못된 답변을 제공합니다 6:30 > 6:33.
mbomb007

@ mbomb007 : 당신이 맞아 고정;)
digEmAll

4

R , 88 바이트

i=scan();d=1+60*i[1]+i[2];while(abs(60*(h=d%/%60%%12)-11*(m=d%%60))>5){d=d+1};paste(h,m)

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

1 분씩 시간을 늘리십시오. 각도를 확인합니다. 충분히 닫히지 않으면 솔루션을 찾을 때까지 반복됩니다.


1
허, 그건 멋진 방법입니다. 나는 실제 시계를 시뮬레이션 생각하지 않았습니다!
Redwolf 프로그램 1


2

자바 8, 89 82 바이트

(h,m)->(m=m<(m=(int)(h%12*720d/11%60))?m:(int)(++h%12*720d/11%60))*0+h%12%11+" "+m

결정된. 나중에 골프를 칠 수 있는지 알 수 있습니다 (아마도 다른 답변을 이식하여) ..

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

설명:

할 것


포팅 한 답변과 같은 문제 (분명히) – 예 : f.apply(56).apply(10)수익률11 59
Jonathan Allan

@JonathanAllan 고정. 나중에 약간의 바이트를 제거 할 수 있는지 알 수 있습니다.
Kevin Cruijssen

@KevinCruijssen 이것은 잘못된 답변을 제공합니다 6:30 > 6:33.
mbomb007

@ mbomb007 알고 있습니다. OP를 수정하기 전에 OP의 응답을 기다리고 있습니다. 바닥, 라운드, 천장 또는 둘 다 허용되는지 여부 (챌린지를 게시 한 경우 네 번째 옵션을 사용하지만 먼저 OP를 기다립니다).
Kevin Cruijssen

@KevinCruijssen OP의견 때문에 테스트 케이스가 질문에 편집되었습니다 . round 의 가장 일반적인 정의를 사용하면 OP의 의도가 분명합니다.
mbomb007

2

Apl (Dyalog Unicode) , 28 바이트

((⍳11),⍪0,+\∊5/⊂5 6)(⍸⌷1⊖⊣)⎕

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


설명

((⍳11),⍪0,+\∊5/⊂5 6)(tio 링크의 끝에 인쇄 된) 손이 겹치는 시간의 매트릭스는
(⍸⌷1⊖⊣)⎕입력이 매트릭스에있는 간격과 그 아래에있는 인덱스를 찾는 간격입니다.


2

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

(h,m)=>{h%=12;int n=(5*h+h/2)%60;return (m>n||h>10)?f(h+1,0):h+":"+n;}

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

모든 테스트 사례를 통과했다고 생각합니다. h = 11의 경우는 추악하지만

설명:

(h,m)=>{ // Lambda receiving 2 integers
    h%=12; // Just to get rid of the 0/12 case
    int n=(5*h+h/2)%60; // get the minute at which the hands overlap 
                        //for current hour.
    return 
    (m>n||h>10)? // if current minute > n or h=11
        f(h+1,0) // it will happen next hour
    :
        h+":"+n; // return result
}

이것은에 대한 잘못된 답변을 제공합니다 6:30 > 6:33.
mbomb007

@ mbomb007 감사합니다. 이것에 대해 살펴 보겠습니다. 전체 중첩 시간 목록이 추가되기 전에 첫 번째 시도를했습니다.
F.Carette

이제 괜찮을거야. currentTime == duplicateTime 인 경우 수행 할 작업에 대한 명확한 지침이 없으므로이 경우 현재 시간을 반환합니다 ( '2:11'이 아닌 '1 : 5'를 반환 함) .
F.Carette

1

자바 스크립트, 41 바이트

p=>q=>(p+=q>=(5.5*p|0),p%=11,[p,5.5*p|0])



0

펄 6 , 43 바이트

(* *60+*+33).round(65.45).round.polymod(60)

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

시간과 분을 나타내는 두 개의 정수를 가져 와서 시간과 분을 역순으로 반환하는 익명 Whatever 람다. 정렬 된 시간을 입력 할 때 다음 정렬 된 시간을 출력하든 같은 시간을 유지하든 현재는 일관성이 없습니다. OP가 그 문제에 응답하기를 기다리고 있지만 지금은 정의되지 않은 것으로 취급하고 있습니다.

설명

(* *60+*+33)   # Converts the two inputs to number of minutes
            .round(65.45)   # Round to the nearest multiple of 65.45
                         .round  # Round to the nearest integer
                               .polymod(60) # Repeatedly modulo by 60 and return the list of results
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.