อะนาล็อกเป็นป้าน!


23

นาฬิกาอะนาล็อกมี 2 เข็ม *: ชั่วโมงและนาที
มือเหล่านี้วงกลมหน้าปัดนาฬิกาเมื่อเวลาผ่านไป การหมุนของเข็มนาทีเต็มรูปแบบจะส่งผลให้ 1/12 ของการหมุนของเข็มชั่วโมง 2 รอบการหมุนของเข็มชั่วโมงหมายถึงวันเต็ม

เนื่องจากมือเหล่านี้จับจ้องที่จุดศูนย์กลางเดียวกันและหมุนไปรอบ ๆ จุดนั้นคุณสามารถคำนวณมุมระหว่างมือได้เสมอ ในความเป็นจริงมี 2 มุมในเวลาที่กำหนด; อันที่ใหญ่กว่าและอันที่เล็กกว่า (บางครั้งทั้งคู่จะเท่ากับ 180 แต่นั่นไม่สำคัญ)

* นาฬิกาสมมุติของเราไม่มีเข็มวินาที

งาน

ให้เวลาในรูปแบบ 24 ชั่วโมงเอาท์พุทมุมที่เล็กกว่าระหว่างมือเป็นองศา ถ้ามืออยู่ตรงข้ามกัน (เช่น at 6:00, 18:00etc) เอาต์พุต 180

กฎระเบียบ

ป้อนข้อมูลอาจถูกนำมาเป็น: - ตัวคั่นแยกสตริง: 6:32, 14.26 - 2 ค่าแยกต่างหากหรือสตริง ints: 6, 32, 14, 26 - อาร์เรย์ของ 2 ค่าสตริงหรือ ints: [6, 32],[14, 26]

นอกจากนี้คุณอาจเลือกที่จะระบุว่าคำตอบของคุณต้องใช้ปัจจัยการผลิตที่เป็นเบาะ 2 หลัก (สมมติว่าคุณใช้สตริง) คือ: 06:32, 06, 32,[06, 32]

นอกจากนี้คุณอาจเลือกที่จะกลับคำสั่งของปัจจัยการผลิต, การนาทีแล้วชั่วโมงเช่น: 32:6, 32, 6,[26, 14]

ชั่วโมงจะเป็นค่าจำนวนเต็มระหว่าง0และ23(รวม) นาทีจะเป็นค่าจำนวนเต็มระหว่าง0และ59(รวม)

คุณสามารถสันนิษฐานได้ว่าเข็มนาทีจับไปที่การเพิ่มขึ้น 6 องศาตามใบหน้า (ตำแหน่งที่เว้นระยะเท่ากันหนึ่งค่าสำหรับแต่ละนาที)
คุณสามารถสมมติว่าเข็มชั่วโมงเลื่อนไปที่การเพิ่มขึ้น 0.5 องศาตามใบหน้า (ตำแหน่งที่เว้นระยะเท่า ๆ กันสำหรับ แต่ละค่านาทีต่อมูลค่าชั่วโมง)

เอาต์พุตต้องเป็นหน่วยองศาไม่ใช่เรเดียน คุณอาจรวมส่วนท้าย.0สำหรับตัวเลขทั้งหมด

เกณฑ์การให้คะแนน

นี่คือจำนวนน้อยที่สุดในแต่ละภาษาที่ชนะ!

Testcases

Input: 06:32
Output: 4

Input: 06:30
Output: 15

Input: 18:32
Output: 4

Input: 06:01
Output: 174.5

Input: 00:00
Output: 0

Input: 00:01
Output: 5.5

Input: 12:30
Output: 165

Input: 6:00
Output: 180

Input: 23:59
Output: 5.5


2
@FryAmTheEggman "เอาท์พุทจะต้องได้รับในองศาไม่เรเดียน" ดังนั้นฉันจะเดาไม่ได้
Theo

1
ลืมไปว่าเวลา 5:59 น. ใกล้เวลา 6 โมงเช้า
aaaaa พูดว่าคืนสถานะโมนิก้า

4
กรณีทดสอบที่แนะนำ: 00:59 -> 35.5(ค่ามีค่าน้อยอาจทำให้การปรับใช้บางอย่างล้มเหลว) เอ็มhm
Arnauld

1
ขอบคุณ @Arnauld คุณแค่เสียค่าใช้จ่ายไบต์! : p
Shaggy

คำตอบ:


14

JavaScript (ES6),  41 40  39 ไบต์

(h)(m)นำปัจจัยการผลิตเป็น

h=>m=>((x=4+h/3-m*.55/9)&2?12-x:x)%4*90

ลองออนไลน์!

อย่างไร?

แทนที่จะทำงานโดยตรงในช่วง[0..360]เรากำหนดตัวแปรชั่วคราวxในช่วง[0..4] :

x=|4h12+4m60×124m60|mod4
x=|4h1244m60×12|mod4
x=|h311m180|mod4

มุมเป็นองศากำหนดโดย:

min(4x,x)×90

แต่สูตรจะดำเนินการแตกต่างกันเล็กน้อยในรหัส JS ที่เราแน่นอนต้องการที่จะหลีกเลี่ยงการใช้ความยาวและMath.abs()Math.min()

แทนที่จะคำนวณค่าสัมบูรณ์เราบังคับให้ค่าบวกเป็น[0..12]โดยการคำนวณ:

x=4+h311m180

และแทนที่จะคำนวณขั้นต่ำเรากำหนดว่าเราอยู่ที่ไหนโดยการทำ bitwise และกับ2 - และนี่คือเหตุผลที่เราเลือกช่วงเวลาที่ถูกล้อมด้วยพลัง2ในตอนแรก


5

เยลลี่ , 14 12 ไบต์

ד<¿‘Iæ%Ø°AH

ลองออนไลน์!

ลิงก์ monadic ซึ่งใช้เวลาเป็นรายการของจำนวนเต็มสองจำนวน: ชั่วโมงนาที

ขอบคุณ @JonathanAllan สำหรับการบันทึก 2 ไบต์!

คำอธิบาย

ד<¿‘        | Multiply hour by by 60 and minute by 11
     I       | Find difference
      æ%Ø°   | Symmetric mod 360 [equivalent to (x + 360) mod 720 - 360]
          A  | Absolute
           H | Half

symmetric mod? มันทำงานอย่างไร
Shaggy

@Shaggy สะดวกมากมันจะส่งกลับค่าในช่วงเวลา(-180, 180]ที่เทียบเท่า (mod 360) สิ่งก่อสร้างเหล่านั้น ...
Neil

1
บันทึกไบต์ที่สองโดยการทำงานในองศาที่ครึ่งหนึ่งที่มีการใช้Ø°สำหรับ360และสำหรับ“<¿‘ 60,11เช่นเดียวกับד<¿‘Iæ%Ø°AH TIO
Jonathan Allan

ฉันกำลังจะบอกว่า 12 ตัวอักษรแต่ปรากฎว่า Windows-1252 (และการเข้ารหัสอื่น ๆ ไม่กี่) สามารถเข้ารหัสได้จริงใน 12 ไบต์ ระหว่างตัวละครที่ไม่ใช่ ASCII หลายตัวฉันไม่คิดว่าการเข้ารหัสที่ไม่ใช่ Unicode เดียวจะครอบคลุมพวกเขาทั้งหมด แต่เห็นได้ชัดว่าฉันผิดมาก
Thanatos

@Thanatos บางภาษาที่เชี่ยวชาญในการเขียนโค้ดมีหน้ารหัสของตัวเองสำหรับ 256 ตัวอักษรที่พวกเขาเข้ารหัสในแต่ละ 1 ไบต์ เจลลี่เป็นหนึ่งในนั้นด้วยที่กำหนดเองนี้รหัสหน้า 05AB1E, Charcoal, MathGolf, Stax และอื่น ๆ เป็นภาษาอื่นที่มีหน้ารหัสกำหนดเอง ส่วนใหญ่จะใช้ Windows-1252 เป็นหลัก :)
Kevin Cruijssen

4

MATL, 18 ไบต์

30*i5.5*-t360-|hX<

ยอมรับอินพุตสองชั่วโมงตามด้วยนาที ใช้วิธีเดียวกันกับคำตอบนี้

ลองใช้ที่MATL Online

คำอธิบาย

      % Implicitly grab first input (hours)
30*   % Multiply by 30
i     % Explicitly grab second input (minutes)
5.5*  % Multiply by 5.5
-     % Take the difference
t     % Duplicate the result
360-  % Subtract 360
|     % Take the absolute value
h     % Horizontally concatenate
X<    % Determine the minimum value
      % Implicitly display the result

สิ่งนี้จะล้มเหลวในช่วงเที่ยงคืนหรือส่งออก180แทนที่จะเป็น0หรือไม่
Shaggy

4

ภาษา Wolfram (Mathematica) , 30 29 28 ไบต์

5Abs@Mod[#.{6,-1.1},72,-36]&

ลองออนไลน์!

เวอร์ชันที่ไม่ถูกปรับแต่ง:

Abs[Mod[#.{30,-5.5}, 360, -180]] &

อาร์กิวเมนต์ของฟังก์ชัน# = {h,m}ประกอบด้วยชั่วโมงและนาที ความยาวสองรายการนี้จะถูกตีความว่าเป็นเวกเตอร์และจุด-สินค้าที่มีการคำนวณ{30,-5.5} #.{30,-5.5} = 30*h-5.5*mจากนั้นเราคำนวณโมดูลัสสมมาตรที่ 360 โดยMod[#.{30,-5.5}, 360, -180]กำหนดมุมในช่วง -180 .. + 180 Absใช้ค่าสัมบูรณ์ของมัน

เนื่องจากตัวดำเนินการที่เกี่ยวข้องทั้งหมดเป็นแบบเชิงเส้นเราสามารถคูณและหารจำนวนที่ปรากฏทั้งหมดได้ แต่จะสะดวกที่สุด ด้วยการดึงตัวประกอบของ5นิพจน์และหารจำนวนทั้งหมดในนิพจน์ด้วย 5 จำนวนไบต์จะถูกย่อให้เล็กสุด


3

นักเล่นแร่แปรธาตุ 134 ไบต์

_->In_h+In_m+720d+360a+f
h->60d
m+11d->
0m+d+a+0r->b
0a+0x->r
d+b+r->r+a
r+0b->
b+0d+0h+0y->5y
b+0d+5y->x
0b+0d+f->Out_x+Out_"."+Out_y

ลองออนไลน์!

คำอธิบาย

_->In_h+In_m+720d+360a+f

ตั้งค่าเริ่มต้น. อินพุตชั่วโมงและนาทีลงในhและmตั้งค่ามุมปัจจุบันdเป็น 360 องศา (720 ครึ่งองศา) ตั้งค่าaเพื่อคำนวณมุมหลักและตั้งค่าสถานะเอาต์พุต

h->60d
m+11d->

แต่ละชั่วโมงจะเพิ่ม 30 องศาและในแต่ละนาทีจะลบ 5.5 องศา

0m+d+a+0r->b
0a+0x->r

ในขณะที่rธง (ย้อนกลับ) ไม่ได้ตั้งค่าแต่ละdอะตอมควรย้ายหนึ่งอะตอมa bสิ่งนี้เกิดขึ้นหลังจากใช้เวลาหมดเพื่อหลีกเลี่ยง "สภาพการแข่งขัน" เมื่อไม่มีaอะตอมเหลือให้ตั้งค่าrเพื่อให้การไหลกลับนี้

โปรดทราบว่ากฎข้อที่สองนี้สามารถเรียกใช้หลายครั้งและยังสามารถเรียกใช้ก่อนกฎการตั้งค่าเริ่มต้น สิ่งนี้ไม่เป็นอันตรายอะไรเลยดังนั้นจึงไม่จำเป็นต้องป้องกันสิ่งนี้ 0xสภาพจัดการกรณีขอบ: เมื่อเข้าเป็น 6:00 ไม่มีaอะตอมเมื่อสิ้นสุดโปรแกรม แต่มีxอะตอมถ้าผลสุดท้ายคืออย่างน้อย 1 องศา

d+b+r->r+a
r+0b->

ย้อนกลับ: เมื่อมุมที่เซ็นชื่อมีค่ามากกว่า 180 องศาให้ย้ายbอะตอมไปที่aเพื่อลดมุมเป็นเอาท์พุท หยุดการย้อนกลับเมื่อถึงมุม "360"

b+0d+0h+0y->5y
b+0d+5y->x

เมื่ออะตอมระดับทั้งหมดหมดให้หารด้วย 2 เพื่อให้ได้มุมในการแสดงผล

0b+0d+f->Out_x+Out_"."+Out_y

หลังจากทำสิ่งนี้เสร็จแล้วให้ส่งออกเพียงครั้งเดียวโดยใช้การfตั้งค่าสถานะจากการตั้งค่าเริ่มต้น


3

Python 3.8 (เผยแพร่ล่วงหน้า) , 45 43 ไบต์

-2 ไบต์ขอบคุณที่เอริค

lambda h,m:min(x:=abs(h%12*30-m*5.5),360-x)

ลองออนไลน์!

h%12- ชั่วโมงในรูปแบบ 12 ชั่วโมง
h%12*30- มุมของเข็มชั่วโมงที่เต็มชั่วโมง
m/2- มุมที่เข็มชั่วโมงเคลื่อนที่เป็นmนาที
h%12*30+m/2- ตำแหน่งปัจจุบันของเข็มชั่วโมงเป็นมุม
m*6- มุมของเข็มนาที ( 360°/60 = 6°)




2

ถ่าน 22 ไบต์

I↔⁻¹⁸⁰﹪⁻׳⁰⁺⁶N×⁵·⁵N³⁶⁰

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน รับอินพุตเป็นจำนวนเต็มสองตัว คำอธิบาย:

             N          First input
           ⁺⁶           Plus literal 6
        ׳⁰             Multiplied by literal 30
       ⁻                Minus
                  N     Second input
              ×⁵·⁵      Multiplied by literal 5.5
      ﹪            ³⁶⁰  Modulo literal 360
  ⁻¹⁸⁰                  Subtracted from literal 180
 ↔                      Absolute value
I                       Cast to string
                        Implicitly print


2

Python 3 , 40 ไบต์

lambda h,m:180-abs(180-(h*30-m*5.5)%360)

ลองออนไลน์!

h*30- มุมระหว่างเที่ยงและชั่วโมงhเมื่อนาทีคือ0; หากชั่วโมงเท่ากันหรือมากกว่า 12 มุมนี้สามารถเท่ากับหรือมากกว่า 360 °
m*6- มุมระหว่างเที่ยงและเข็มนาที
m*.5- นาทีเข็มชั่วโมงเดินไปข้างหน้าจากเต็มชั่วโมงหลังจากmนาที (เช่นถ้าเป็น 4:24 เข็มชั่วโมงเดินไปข้างหน้า 12 องศาจากตำแหน่งที่อยู่ในเวลา 4 โมง)
h*30-m*5.5- หนึ่งในสองมุมระหว่างเข็มชั่วโมงและเข็มนาที สัมประสิทธิ์สำหรับmเป็น5.5เพราะm*6-m*.5=m*5.5; ยังไม่ได้คำตอบเพราะมันอาจเป็นค่าที่มากกว่า 360 ° (เช่น: ถ้าh,m=13,0) หรือน้อยกว่า 0 ° (เช่น: ถ้าh,m=12,30)
(h*30-m*5.5)%360- โมดูโล่นี้จะพิจารณากรณีที่ค่าที่คำนวณข้างต้นไม่อยู่ระหว่าง 0 ถึง 360 ° นี่ยังไม่ใช่คำตอบเพราะมันอาจเป็นตัวขยายของมุมทั้งสองในขณะที่เราต้องการแคบที่สุด
180-abs(180-(h*30-m*5.5)%360)- นี่คือผลลัพธ์สุดท้าย กฎทั่วไปนั้นx-abs(x-y)เทียบเท่ากับmin(y,x-y)ซึ่งจะให้ผลลัพธ์ที่ถูกต้อง



1

Python 3, 58 57 ไบต์

-1 / -2 ขอบคุณ @Shaggy

h,m=eval(input())
x=(30*h-5.5*m)
print(abs(min(x,360-x)))

[6,32]การดำเนินงานที่ไร้เดียงสาจะเข้าในรูปแบบของ ไบต์บางตัวอาจถูกลบออกจากบรรทัดสุดท้ายโดยเฉพาะ

Python 2, 52 50 Bytes

h,m=input()
x=(30*h-5.5*m)
print abs(min(x,360-x))

30*h-5.5*mควรช่วยคุณสองสามไบต์
Shaggy

1
defฟังก์ชั่นสไตล์ควรบันทึกไบต์บางส่วนเช่นกัน
ลบเจ็ด

@negativeseven จากความท้าทายถ้อยคำที่ดูเหมือนว่าควรใช้ stdin / stdout
Theo

คุณสามารถวางวงเล็บในบรรทัดที่ 2
Shaggy

โซลูชันต้องการการแก้ไขเล็กน้อย (Python 2) เพื่อให้ทำงานได้อย่างถูกต้อง ผลลัพธ์ควรน้อยกว่าหรือเท่ากับ 180 และมากกว่าหรือเท่ากับ 0
Erik the Outgolfer

1

Perl 5 -MList::Util=min -p , 37 ไบต์

$_=abs<>*5.5-$_%12*30;$_=min$_,360-$_

ลองออนไลน์!

ใช้อินพุตเป็นชั่วโมงตามด้วยนาทีในบรรทัดแยกเนื่องจากบันทึกสองสามไบต์


ตกลง. แก้ไขที่
Xcali



0

> <> , 17 ไบต์

b*$6a**-:0)12,-*n

ลองออนไลน์! (06:32)

รับอินพุตเป็น h, m บนสแต็ก

คำอธิบาย

b*$6a**-:0)12,-*n
b*                Multiplies m by 11
  $               Swaps m & h
   6a**           Multiplies h by 60
       -          Subtracts m & h (v)
        :0)       Checks if v > 0 (b=0/1)
           12,-   Subtracts .5 from b (-.5/.5)
               *  Multiplies v by b (halve & abs)
                n Outputs result
b*                Errors

0

05AB1E , 16 ไบต์

60*+5.5*D(‚360%ß

ใช้เวลาเป็นชั่วโมงในการป้อนข้อมูลครั้งแรกนาทีเป็นวินาที

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

โดยทั่วไปใช้สูตรต่อไปนี้:

เสื้อ=(60ชั่วโมง+ม.)×5.5
R=ม.ผมn(เสื้อพอควร360,-เสื้อพอควร360)

60*               # Multiply the (implicit) hours-input by 60
   +              # Add it to the (implicit) minutes-input
    5.5*          # Multiply it by 5.5
        D(‚       # Pair it with it's negative
           360%   # Take modulo-360 on both
               ß  # And then pop and push the minimum of the two
                  # (which is output implicitly as result)

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