Bàn tay đồng hồ của Doom


9

Bạn bị xích vào một cái ghế. Bên dưới bạn là một ngọn núi lửa khổng lồ. Một chiếc đồng hồ 12 giờ bên cạnh bạn tích tắc một cách đáng ngại, và bạn thấy rằng nó có dây dẫn từ phía sau lên đến một chuỗi, nó sẽ thả bạn vào trung tâm của trái đất. Nhấn vào đồng hồ là một ghi chú:

Mỗi kim đồng hồ có một điện cực. Khi cả hai kim đồng hồ ở cùng một vị trí, dòng điện sẽ chảy và bạn chết. Đó là, trừ khi bạn có thể cho tôi biết thời gian chính xác điều này sẽ xảy ra, đến phút gần nhất.

Bạn có một máy tính biết mọi ngôn ngữ lập trình. Bạn cần tạo ra chương trình ngắn nhất (đây là , và sơ hở tiêu chuẩn bị cấm) bạn có thể, và nói với nhà khoa học độc ác rằng thời gian sẽ là bao nhiêu. Chương trình của bạn nên lấy đầu vào (theo bất kỳ phương thức nào), bao gồm giờ và phút. Nó sẽ trả về giờ và phút tiếp theo (trong bất kỳ phương pháp nào) mà điều này xảy ra.

Theo trang OEIS , mười một lần trùng lặp là:

00:00:00 plus 0/11 s, 01:05:27 plus 3/11 s,
02:10:54 plus 6/11 s, 03:16:21 plus 9/11 s,
04:21:49 plus 1/11 s, 05:27:16 plus 4/11 s,
06:32:43 plus 7/11 s, 07:38:10 plus 10/11 s,
08:43:38 plus 2/11 s, 09:49:05 plus 5/11 s,
10:54:32 plus 8/11 s.

Lần sau sẽ là 12:00:00. Các giây và các phần phân số của chúng không cần thiết cho thử thách này. Đơn giản chỉ cần làm tròn đến phút gần nhất.

Các trường hợp thử nghiệm:

0:00 (Or 12:00) > 1:05
1:00 > 1:05
11:56 > 12:00 (Or 0:00)
6:45 > 7:38
5:00 > 5:27
6:30 > 6:33 (round up)

Chương trình có thể là một chức năng, hoặc chương trình đầy đủ. Tôi không quan tâm nếu bạn chọn 0:00hoặc 12:00, và cả hai đều được chấp nhận. Chúc may mắn!


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Mego

Câu trả lời:


6

JavaScript (Node.js) , 54 47 byte (làm tròn đến gần nhất)

-7 byte. Cảm ơn @ user202729

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60+.5|0]

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


JavaScript (Node.js) , 40 33 44 byte (làm tròn về 0)

-3 byte nhờ @Arnauld

-4 byte nhờ @Kevin Cruijssen

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60|0]

Giải trình

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60|0]    Full Code
a                                               Hours
   b                                            Minutes
    =>[                    ,               ]    return array with
       (a+=        )                            add to the current hour
           b>5.46*a                             1 if the minute's clock hand has 
                                                passed the hour's clock hand. Here we use
                                                equation 60*a/11 which is the same as 5.46*a
                    +a/11                       and add 1 when hour is 11
                         |0                     floor the result

                            a%12*65.46%60|0     Here we do equation ((720/11)*a) (mod 60)
                            a%12                In case of hour 12 we take 0
                                *65.46          multiply hour by 720/11 which can be shortened to
                                                65.46 to save 1 byte.
                                      %60       mod 60
                                         |0     floor the result

Lưu ý bên lề: Tôi khá chắc chắn rằng đây có thể là môn đánh gôn của một người có nhiều kiến ​​thức về toán học. Tôi hầu như không biết cách tính tổng và nhân

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


Điều này có vẻ không ổn nếu bạn sử dụng đồng hồ thật hoạt động như thế nào: datagenetic.com/blog/november12016/index.html
Night2

Bạn có một số lỗi làm tròn. 05:00nên đầu ra 05:27nhưng đầu ra 05:25thay thế, và 06:45nên đầu ra 07:38nhưng đầu ra 07:35thay thế. Ở đây có lẽ là một chuỗi oeis hữu ích: A178181
Kevin Cruijssen

1
@LuisfelipeDejesusMunoz Hai trường hợp thử nghiệm tôi đưa ra thực sự chính xác bây giờ, nhưng 11:56dường như bạn xuất ra 00:05thay vì 00:00(hoặc 12:00).
Kevin Cruijssen

@KevinCruijssen Xong. Tôi nghĩ a=(a+=b>=a*5)%12có thể rút ngắn lại một chút nhưng tôi không giỏi lắm về điều này
Luis felipe De jesus Munoz

1
Không phải là Math.round(x)chỉ 0|x+.5?
dùng202729

5

J , 31 byte

0.5<.@+>:@<.&.(11r720*12 60&#.)

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

Cách làm tròn số trong J là thêm 0.5và lấy số sàn ( <.). Mất quá nhiều byte ...


Giải trình

12 60&#. (chuyển đổi cơ sở hỗn hợp) chuyển đổi từ một mảng [giờ, phút] sang phút trôi qua kể từ 0:00.

Lưu ý rằng bắt đầu từ 0:00, cứ sau 12/11 giờ (tức là 720/11 phút), hai bàn tay chồng lên nhau một lần.

Do đó, với giá trị phút, chỉ cần làm tròn nó lên bội số gần nhất của 720/11 (khác với chính nó). Điều này có thể đạt được bởi *nó vào ngày 11/720 (J có số hữu tỷ theo nghĩa đen 11r720), lấy số sàn <., tăng dần >:, sau đó nhân nó với 720/11.

Lưu ý rằng "nhân với 11/720" và "nhân với 720/11" là 2 hành động ngược lại, cũng như "chuyển đổi từ [giờ, phút] sang số phút đã qua" và ngược lại. May mắn thay, J đã tích hợp &.(bên dưới), giúp đảo ngược một số hành động sau khi áp dụng một phép biến đổi.

Sau đó chỉ cần làm tròn số: 0.5 +sau đó <..


5

R , 68 byte

a=round(1:30*720/11);a[a>sum(scan()*c(60,1))][1]%/%c(60,1)%%c(12,60)

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

  • -2 byte nhờ Giuseppe
  • +7 byte do thiếu làm tròn :(

Khai thác phương trình:

same_position_minutes = 720/11 * index

trong đó index0 cho vị trí chồng chéo đầu tiên (00:00), 1 cho vị trí thứ 2 và cứ thế ...


1
Tôi nghĩ rằng bạn có một bộ dấu ngoặc đơn bên ngoài(a[...]...c(60,1))
Giuseppe

@Giuseppe: vâng, bạn nói đúng ... cảm ơn!
digEmAll

@digEmAll Điều này đưa ra câu trả lời sai cho 6:30 > 6:33.
mbomb007

@ mbomb007: bạn đã đúng, đã sửa;)
digEmAll

4

R , 88 byte

i=scan();d=1+60*i[1]+i[2];while(abs(60*(h=d%/%60%%12)-11*(m=d%%60))>5){d=d+1};paste(h,m)

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

Tăng thời gian thêm một phút. Kiểm tra góc. Nếu không đủ gần, vòng lặp cho đến khi tìm thấy giải pháp.


1
Huh, đó là một cách tuyệt vời để làm điều đó. Tôi chưa bao giờ nghĩ đến việc mô phỏng một chiếc đồng hồ thực tế!
Chương trình Redwolf


2

Java 8, 89 82 byte

(h,m)->(m=m<(m=(int)(h%12*720d/11%60))?m:(int)(++h%12*720d/11%60))*0+h%12%11+" "+m

Đã sửa. Sẽ xem liệu tôi có thể đánh gôn sau không (có thể bằng cách chuyển một câu trả lời khác) ..

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

Giải trình:

LÀM


Vấn đề tương tự (rõ ràng) như câu trả lời bạn đã chuyển - ví dụ: f.apply(56).apply(10)sản lượng11 59
Jonathan Allan

@Jonathan ALLan Đã sửa. Sẽ xem liệu tôi có thể xóa một số byte sau không ..
Kevin Cruijssen

@KevinCruijssen Điều này đưa ra câu trả lời sai cho 6:30 > 6:33.
mbomb007

@ mbomb007 Tôi biết. Tôi đang chờ phản hồi của OP trước khi sửa nó. Cho dù chúng ta nên cho phép sàn, tròn, trần hoặc cả hai (nếu tôi đã đăng thử thách, tôi sẽ sử dụng tùy chọn thứ tư, nhưng chúng ta hãy đợi OP trước).
Kevin Cruijssen

@KevinCruijssen Trường hợp thử nghiệm đã được chỉnh sửa thành câu hỏi vì nhận xét của OP . Sử dụng định nghĩa phổ biến nhất về vòng , ý định của OP là rõ ràng.
mbomb007

2

Apl (Dyalog Unicode) , 28 byte

((⍳11),⍪0,+\∊5/⊂5 6)(⍸⌷1⊖⊣)⎕

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


Giải trình

((⍳11),⍪0,+\∊5/⊂5 6)là một ma trận các lần mà các bàn tay chồng lên nhau (được in ở cuối liên kết tio)
(⍸⌷1⊖⊣)⎕tìm khoảng thời gian mà đầu vào nằm trong ma trận và các chỉ mục bên dưới nó bao quanh.


2

C # (.NET Core) , 70 byte

(h,m)=>{h%=12;int n=(5*h+h/2)%60;return (m>n||h>10)?f(h+1,0):h+":"+n;}

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

Tôi nghĩ rằng nó vượt qua tất cả các trường hợp thử nghiệm. Mặc dù trường hợp h = 11 là loại xấu xí

Giải trình:

(h,m)=>{ // Lambda receiving 2 integers
    h%=12; // Just to get rid of the 0/12 case
    int n=(5*h+h/2)%60; // get the minute at which the hands overlap 
                        //for current hour.
    return 
    (m>n||h>10)? // if current minute > n or h=11
        f(h+1,0) // it will happen next hour
    :
        h+":"+n; // return result
}

Điều này đưa ra câu trả lời sai cho 6:30 > 6:33.
mbomb007

@ mbomb007 Cảm ơn, tôi sẽ xem xét điều này. Tôi đã thử lần đầu tiên trước khi danh sách đầy đủ các lần trùng lặp được thêm vào.
F.Carette

Nó sẽ ổn ngay bây giờ. Vì chúng tôi không có hướng dẫn rõ ràng về những việc cần làm trong trường hợp currentTime == chồng chéo, tôi trả lại thời gian hiện tại trong những trường hợp này (đã cho (1,5) trả về "1: 5" chứ không phải "2:11") .
F.Carette

1

JavaScript, 41 byte

p=>q=>(p+=q>=(5.5*p|0),p%=11,[p,5.5*p|0])


1

Thạch , 25 byte

‘2¦ɓ;W}Ṣi¹ịḷø5,6ẋ5ÄĖØ0W¤;

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

Một liên kết đơn sẽ lấy thời gian làm danh sách hai số nguyên và trả về danh sách hai số nguyên tương ứng với lần tiếp theo do bàn tay chạm vào.


0

Perl 6 , 43 byte

(* *60+*+33).round(65.45).round.polymod(60)

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

Một ẩn danh Dù lambda có hai số nguyên biểu thị giờ và phút và trả về giờ và phút theo thứ tự ngược lại. Ngay bây giờ, nó không nhất quán khi bạn nhập thời gian được căn chỉnh, cho dù nó xuất thời gian được căn chỉnh tiếp theo hay ở cùng một thời điểm. Tôi đang chờ đợi OP phản hồi về vấn đề đó, nhưng hiện tại tôi đang coi nó là không xác định.

Giải trình

(* *60+*+33)   # Converts the two inputs to number of minutes
            .round(65.45)   # Round to the nearest multiple of 65.45
                         .round  # Round to the nearest integer
                               .polymod(60) # Repeatedly modulo by 60 and return the list of results
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.