Jumlah waktu 24 jam


21

Dengan bilangan bulat antara 0 dan 141 (inklusif), cantumkan semua waktu 24 jam yang jamnya, menit, dan unit kedua ditambahkan ke bilangan bulat itu.

Aturan penambahan

Angka ditambahkan oleh unit waktu mereka, bukan oleh digit tunggal.

Misalnya, ambil 17:43:59

17 + 43 + 59 = 119

Ingat, itu adalah contoh angka yang ditambahkan. Pada kenyataannya, Anda akan memasuki 119, dan 17:43:59 akan menjadi salah satu hasilnya. Output harus diberikan sebagai HH: MM: SS atau H: MM: SS.

Perlu diingat juga bahwa angka tertinggi yang mungkin adalah 141, menjadi 23:59:59. Ini kode golf, jadi jumlah terendah yang menang. Trial and error diizinkan, tetapi mungkin ada cara yang lebih baik untuk melakukan ini.

Sunting: Silakan tentukan di mana dalam kode Anda nilai inputnya.


3
Selamat Datang di Programming Puzzles & Code Golf! Jika dengan menyumbat Anda berarti membuat bagian dari kode sumber, itu biasanya dilarang. Secara umum, itu ide yang baik untuk tetap berpegang pada default itu. Apakah kita harus menampilkan hasilnya sebagai string? Jika demikian, format apa yang diizinkan?
Dennis

Apakah nomor input dijamin positif? Akankah setidaknya ada satu solusi?
xnor

Saya telah mengedit sedikit pertanyaan untuk mengklarifikasi / menjawab beberapa hal. Jika maksud Anda berbeda dari perubahan saya, silakan mengeditnya agar sesuai dengan itu.
Geobits

1
Saya hanya melakukan itu karena itu cara biasa saya melihat waktu yang diberikan (di dunia nyata). Tidak ada yang pernah mengatakan itu 13: 4: 7, tetapi 5:10:30 hampir selalu dapat diterima. Saya tidak punya masalah dengan itu sedang diubah.
Geobit

3
"Silakan tentukan di mana dalam kode Anda nilai inputnya." - Konvensi PPCG untuk mengambil input menggunakan argumen, dan juga beberapa opsi lain. Lihat Default untuk Code Golf: Metode Input / Output di Meta.
user2428118

Jawaban:


8

Jelly , 16 30 29 20 byte

Sekarang dengan format output yang benar! Terima kasih banyak untuk Dennis atas bantuannya dalam men-debug jawaban ini. Saran golf diterima. Cobalah online!

Edit: +14 byte dari menggunakan format output yang benar. -1 byte dari menghapus ruang ekstra. -3 dari berubah dari 24,60,60menjadi “ð<<‘. -6 byte dari berubah +100DḊ€€menjadi d⁵.

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

Penjelasan

“ð<<‘Œ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

Bash, 71

  • 8 byte disimpan berkat @hvd
for t in {0..23}+{00..59}+{00..59};{((${t//+0/+}-$1))||echo ${t//+/:};}

Cobalah online .


1
printfmahal di sini. Dengan semakin tdekat ke format yang tepat, dan memperbaikinya untuk membuat ((t-$1))pekerjaan, Anda bisa turun ke 71:for t in {0..23}+{00..59}+{00..59};{((${t//+0/+}-$1))||echo ${t//+/:};}
hvd

@hvd Golf yang bagus - terima kasih!
Digital Trauma

6

Perl 6 , 62 56 byte

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

Cukup periksa semua kemungkinan kombinasi dalam produk silang dari semua jam, menit, dan detik.


4

Python 3 , 91 byte

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

Ada solusi yang lebih pendek menggunakan exec(Python 2) atau rekursi (Python 3), tetapi keduanya membutuhkan jumlah memori yang tidak masuk akal.

Cobalah online!


4

PowerShell , 87 77 byte

Disimpan 10 byte berkat John L. Bevan

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

Cobalah online! (Ini akan waktu, sangat lambat)

Penjelasan

Cukup sederhana, dimulai dengan yang sekarang [datetime], tambahkan 1 detik 86.399 kali, format sebagai string, kemudian simpan hanya yang jumlahnya bertambah.


FYI: Anda dapat mengganti 10000000dengan 1e7luntuk menyimpan 4 byte ... atau bahkan 1e7untuk byte tambahan (saya pikir; saya harus memasukkan Luntuk manfaat parameter; tetapi curiga pendekatan Anda menghindari kebutuhan itu.
JohnLBevan

1
@ JohnLBevan terima kasih! Saya berjuang dengan 1e7selama setidaknya 30 menit, dan itu adalah Lpostfix yang saya lewatkan; Saya lupa tentang hal itu dan tidak bisa menemukan cara untuk mendapatkannya ke int yang lebih pendek dari konstanta. Yang memutuskan bahwa bahwa [timespan]menafsirkan suatu [int]sebagai kutu dan [double]sebagai hari sih ?? The iexbit cukup brilian, meskipun itu membuat semua ini inordinately lebih lambat.
briantist

1
Jangan khawatir; Saya mendapat bantuan untuk hal itu juga;): stackoverflow.com/q/41408902/361842
JohnLBevan

1
@ JohnLBevan Saya benar - benar baru saja melihat pertanyaan ini sebelum komentar di mana Anda menautkannya! Bagus.
briantis

1
Juga iextrik diadaptasi dari tip di sini: codegolf.stackexchange.com/a/746/6776
JohnLBevan

3

Haskell, 77 byte

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

2

Haskell, 90 byte

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]

Mengembalikan daftar HH: MM: SS strings, eg f 140->["22:59:59","23:58:59","23:59:58"] .

Ini tiga loop sederhana melalui jam, menit, dan detik. Simpan dan format semua nilai di mana jumlah adalah nomor input x.


2

Pyth - 30 byte

Mengambil semua waktu yang mungkin lalu memfilter.

mj\:%L"%02d"dfqsTQsM*U24*KU60K

Test Suite .



2

Batch, 168 byte

@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%

Menghasilkan jam satu digit.


2

Mathematica, 79 byte

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


1

QBIC , 82 72 byte

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

Ini mengenai tempat yang tidak menguntungkan di QBasic, dengan casting ke nomor, pemangkasan dan prabayar 0ketika diperlukan benar-benar mahal.

Output sampel:

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

Penjelasan saya menulis sebuah novel tentang itu:

:           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 terlihat menarik. Apakah Anda membuatnya hanya untuk # code-golf !? :)
wasatchwizard

@wasatchwizard Yup :-)
steenbergh

1

PowerShell , 67 79 Bytes (versi jahat)

Karena aturan tidak mengatakan apa pun tentang menyelesaikan dalam waktu tertentu (atau sama sekali), dan tidak ada tentang tidak ada duplikat, inilah solusi yang mengerikan:

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

1
Saya tidak dapat menemukan pos meta yang relevan, tetapi saya cukup yakin bahwa kiriman harus dihentikan agar valid, kecuali ditentukan oleh tantangan
Sefa

Terima kasih @Sefa ... jika itu masalahnya saya tidak dapat menemukan cara yang bagus untuk membuat versi jahat saya bekerja dalam karakter kurang dari versi bersih Briantist ... Tergoda untuk menghapus jawaban ini, tapi saya agak bangga dengan caranya buruk;)
JohnLBevan

0

Racket 39 byte

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

Tidak Disatukan:

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

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

Cobalah online!

Penjelasan

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 byte

Mengambil satu string kosong tambahan sebagai input, yang saya kira tidak diperhitungkan ukurannya. Bytecount yang diperbarui (termasuk histori) untuk menambahkan dua byte untuk inisialisasi string.

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:",""))(""))


Jika Anda perlu menginisialisasi string menjadi kosong, inisialisasi harus dihitung
edc65

@ edc65 Selesai. ···
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")

Kurang golf

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
}

Uji

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 byte

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)}}

Tampilan yang diperluas:

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)
    }
}

Loop melalui semua waktu yang mungkin dengan mengulang 86399 ke 1,

  • konversi integer ke waktu dengan membaginya dengan 3600 untuk mendapatkan digit pertama
  • digit ke-2 dengan mengambil integer mod 3600 dan kemudian membaginya dengan 60
  • dan digit terakhir adalah integer mod 60

Kurangi semua 3 angka dari nilai input untuk mengembalikan nilai falsey jika ketiga angka tersebut menambah hingga nilai input. Jika nilainya falsey, output nilainya.


0

bash, 78 byte (menggunakan utilitas BSD) atau 79 byte (non-BSD juga)

Ini sedikit lebih lama dari solusi bash 71-byte @DigitalTrauma dan @ hvd yang bagus, tapi saya agak menyukai gagasan di sini untuk menggunakan angka-angka pada basis 60; Saya ingin tahu apakah ada yang bisa memainkan golf ini sedikit lagi.

Dengan utilitas catatan standar BSD:

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

Dengan utilitas seq yang lebih universal tersedia:

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

Idenya adalah untuk menghasilkan angka-angka dari 0 hingga 83699 dan menggunakan dc untuk mengubahnya menjadi basis 60. "Digit" dalam output basis-60 dc adalah angka 2 digit dari 00 hingga 59, dengan spasi memisahkan "digit", jadi ini mencantumkan semua waktu yang diinginkan dari 00 00 00 hingga 23 59 59 dalam hampir format yang diperlukan.

Namun, jika Anda benar-benar melaksanakannya, angka-angka di bawah 60 ^ 2 bukan angka 3-digit pada basis 60, sehingga awal 00 atau 00 00 hilang. Untuk alasan itu, saya benar-benar menghasilkan angka dari 60 ^ 3 hingga 60 ^ 3 + 83699; ini memastikan bahwa semua angka yang dihasilkan tepat 4 digit panjangnya di basis 60. Ini OK selama saya akhirnya membuang digit pertama tambahan (01) yang tidak diperlukan.

Jadi, setelah waktu yang diinginkan dihasilkan, saya hanya mengambil empat kali lipat dari 01 00 00 00 hingga 01 23 59 59, tambahkan tiga angka terakhir dan kurangi argumen $ 1. Jika itu 0, saya kemudian mengambil semuanya dalam quadruple dari karakter ke-3 (membuang "01"), gunakan tr untuk mengonversi spasi menjadi titik dua, dan mencetak hasilnya.


0

PowerShell , 91 97 byte (termasuk input)

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,$_}}}

atau

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

Diperluas & dikomentari

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: Dilampaui oleh versi @ Briantist: /codegolf//a/105163/6776

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.