24 시간의 합


21

0에서 141 (포함) 사이의 정수가 주어지면 해당 시간에시, 분 및 초 단위가 추가되는 모든 24 시간 시간을 나열하십시오.

추가 규칙

숫자는 한 자리 숫자가 아닌 시간 단위로 추가됩니다.

예를 들어 17:43:59

17 + 43 + 59 = 119

이것이 숫자가 추가 되는 예임을 기억하십시오 . 실제로 119를 입력하면 17:43:59가 결과 중 하나입니다. 출력은 HH : MM : SS 또는 H : MM : SS로 제공되어야합니다.

또한 가장 높은 숫자는 141이며 23:59:59입니다. 이것은 코드 골프이므로 가장 적은 금액이 이깁니다. 시험 및 오류는 허용되지만 이에 대한 더 나은 방법이있을 수 있습니다.

편집 : 코드에서 입력 값의 위치를 ​​지정하십시오.


3
프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 전원 코드를 꽂아 소스 코드의 일부를 만든 경우 일반적으로 허용되지 않습니다. 일반적으로 이러한 기본값을 유지하는 것이 좋습니다. 결과를 문자열로 표시해야합니까? 그렇다면 어떤 형식이 허용됩니까?
Dennis

입력 번호가 양수로 보장됩니까? 하나 이상의 솔루션이 있습니까?
xnor

몇 가지 사항을 명확히 / 답변하기 위해 질문을 약간 편집했습니다. 당신의 의도가 나의 변화와 다른 경우, 그에 맞게 편집하십시오.
Geobits

1
나는 주어진 시간 (실제 세계에서)을 보는 일반적인 방법이기 때문에 그렇게했습니다. 아무도 13 : 4 : 7이라고 말한 적이 없지만 5:10:30은 거의 항상 허용됩니다. 변경되는 데 문제가 없습니다.
Geobits

3
"코드에서 입력 값의 위치를 ​​지정하십시오." -입력을 받기위한 PPCG의 규칙은 몇 가지 다른 옵션뿐만 아니라 인수도 사용합니다. 코드 골프의 기본값 : 메타의 입력 / 출력 방법 을 참조하십시오 .
user2428118

답변:


8

젤리 , 16 30 29 20 바이트

이제 올바른 출력 형식으로! 이 답변을 디버깅하는 데 도움을 준 Dennis에게 감사합니다. 골프 제안을 환영합니다. 온라인으로 사용해보십시오!

편집 : 올바른 출력 형식을 사용하여 +14 바이트. 여분의 공간을 제거하여 -1 바이트. -3에서 변화로부터 24,60,60“ð<<‘. -6 바이트가에서 (으)로 변경 +100DḊ€€되었습니다 d⁵.

“ð<<‘Œp’S=¥Ðfd⁵j€”:Y

설명

“ð<<‘Œp’S=¥Ðfd⁵j€”:Y  Main link. Argument: n

“ð<<‘                 Jelly ord() the string `ð<<` to get [24, 60, 60]. Call this list z.
     Œp               Cartesian product of z's items. 
                        Since each item of z is a literal,
                        Jelly takes the range [1 ... item] for each item.
       ’              Decrements every number in the Cartesian product 
                        to get lowered ranges [0 ... item-1].
        S=¥           Create a dyadic link of `sum is equal to (implicit n)`.
           Ðf         Filter the Cartesian product for items with sum equal to n.
             d⁵       By taking divmod 10 of every number in each item,
                        we get zero padding for single-digit numbers
                        and every double-digit number just turns into a list of its digits.
               j€”:   Join every number with a ':'.
                   Y  Join all of the times with linefeeds for easier reading.

8

배쉬, 71

  • @hvd 덕분에 8 바이트 절약
for t in {0..23}+{00..59}+{00..59};{((${t//+0/+}-$1))||echo ${t//+/:};}

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


1
printf여기에 비용이 많이 듭니다. t올바른 형식에 가까워 지고 ((t-$1))작동 하도록 수정하면 71로 줄일 수 있습니다.for t in {0..23}+{00..59}+{00..59};{((${t//+0/+}-$1))||echo ${t//+/:};}
hvd

@ hvd 좋은 골프-감사합니다!
디지털 외상

6

펄 6 , 62 56 바이트

{map *.fmt('%02d',':'),grep $_==*.sum,(^24 X ^60 X ^60)}

모든 시간, 분 및 초의 교차 곱에서 가능한 모든 조합을 확인하십시오.



4

PowerShell , 87 77 바이트

John L. Bevan 덕분에 10 바이트 절약

$d=date;0..86399|%{$d+=1e7l;"$d".Split()[1]}|?{("{0:H+m+s}"-f$d|iex)-in$args}

온라인으로 사용해보십시오! (이 시간이 초과되어 매우 느립니다)

설명

current로 시작하여 [datetime]1 초 86,399 번을 문자열로 형식화 한 다음 합계가 더해지는 형식 만 유지하십시오.


참고 : 당신은 대체 할 수있는 100000001e7l에 저장 4 바이트 ... 또는 1e7추가 바이트를 위해 (나는 생각한다, 나는 포함했다 L매개 변수의 이익을 위해, 당신의 접근을 피를하지만 의심 필요가 없다는 것을.
JohnLBevan

1
@JohnLBevan 감사합니다! 나는 1e7적어도 30 분 동안 어려움을 겪었고 그것은 L내가 놓친 접두사 였다 . 나는 그것을 잊어 버렸고 상수보다 짧은 int로 가져 오는 방법을 알 수 없었습니다. 누가 결정하는 그 [timespan]해석 [int]진드기 등과 [double]같은 어쨌든? iex가 지나치게 느린이 모든 일을하게하지만 비트는 꽤 훌륭합니다.
briantist

1
걱정 마; 나도 그것에 대한 도움이 있었다;) : stackoverflow.com/q/41408902/361842
JohnLBevan

1
@JohnLBevan 말 그대로 단지 당신이 그것을 링크 된 곳 코멘트하기 전에이 질문을 보았다! 좋은.
briantist

1
또한 iex트릭 여기 선단에서 적응되었다 codegolf.stackexchange.com/a/746/6776
JohnLBevan

3

하스켈, 77 바이트

f x=[tail$(':':).tail.show.(+100)=<<t|t<-mapM(\x->[0..x])[23,59,59],sum t==x]

2

하스켈, 90 바이트

p x=['0'|x<10]++show x
i=[0..59]
f x=[p h++':':p m++':':p s|h<-[0..23],m<-i,s<-i,h+m+s==x]

HH : MM : SS 문자열의 목록을 리턴합니다 (예 : f 140->) ["22:59:59","23:58:59","23:59:58"].

시간, 분 및 초를 통과하는 3 개의 간단한 루프입니다. 합계가 입력 번호 인 모든 값을 유지하고 형식을 지정하십시오 x.




2

배치, 168 바이트

@for /l %%t in (0,1,86399)do @call:c %1 %%t
@exit/b
:c
@set/ah=%2/3600,m=%2/60%%60,s=%2%%60,n=%1-h-m-s
@set m=0%m%
@set s=0%s%
@if %n%==0 echo %h%:%m:~-2%:%s:~-2%

한 자리 시간을 출력합니다.


2

수학, 79 바이트

Cases[Tuples@{(r=Range)@24-1,x=r@60-1,x},t_/;Tr@t==#:>DateString@TimeObject@t]&


1

QBIC , 82 72 바이트

:[0,23|[0,59|[0,59|~b+c+d=a|?!b$+@:`+right$(@0`+!c$,2)+A+right$(B+!d$,2)

이것은 QBasic에서 불행한 지점에 부딪친 다 0. 필요에 따라 캐스팅하고, 필요에 따라 트리밍하고 앞에 붙는 것은 비용이 많이 든다.

샘플 출력 :

Command line: 119
1:59:59
2:58:59
2:59:58
3:57:59
[... SNIP 270 lines ...]
23:58:38
23:59:37

설명 나는 그것에 대해 소설을 썼다 :

:           Get N, call it 'a'
[0,23|      Loop through the hours; this FOR loop is initialised with 2 parameters
            using a comma to separate FROM and TO, and a '|' to delimit the argument list
[0,59|      Same for the minutes
[0,59|      And the seconds
            QBIC automatically creates variables to use as loop-counters: 
            b, c, d (a was already taken by ':')
~b+c+d=a    IF a == b+c+d
|           THEN
 ?          PRINT
  !         CAST
   b        'b'
    $       To String; casting num to str in QBasic adds a space, this is trimmed in QBIC
+@:`        Create string A$, containing ":"
+right$      This is a QBasic function, but since it's all lowercase (and '$' is 
            not a function in QBIC) it remains unaltered in the resulting QBasic.
(@0`+!c$,2) Pad the minutes by prepending a 0, then taking the rightmost 2 characters.
+A          Remember that semicolon in A$? Add it again
+right$     Same for the seconds
(B+!d$,2)   Reusing the 0-string saves 2 bytes :-)

QBIC은 흥미로워 보입니다. # code-golf! 용으로 만 만들었습니까? :)
wasatchwizard

@wasatchwizard Yup :-)
steenbergh

1

PowerShell , 67 79 바이트 (불쾌한 버전)

규칙은 특정 시간 (또는 전혀)에 대해 완료에 대해 아무 것도 말하지 않고 중복되지 않는 것에 대해 아무 말도하지 않으므로 여기에 끔찍한 해결책이 있습니다.

for(){if(("{0:H+m+s}"-f($d=date)|iex)-in$args){"{0:H:mm:ss}"-f$d}}

1
관련 메타 게시물을 찾을 수 없지만, 챌린지에 의해 명시되지 않는 한 제출이 유효해야한다고 확신합니다.
Sefa

고마워 @Sefa ...이 경우 내 불쾌한 버전을 Briantist의 깨끗한 버전보다 적은 문자로 작동시킬 수있는 좋은 방법을 찾을 수 없습니다 ...이 답변을 삭제하고 싶은 유혹이 있지만 나쁘다;)
JohnLBevan

0

라켓 39 바이트

(for*/sum((h 24)(m 60)(s 60))(+ h m s))

언 골프 드 :

(for*/sum      ; loop for all combinations; return sum of values for each loop
   ((h 24)     ; h from 0 to 23
    (m 60)     ; m from 0 to 59
    (s 60))    ; s from 0 to 59
  (+ h m s))   ; sum of all 3 variables

0

MATL , 29 바이트

24:q60:qt&Z*t!si=Y)'%i:'8:)&V

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

설명

24:q     % Push [0 1 ... 23]
60:q     % Push [0 1 ... 59]
t        % Duplicate
&Z*      % Cartesian product of the three arrays. This gives a matrix with each
         % on a different row Cartesian tuple
t!       % Push a transposed copy
s        % Sum of each column
i=       % Logical mask of values that equal the input
Y)       % Select rows based on that mask
'%i:'    % Push this string
8:)      % Index (modularly) with [1 2 ... 8]: gives string '%i:%i:%i'
&V       % Convert to string with that format specification. Implicitly display

0

자바 스크립트, 122 120 바이트

빈 문자열 하나를 입력으로 사용합니다. 내가 생각하는 것은 크기에 포함되지 않습니다. 문자열 초기화를 위해 2 바이트를 추가하도록 바이트 수 (히스토리 포함)를 업데이트했습니다.

console.log((
//Submission starts at the next line
i=>o=>{for(h=24;h--;)for(m=60;m--;)for(s=60;s--;)if(h+m+s==i)o+=`${h}:0${m}:0${s} `;return o.replace(/0\d{2}/g,d=>+d)}
//End submission
)(prompt("Number:",""))(""))


문자열을 비워 초기화해야하는 경우 초기화를 계산해야합니다.
edc65

@ edc65 완료. ···
2428118

0

자바 스크립트 (ES6), 110

v=>eval("o=[];z=x=>':'+`0${x}`.slice(-2);for(m=60;m--;)for(s=60;s--;h>=0&h<24&&o.push(h+z(m)+z(s)))h=v-m-s;o")

덜 골프

v=>{
  o=[];
  z=x=>':' + `0${x}`.slice(-2);
  for(m = 60; m--;)
    for(s = 60; s--; )
      h = v - m - s,
      h >= 0 & h < 24 && o.push(h + z(m) + z(s))
  return o
}

테스트

F=
v=>eval("o=[];z=x=>':'+`0${x}`.slice(-2);for(m=60;m--;)for(s=60;s--;h>=0&h<24&&o.push(h+z(m)+z(s)))h=v-m-s;o")

function update() {
  O.textContent=F(+I.value).join`\n`
}

update()
<input id='I' value=119 type=number min=0 max=141 oninput='update()'><pre id=O></pre>


0

자바 스크립트, 96 바이트

v=>{for (i=86399;i;[a,b,c]=[i/3600|0,i%3600/60|0,i--%60]){v-a-b-c?0:console.log(a+":"+b+":"+c)}}

확장 된보기 :

v => {
    for (i = 86399; i;
        [a, b, c] = [i / 3600 | 0, i % 3600 / 60 | 0, i-- % 60]) {
        v - a - b - c ? 0 : console.log(a + ":" + b + ":" + c)
    }
}

86399를 1로 반복하여 가능한 모든 시간을 반복합니다.

  • 첫 자릿수를 얻기 위해 3600으로 나누어 정수를 시간으로 변환
  • 정수 모드 3600을 취한 다음 60으로 나누어 두 번째 숫자
  • 마지막 숫자는 정수 모드 60입니다.

입력 값에서 3 개의 숫자를 모두 빼면 입력 한 값에 3 개의 숫자가 더 해지면 잘못된 값을 반환합니다. 값이 거짓이면 값을 출력하십시오.


0

bash, 78 바이트 (BSD 유틸리티 사용) 또는 79 바이트 (비 BSD)

이것은 @DigitalTrauma 및 @hvd의 멋진 71 바이트 bash 솔루션보다 약간 길지만 기본 60에서 숫자를 사용하는 아이디어를 좋아했습니다. 누구든지 이것을 조금 더 아래로 내릴 수 있는지 궁금합니다.

BSD 표준 jot 유틸리티 사용 :

jot '-wx=`dc<<<60do3^%d+n`;((`dc<<<$x++'$1'-n`))||tr \  :<<<${x:3}' 86400 0|sh

보다 보편적으로 이용 가능한 seq 유틸리티를 사용하면 :

seq '-fx=`dc<<<60do3^%.f+n`;((`dc<<<$x++'$1'-n`))||tr \  :<<<${x:3}' 0 86399|sh

아이디어는 0에서 83699까지의 숫자를 생성하고 dc를 사용하여이를 60을 밑수로 변환하는 것입니다. dc의 base-60 출력에서 ​​"숫자"는 00에서 59까지의 두 자리 숫자이며 공백은 "숫자"로 구분됩니다. 이것은 00 00 00에서 23 59 59까지의 원하는 시간을 거의 필요한 형식으로 나열합니다.

그러나 문자 그대로 그것을 수행하면 60 ^ 2 미만의 숫자는 기본 60의 3 자리 숫자가 아니므로 초기 00 또는 00 00이 누락됩니다. 이런 이유로 실제로 60 ^ 3에서 60 ^ 3 + 83699까지의 숫자를 생성하고 있습니다. 이렇게하면 생성 된 모든 숫자가 60 자릿수에서 정확히 4 자리 길이가됩니다. 결국 필요하지 않은 여분의 첫 번째 숫자 (01)를 버리는 한 괜찮습니다.

따라서 원하는 시간이 생성되면 01 00 00 00에서 01 23 59 59까지 각 4 배를 취하고 마지막 세 숫자를 더하고 인수 $ 1을 뺍니다. 그 값이 0이면 3 번째 문자 ( "01"을 버림)에서 4 중의 모든 것을 취하고 tr을 사용하여 공백을 콜론으로 변환하고 결과를 인쇄합니다.


0

PowerShell , 91 97 바이트 (입력 포함)

param($x)1..864e3|%{($d=date($_*1e7l))}|?{("{0:H+m+s}"-f$_|iex)-eq$x}|%{"{0:H:mm:ss}"-f$_}

param($x)0..23|%{$h=$_;0..59|%{$m=$_;0..59|?{$h+$m+$_-eq$x}|%{"{0:0}:{1:00}:{2:00}"-f$h,$m,$_}}}

또는

param($x)0..23|%{$h=$_;0..59|?{($s=$x-$h-$_)-le59-and$s-ge0}|%{"{0:0}:{1:00}:{2:00}"-f$h,$_,$s}} <\ s>

확장 및 댓글 달기

param($x)
#loop through the hours
0..23 | %{
    $h=$_
    #loop through the minutes
    0..59 | %{
        $m=$_
        #loop through the seconds
        0..59 | ?{ #filter for those where the sum matches the target
            $h + $m + $_ -eq $x
        } | %{
            #format the result
            "{0:#0}:{1:00}:{2:00}" -f $h, $m, $_
        }
    }
}

NB : @Briantist 버전을 능가 : /codegolf//a/105163/6776

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