Tổng thời gian 24 giờ


21

Cho một số nguyên từ 0 đến 141 (đã bao gồm), liệt kê tất cả các thời gian 24 giờ có đơn vị giờ, phút và giây thêm vào số nguyên đó.

Quy tắc bổ sung

Các số được thêm theo đơn vị thời gian của chúng, không phải bằng các chữ số đơn.

Ví dụ: lấy 17:43:59

17 + 43 + 59 = 119

Hãy nhớ rằng, đó là một ví dụ về các chữ số được thêm vào. Trong thực tế, bạn sẽ nhập 119 và 17:43:59 sẽ là một trong những kết quả. Đầu ra phải được đưa ra là HH: MM: SS hoặc H: MM: SS.

Ngoài ra, hãy nhớ rằng con số cao nhất có thể là 141, là 23:59:59. Đây là mã golf, vì vậy số tiền thấp nhất sẽ thắng. Thử nghiệm và lỗi được cho phép, nhưng có thể có một cách tốt hơn để đi về vấn đề này.

Chỉnh sửa: Vui lòng xác định vị trí trong mã của bạn.


3
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Nếu bằng cách cắm vào, bạn có nghĩa là một phần của mã nguồn, điều đó thường không được phép. Nói chung, đó là một ý tưởng tốt để bám vào những mặc định đó. Chúng ta có phải hiển thị kết quả dưới dạng chuỗi không? Nếu vậy, định dạng nào được cho phép?
Dennis

Là số đầu vào được đảm bảo là tích cực? Sẽ có ít nhất một giải pháp?
xnor

Tôi đã chỉnh sửa câu hỏi một chút để làm rõ / trả lời một số điều. Nếu ý định của bạn khác với những thay đổi của tôi, vui lòng chỉnh sửa nó để phù hợp với điều đó.
Geobits

1
Tôi chỉ làm điều đó bởi vì đó là cách thông thường mà tôi thấy thời gian đã cho (trong thế giới thực). Không ai từng nói đó là 13: 4: 7, nhưng 5:10:30 hầu như luôn được chấp nhận. Tôi không có vấn đề gì với việc nó bị thay đổi.
Geobits

3
"Hãy xác định vị trí trong mã của bạn là giá trị đầu vào." - Quy ước về PPCG để lấy đầu vào là sử dụng các đối số, cũng như một vài tùy chọn khác. Xem Mặc định cho Code Golf: Phương thức nhập / xuất trên Meta.
dùng2428118

Câu trả lời:


8

Thạch , 16 30 29 20 byte

Bây giờ với định dạng đầu ra chính xác! Rất cám ơn Dennis vì sự giúp đỡ của anh ấy trong việc gỡ lỗi câu trả lời này. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

Chỉnh sửa: +14 byte từ việc sử dụng định dạng đầu ra chính xác. -1 byte từ việc loại bỏ một không gian thừa. -3 từ thay đổi từ 24,60,60sang “ð<<‘. -6 byte từ thay đổi +100DḊ€€thành d⁵.

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

Giải trình

“ð<<‘Œ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 được lưu nhờ @hvd
for t in {0..23}+{00..59}+{00..59};{((${t//+0/+}-$1))||echo ${t//+/:};}

Hãy thử trực tuyến .


1
printflà tốn kém ở đây. Bằng cách đến tgần hơn với định dạng đúng và sửa nó để thực hiện ((t-$1))công việc, bạn có thể giảm xuống còn 71:for t in {0..23}+{00..59}+{00..59};{((${t//+0/+}-$1))||echo ${t//+/:};}
hvd

@hvd Chơi golf tốt - cảm ơn!
Chấn thương kỹ thuật số

6

Perl 6 , 62 56 byte

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

Chỉ cần kiểm tra tất cả các kết hợp có thể có trong sản phẩm chéo của tất cả các giờ, phút và giây.


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)

Có các giải pháp ngắn hơn bằng cách sử dụng exec(Python 2) hoặc đệ quy (Python 3), nhưng cả hai đều yêu cầu dung lượng bộ nhớ không hợp lý.

Hãy thử trực tuyến!


4

PowerShell , 87 77 byte

Đã lưu 10 byte nhờ John L. Bevan

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

Hãy thử trực tuyến! (điều này sẽ hết thời gian, nó rất chậm)

Giải trình

Khá đơn giản, bắt đầu với hiện tại [datetime], thêm 1 giây 86.399 lần, định dạng dưới dạng chuỗi, sau đó chỉ giữ lại những chuỗi có tổng cộng.


FYI: Bạn có thể thay thế 10000000bằng 1e7lđể tiết kiệm 4 byte ... hoặc thậm chí 1e7là thêm một byte (tôi nghĩ rằng tôi phải bao gồm Llợi ích của tham số; nhưng nghi ngờ cách tiếp cận của bạn sẽ tránh được nhu cầu đó.
JohnLBevan

1
@JohnLBevan cảm ơn! Tôi đã vật lộn 1e7trong ít nhất 30 phút, và đó là hậu tố Ltôi đã bỏ lỡ; Tôi đã quên nó và không thể tìm ra cách nào để đưa nó vào int ngắn hơn hằng số. Ai quyết định rằng một [timespan]diễn giải một [int]như bọ ve và một [double]như ngày nào ?? Các iexbit là khá rực rỡ, mặc dù nó làm cho toàn bộ điều này chậm hơn.
nghĩa tự do

1
Đừng lo lắng; Tôi cũng có một số trợ giúp về vấn đề đó;): stackoverflow.com/q/41408902/361842
JohnLBevan

1
@JohnLBevan Tôi thực sự chỉ thấy câu hỏi này trước khi bình luận nơi bạn liên kết nó! Tốt đẹp.
briantist

1
Ngoài ra iexmánh khóe đã được điều chỉnh từ một mẹo ở đây: 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]

Trả về danh sách các chuỗi HH: MM: SS, ví dụ f 140-> ["22:59:59","23:58:59","23:59:58"].

Đó là ba vòng đơn giản qua giờ, phút và giây. Giữ và định dạng tất cả các giá trị trong đó tổng là số đầu vào x.




2

Mẻ, 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%

Đầu ra giờ một chữ số.


2

Toán học, 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)

Điều này đánh trúng một điểm đáng tiếc trong QBasic, với việc chuyển sang số, cắt tỉa và chuẩn bị 0khi cần thiết thực sự rất tốn kém.

Đầu ra mẫu:

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

Giải thích tôi đã viết một cuốn tiểu thuyết về nó:

:           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 có vẻ thú vị. Bạn đã tạo nó chỉ cho # code-golf!? :)
wasatchwizard

@wasatchwizard Yup :-)
steenbergh

1

PowerShell , 67 79 Byte (phiên bản khó chịu)

Vì các quy tắc không nói gì về việc hoàn thành trong một thời gian nhất định (hoặc hoàn toàn) và không có gì về việc không trùng lặp, đây là một giải pháp khủng khiếp:

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

1
Tôi không thể tìm thấy bài đăng meta có liên quan, nhưng tôi khá chắc chắn rằng một bài nộp phải tạm dừng để có hiệu lực, trừ khi được chỉ định bởi thử thách
Sefa

Cảm ơn @Sefa ... nếu đó là trường hợp tôi không thể tìm ra cách hay để phiên bản khó chịu của tôi hoạt động với ít ký tự hơn phiên bản sạch của Briantist ... Bị cám dỗ xóa câu trả lời này, nhưng tôi tự hào về cách thật tệ;)
JohnLBevan

0

Vợt 39 byte

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

Ung dung:

(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

Hãy thử trực tuyến!

Giải trình

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

Có thêm một chuỗi trống làm đầu vào, mà tôi đoán không tính vào kích thước. Cập nhật bytecount (bao gồm cả lịch sử) để thêm hai byte cho khởi tạo chuỗi.

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


Nếu bạn cần khởi tạo một chuỗi thành trống, thì việc khởi tạo phải được tính
edc65

@ edc65 Xong.
· ////

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

Ít chơi gôn

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
}

Kiểm tra

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

Chế độ xem mở rộng:

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

Lặp lại tất cả các lần có thể bằng cách lặp 86399 đến 1,

  • chuyển đổi số nguyên thành thời gian bằng cách chia cho 3600 để có được chữ số đầu tiên
  • chữ số thứ 2 bằng cách lấy số nguyên mod 3600 rồi chia cho 60
  • và chữ số cuối cùng là số nguyên mod 60

Trừ tất cả 3 số từ giá trị đầu vào để trả về giá trị falsey nếu ba số đó cộng với giá trị đầu vào. Nếu giá trị là falsey, xuất giá trị.


0

bash, 78 byte (sử dụng tiện ích BSD) hoặc 79 byte (cũng không phải BSD)

Thời gian này dài hơn một chút so với giải pháp bash 71 byte đẹp mắt của @DigitalTrauma và @ hvd, nhưng tôi khá thích ý tưởng ở đây là sử dụng các số trong cơ sở 60; Tôi tò mò nếu có ai có thể đánh gôn này thêm một chút nữa.

Với tiện ích ghi chú chuẩn BSD:

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

Với tiện ích seq phổ biến hơn:

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

Ý tưởng là tạo ra các số từ 0 đến 83699 và sử dụng dc để chuyển đổi chúng thành cơ sở 60. "Các chữ số" trong đầu ra cơ sở 60 của dc là các số có 2 chữ số từ 00 đến 59, với các khoảng cách phân tách "chữ số", vì vậy cái này liệt kê tất cả các thời gian mong muốn từ 00 00 00 đến 23 59 59 ở hầu hết các định dạng cần thiết.

Tuy nhiên, nếu bạn thực hiện điều đó theo nghĩa đen, các số dưới 60 ^ 2 không phải là số có 3 chữ số trong cơ sở 60, do đó, 00 hoặc 00 00 ban đầu bị thiếu. Vì lý do đó, tôi thực sự tạo ra các số từ 60 ^ 3 đến 60 ^ 3 + 83699; điều này đảm bảo rằng tất cả các số được tạo có độ dài chính xác là 4 chữ số trong cơ sở 60. Điều này cũng được miễn là cuối cùng tôi vứt bỏ chữ số đầu tiên (01) không cần thiết.

Vì vậy, một khi thời gian mong muốn được tạo, tôi chỉ cần lấy mỗi số bốn từ 01 00 00 đến 01 23 59 59, thêm ba số cuối và trừ đi đối số $ 1. Nếu đó là 0, thì tôi lấy mọi thứ trong bộ tứ từ ký tự thứ 3 trở đi (vứt bỏ "01"), sử dụng tr để chuyển đổi khoảng trắng thành dấu hai chấm và in kết quả.


0

PowerShell , 91 97 byte (bao gồm cả đầu vào)

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

hoặc là

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

Mở rộng và bình luận

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

Lưu ý: Bị vượt qua bởi phiên bản của @ Briantist: /codegolf//a/105163/6776

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.