Tìm kim đồng hồ gần nhất


15

Thử thách

Cho một số giây sau nửa đêm, xuất ra góc nhỏ nhất giữa hai kim bất kỳ trên mặt đồng hồ, sử dụng càng ít byte càng tốt.

Bạn có thể cho rằng số giây luôn nhỏ hơn 86400. Các góc có thể được biểu thị bằng độ hoặc radian.

Một giải pháp tham khảo có tại: http://ideone.com/eVdgC0

Các trường hợp thử nghiệm (kết quả bằng độ)

0 -> 0
60 -> 0.5
600 -> 5
3600 -> 0
5400 -> 45
6930 -> 84.75
50000 -> 63.333

Làm rõ

  • Đồng hồ có 3 kim: giờ, phút và giây.
  • Tất cả các tay di chuyển liên tục, do đó có thể tìm thấy kim giờ và phút giữa các lần tốt nghiệp trên mặt đồng hồ.

Thử thách liên quan (chỉ tính theo phút và kim giờ, tính bằng độ)
Sp3000

1
Bạn có lẽ nên đặc biệt rằng có một kim giây trên đồng hồ.
isaacg

Bạn có thể thêm một số trường hợp thử nghiệm?
Beta Decay

1
Trên một số đồng hồ, kim phút nhảy sang phút tiếp theo khi kim giây đạt đến đỉnh. Trên những người khác, nó di chuyển liên tục. Tôi nghĩ đây là một chiếc đồng hồ mà nó di chuyển liên tục? Ngoài ra, mặc dù rõ ràng một khi bạn đọc kỹ, ban đầu tôi thấy "kim giây" mơ hồ, bởi vì hầu hết các đồng hồ đều có ít nhất hai tay, vì vậy việc thêm "kim giây" thực sự có thêm kim giây.
Reto Koradi 29/07/2015

1
@BetaDecay Chắc chắn. Tôi có thể đã nói điều gì đó như: "Đồng hồ có ba tay: giờ, phút và giây."
Reto Koradi

Câu trả lời:


10

CJam, 36 35 34 32 30 byte

riP*30/_60/_C/]2m*::-:mc:mC$3=

Đầu ra là bằng radian. Tôi đã xác minh các giải pháp cho tất cả 86400 đầu vào có thể.

Hãy thử trực tuyến trong trình thông dịch CJam .

Ý tưởng

radian là một vòng đầy đủ, mỗi khoảng thời gian phút / giây trên đồng hồ là 2π / 60 = π / 30 radian.

Do đó, chia số giây cho π / 30 mang lại vị trí của kim giây.

Kim phút di chuyển với tốc độ một phần sáu của tốc độ của kim giây, do đó, chia kết quả từ trên cho 60 sẽ mang lại vị trí của kim phút.

Tương tự như vậy, chia kết quả cuối cùng cho 12 mang lại vị trí của kim giờ.

Lưu ý rằng ba thương số của chúng tôi từ trên không nhất thiết phải nằm trong phạm vi [0,2π).

Bằng cách tính toán tất cả chín điểm khác biệt có thể có của các góc của bàn tay, chúng ta có được ba 0 (khoảng cách góc giữa một bàn tay và chính nó) và sáu khoảng cách giữa các bàn tay khác nhau.

Nếu các tay gần nhất nằm trên một nửa không bao gồm 12 , một trong những khác biệt ở trên sẽ là đầu ra mong muốn (mod ).

Tuy nhiên, vào lúc 01:55:30 (ví dụ), kim giờ ở góc 1,008 rad (57,75 độ) và kim phút ở góc 5,812 rad (333,00 độ) so với 12 , cho chênh lệch 4,804 rad (275,25 độ). Bằng cách trừ kết quả này từ một vòng đua đầy đủ, chúng ta thu được góc đo "theo hướng khác", tương đương với 1.479 rad (84,75 rad).

Bây giờ, thay vì ánh xạ từng góc θ trong [0,2π) và trừ đi một cách có điều kiện kết quả từ π , chúng ta có thể chỉ cần tính arccos (cos (θ)) , vì cos là định kỳ và chẵn, và arccos luôn mang lại giá trị trong [ 0, π) .

Bỏ qua ba kết quả nhỏ nhất (tất cả bằng không), nhỏ nhất thứ tư sẽ là đầu ra mong muốn.

ri                             e# Read an integer from STDIN.
  P*30/                        e# Multiply by π and divide by 30.
       _60/                    e# Divide a copy by 60.
           _C/                 e# Divide a copy by 12.
              ]2m*             e# Push the array of all pairs of quotients.
                  ::-          e# Replace each pair by its difference.
                     :mc       e# Apply cosine to each difference.
                        :mC    e# Apply arccosine to each cosine.
                           $3= e# Sort and select the fourth smallest element.

Phiên bản thay thế (34 byte)

rd6*_60/_C/]360f%2m*::m360X$f-+$6=

Đầu ra được tính bằng độ và không có hàm lượng giác nào được sử dụng.

Hãy thử trực tuyến trong trình thông dịch CJam .


9

Toán học, 40 byte

Min@Abs@Mod[#{11,708,719}/120,360,-180]&

Giải thích: Hãy để tsố giây kể từ nửa đêm. Vị trí của mỗi tay là

hour: t/120 (mod 360)
min:  t/10 (mod 360)
sec:  6t (mod 360)

Để tính khoảng cách góc tuyệt đối giữa xđộ và yđộ, chúng ta có thể sửa đổi y - x360 thành phạm vi [-180, 180]và sau đó lấy giá trị tuyệt đối. (Lưu ý rằng không có giới hạn trên xy.) Vì vậy, chức năng này chỉ tính toán sự khác biệt cặp t/10-t/120, 6t-t/106t-t/120và làm đó.


Xin lỗi, không quen thuộc với Mathicala, nhưng điều này có thực sự chấp nhận một đối số hoặc biến số cho số giây kể từ nửa đêm không?
Winny

1
@Winny Vâng, đó là một chức năng thuần túy (được chỉ định bởi & ) và đối số đầu tiên được thông qua được gọi là bên trong như #.
jcai

7

Con trăn, 65

lambda n,l={720,60,1}:6*min((n/x-n/y)%60for x in l for y in{x}^l)

Khoảng cách di chuyển theo giờ, phút và kim giây, tính theo đơn vị 1/60 của vòng tròn là h,m,s = n/720, n/60, n/1. Chúng ta có thể lấy các mod 60 này để có được vị trí của chúng trên vòng tròn từ 0đến 60.

Nếu chúng ta lấy mod 60 khác biệt của chúng, chúng ta sẽ nhận được số lượng đơn vị đứng trước đơn vị kia. Chúng tôi có tất cả sáu sự khác biệt có thể, tìm min, sau đó nhân 6với để bán lại theo 360độ.

Hai lớp danh sách hiểu biết đầu tiên chọn tay đầu tiên được biểu thị bởi 720, 60hoặc 1, sau đó chọn Mặt khác ra khỏi đó thiết lập với sự lựa chọn đầu tiên bỏ qua bộ xor.

Tôi đã thử nghiệm điều này một cách triệt để so với mã tham chiếu.


6

C #, 163 152 byte

Điều này tạo ra mỗi bàn tay hai lần để đếm vòng quanh, sau đó lặp qua mọi kết hợp và tìm góc tối thiểu giữa hai bàn tay. Tính toán được thực hiện trong 60 đơn vị, sau đó nhân với 6 để có được độ.

Ấn định cho rõ ràng:

float F(int s){
    float b=60,c;
    float[]a={c=s/b/b%12*5,c+b,c=s/b%b,c+b,s%=60,s+b};
    for(s=36;s-->0;)
        b=s%6!=s/6&(c=(c=a[s%6]-a[s/6])<0?-c:c)<b?c:b;
    return b*6;
}

Ví dụ đầu ra:

    0 seconds, 00:00:00, smallest angle is 0°
43200 seconds, 12:00:00, smallest angle is 0°
86399 seconds, 23:59:59, smallest angle is 0.09164429°
 3330 seconds, 00:55:30, smallest angle is 54.75°
39930 seconds, 11:05:30, smallest angle is 60.25001°
21955 seconds, 06:05:55, smallest angle is 65.49998°
21305 seconds, 05:55:05, smallest angle is 59.50001°
 5455 seconds, 01:30:55, smallest angle is 75.45831°
41405 seconds, 11:30:05, smallest angle is 44.95834°

Giải pháp tuyệt vời để giải thích cho vấn đề này
toto

2

TI-BASIC, 17 byte

min(cos⁻¹(cos(ΔList(Ans{6,.1,5!⁻¹,6

Sử dụng Dennis arccos(cos(để bình thường hóa khoảng cách; tuy nhiên, thay vì tính toán tất cả các khoảng cách theo cặp, nó chỉ tính toán ba khoảng cách cần thiết bằng cách sử dụngΔList([seconds],[minutes],[hours],[seconds] .

Chương trình này mong đợi Degreechế độ và trả về câu trả lời theo độ.

EDIT: 5!ngắn hơn một byte so với 120.

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.