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 번을 문자열로 형식화 한 다음 합계가 더해지는 형식 만 유지하십시오.


참고 : 당신은 대체 할 수있는 10000000과 1e7l에 저장 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.