ค้นหาเข็มนาฬิกาที่ใกล้ที่สุด


15

ท้าทาย

กำหนดจำนวนวินาทีที่ผ่านมาเที่ยงคืนเอาท์พุทมุมที่เล็กที่สุดระหว่างสองมือบนหน้าปัดนาฬิกาโดยใช้น้อยที่สุดเท่าที่เป็นไปได้

คุณอาจคิดว่าจำนวนวินาทีน้อยกว่า 86400 เสมอมุมอาจแสดงเป็นองศาหรือเรเดียน

โซลูชันอ้างอิงอยู่ที่: http://ideone.com/eVdgC0

กรณีทดสอบ (ผลลัพธ์เป็นองศา)

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

Clarificarions

  • นาฬิกามี 3 เข็ม: ชั่วโมงนาทีและวินาที
  • ทุกมือเคลื่อนไหวอย่างต่อเนื่องดังนั้นชั่วโมงและนาทีจึงสามารถพบได้ระหว่างการเรียนจบที่หน้าปัดนาฬิกา

ความท้าทายที่เกี่ยวข้อง (เข็มนาทีและชั่วโมงเท่านั้นในหน่วยองศา)
Sp3000

1
คุณควรเจาะจงว่ามีเข็มวินาทีอยู่บนนาฬิกา
isaacg

คุณสามารถเพิ่มกรณีทดสอบได้ไหม?
สลายตัวเบต้า

1
ในนาฬิกาบางเข็มนาทีจะข้ามไปยังนาทีถัดไปเมื่อเข็มวินาทีมาถึงด้านบน สำหรับคนอื่น ๆ มันจะเคลื่อนไหวอย่างต่อเนื่อง ฉันคิดว่านี่เป็นนาฬิกาที่เคลื่อนไหวอย่างต่อเนื่องหรือไม่ ในขณะที่มันชัดเจนเมื่อคุณอ่านอย่างระมัดระวังฉันเริ่มพบว่า "มือสอง" คลุมเครือเพราะนาฬิกาส่วนใหญ่มีอย่างน้อยสองมือต่อไปดังนั้นการเพิ่ม "มือสอง" จริงๆเพิ่มมือที่สาม
Reto Koradi

1
@BetaDecay แน่นอน ฉันอาจพูดบางอย่างเช่น: "นาฬิกามีสามมือ: ชั่วโมงนาทีและวินาที"
Reto Koradi

คำตอบ:


10

CJam, 36 35 34 32 30 ไบต์

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

เอาต์พุตเป็นเรเดียน ฉันได้ตรวจสอบการแก้ปัญหาสำหรับอินพุตที่เป็นไปได้ทั้งหมด 86400 รายการ

ลองใช้ออนไลน์ในล่าม CJam

ความคิด

ตั้งแต่ เรเดียนเป็นรอบเต็มทุกช่วงนาที / วินาทีบนนาฬิกาคือ2π / 60 = π / 30เรเดียนกว้าง

ดังนั้นการหารจำนวนวินาทีด้วยπ / 30ทำให้ได้ตำแหน่งของเข็มวินาที

เข็มนาทีเคลื่อนที่ด้วยความเร็วหกสิบวินาทีในหนึ่งวินาทีดังนั้นการแบ่งผลลัพธ์จากด้านบนด้วย60จะให้ตำแหน่งของเข็มนาที

เช่นเดียวกันหารผลลัพธ์สุดท้ายด้วย 12จะให้ตำแหน่งของเข็มชั่วโมง

โปรดทราบว่าสามความฉลาดของเราจากด้านบนไม่จำเป็นต้องอยู่ในช่วง [0,2π)

โดยการคำนวณความแตกต่างที่เป็นไปได้ทั้งเก้าของมุมมือเราได้รับสาม 0 (ระยะเชิงมุมระหว่างมือกับตัวมันเอง) และระยะทางหกระหว่างมือที่แตกต่าง

หากมือที่ใกล้ที่สุดอยู่บนครึ่งที่ไม่รวม12หนึ่งในความแตกต่างจากด้านบนจะเป็นผลลัพธ์ที่ต้องการ (mod )

อย่างไรก็ตามเวลา01:55:30 (ตัวอย่าง) เข็มชั่วโมงอยู่ที่มุม 1.008 rad (57.75 องศา) และเข็มนาทีที่มุม 5.812 rad (333.00 องศา) จาก 12ให้ค่าต่าง 4.804 rad (275.25 องศา) ด้วยการลบผลลัพธ์นี้จากรอบเต็มเราจะได้มุมที่วัดได้ "ในทิศทางตรงกันข้าม" ซึ่งเท่ากับ 1.479 rad (84.75 rad)

ตอนนี้แทนที่จะจับคู่แต่ละมุมθใน[0,2π)และลบผลลัพธ์จากπตามเงื่อนไขเราก็สามารถคำนวณarccos (cos (())เนื่องจากcosเป็นทั้งคาบและคู่และarccosให้ค่าใน [ 0, π)

การข้ามผลลัพธ์ที่เล็กที่สุดสามรายการ (ทั้งหมดเป็นศูนย์), ผลลัพธ์ที่เล็กที่สุดที่สี่จะเป็นผลลัพธ์ที่ต้องการ

รหัส

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.

รุ่นสำรอง (34 ไบต์)

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

เอาต์พุตอยู่ในหน่วยองศาและไม่ใช้ฟังก์ชันตรีโกณมิติ

ลองใช้ออนไลน์ในล่าม CJam


9

Mathematica ขนาด 40 ไบต์

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

คำอธิบาย: ให้tเป็นจำนวนวินาทีตั้งแต่เที่ยงคืน ตำแหน่งของแต่ละมือนั้นคือ

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

ในการคำนวณระยะเชิงมุมสัมบูรณ์ระหว่างxองศากับyองศาเราสามารถปรับy - x360 ในช่วง[-180, 180]แล้วนำค่าสัมบูรณ์ (หมายเหตุว่ามีข้อ จำกัด ในxและy.) ดังนั้นฟังก์ชั่นนี้ก็จะคำนวณจากจำนวนที่แตกต่างกันt/10-t/120, 6t-t/10และ6t-t/120และไม่ว่า


ขออภัยไม่คุ้นเคยกับ Mathematica แต่สิ่งนี้ยอมรับข้อโต้แย้งหรือตัวแปรสำหรับจำนวนวินาทีตั้งแต่เที่ยงคืนหรือไม่
Winny

1
@Winny ใช่มันเป็นฟังก์ชั่นบริสุทธิ์ (ระบุด้วย&) #และอาร์กิวเมนต์แรกก็ผ่านไปจะเรียกว่าภายในเป็น
jcai

7

Python 65

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

ระยะทางที่เดินทางโดยชั่วโมงนาทีและมือสองในหน่วยของ 1/60 h,m,s = n/720, n/60, n/1ของวงกลมที่มี เราสามารถใช้เหล่านี้ mod 60 ที่จะได้รับตำแหน่งของพวกเขาบนวงกลมจากไป060

หากเราใช้ความแตกต่างของ mod 60 เราจะได้จำนวนหน่วยที่หนึ่งอยู่ต่อหน้าหน่วยอื่น เราใช้ความแตกต่างที่เป็นไปได้ทั้งหกข้อค้นหานาทีจากนั้นคูณด้วย6เพื่อลด360ระดับเป็นองศา

ความเข้าใจในรายการสองเลเยอร์ก่อนเลือกมือแรกตามที่แสดงโดย720, 60หรือ1จากนั้นเลือกอีกมือหนึ่งออกจากชุดนั้นโดยเลือกตัวเลือกแรกออกจากชุด xor

ฉันทดสอบสิ่งนี้อย่างละเอียดเทียบกับรหัสอ้างอิง


6

C #, 163 152 ไบต์

สิ่งนี้จะสร้างทุกมือสองครั้งเพื่อนับการพันรอบจากนั้นวนซ้ำทุกการรวมกันและค้นหามุมต่ำสุดระหว่างมือ การคำนวณจะดำเนินการใน 60 ส่วนจากนั้นคูณด้วย 6 เพื่อรับองศา

เยื้องเพื่อความชัดเจน:

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

ตัวอย่างผลลัพธ์:

    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°

วิธีแก้ปัญหาที่ดีสำหรับการห่อหุ้ม
โตโต้

2

TI-BASIC ขนาด 17 ไบต์

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

ใช้เดนนิสในarccos(cos(การทำให้ระยะทางเป็นปกติ อย่างไรก็ตามแทนที่จะคำนวณระยะทางทุกคู่มันจะคำนวณทั้งสามอย่างที่จำเป็นต้องใช้ΔList([seconds],[minutes],[hours],[seconds]เท่านั้น

โปรแกรมนี้คาดหวังDegreeโหมดและส่งกลับคำตอบในองศา

แก้ไข: เป็นหนึ่งไบต์สั้นกว่า5!120

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.