24時間の合計


21

0から141までの整数(両端を含む)を指定すると、その整数に時、分、秒の単位が加算される24時間すべてをリストします。

追加の規則

数字は、1桁ではなく、時間単位で追加されます。

たとえば、17:43:59を取る

17 + 43 + 59 = 119

覚えておいてください、それは追加される数字の例です実際には、119を入力すると、17:43:59が結果の1つになります。出力は、HH:MM:SSまたはH:MM:SSとして指定する必要があります。

また、可能な最大数は141で、23:59:59です。これはコードゴルフなので、最低額が勝ちます。試行錯誤は許されますが、これについてはもっと良い方法があるかもしれません。

編集:コード内の入力値の場所を指定してください。


3
プログラミングパズルとコードゴルフへようこそ!プラグインすることでソースコードの一部を作成することを意味する場合、通常は許可されません。一般的に、これらのデフォルトに固執するのは良い考えです。結果を文字列として表示する必要がありますか?その場合、どの形式が許可されますか?
デニス

入力数は正であることが保証されていますか?少なくとも1つの解決策はありますか?
XNOR

いくつかのことを明確化/回答するために、質問を少し編集しました。あなたの意図が私の変更と異なる場合は、それに合わせて自由に編集してください。
ジオビット16

1
私がそれをしたのは、それが(現実の世界で)与えられた時間を見る通常の方法だからです。13:4:7だと言う人はいませんが、5:10:3​​0はほとんど常に受け入れられます。変更されても問題はありません。
ジオビット16

3
「入力値がコードのどこにあるかを指定してください。」-入力を取得するためのPPCGの規則は、引数と他のいくつかのオプションを使用しています。Code Golfのデフォルト:メタの入出力メソッドを参照してください。
user2428118 16

回答:


8

ゼリー16 30 29 20バイト

正しい出力形式で!この回答のデバッグに協力してくれたデニスに感謝します。ゴルフの提案を歓迎します。オンラインでお試しください!

編集:正しい出力形式を使用して+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

Perl 6の62の 56バイト

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

すべての時間、分、秒の外積で可能なすべての組み合わせをチェックするだけです。


4

Python 3、91バイト

def f(n):
 for k in range(86400):t=k//3600,k//60%60,k%60;sum(t)==n!=print('%d:%02d:%02d'%t)

を使用してより短いソリューションがあります exec(Python 2)または再帰(Python 3)、両方とも不合理な量のメモリを必要とします。

オンラインでお試しください!


4

PowerShell87 77バイト

John L. Bevanのおかげで10バイト節約

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

オンラインでお試しください!(これはタイムアウトになります、非常に遅いです)

説明

現在のから始めて、[datetime]86,399回1秒を追加し、文字列としてフォーマットし、合計が加算されたものだけを保持します。


FYI:あなたは置き換えることができる10000000との1e7l4つのバイトを保存するために...、あるいは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

Haskell、77バイト

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

2

Haskell、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%

1桁の時間を出力します。


2

Mathematica、79バイト

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


1

QBIC82 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に感謝します...もしそうだとしたら、ブリアンティストのクリーンバージョンよりも少ないキャラクターで私の厄介なバージョンを動作させる良い方法を見つけることができません...この答えを削除したいと思いますが、私は少し誇りに思っています悪いことです;)
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

JavaScript、 122 120バイト

入力として追加の空の文字列を1つ受け取り、 私はサイズにカウントされないと思います文字列の初期化に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完了。··
user2428118

0

JavaScript(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

JavaScript、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で除算して整数を時間に変換し、最初の桁を取得します
  • 整数mod 3600を取得し、60で割ることにより、2桁目
  • そして最後の桁は整数mod 60です

入力値から3つの数字をすべて減算して、3つの数字が入力値に達するとfalsey値を返します。値が偽の場合、値を出力します。


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を使用してそれらをbase 60に変換することです。dcのbase-60出力の「数字」は00から59までの2桁の数字です。これは、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倍数を取得し、最後の3つの数値を加算して、引数$ 1を減算します。それが0の場合、3番目の文字から4倍のすべてを取り出し(「01」を捨てる)、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, $_
        }
    }
}

注意:@Briantistのバージョンを上回る:https ://codegolf.stackexchange.com/a/105163/6776

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.