การเพิ่มประสิทธิภาพการเตือนภัย


28

นาฬิกาปลุกของฉัน

ฉันเป็นคนอเมริกันและเป็นนาฬิกาปลุก (ดิจิตอล) ของฉัน ในการตั้งเวลาปลุกมันจะเริ่มต้นเมื่อเวลาก่อนหน้านี้ การกดปุ่มชั่วโมงจะเป็นการเลื่อนขึ้นหนึ่งชั่วโมงและการกดปุ่มนาทีจะเป็นการเลื่อนขึ้นหนึ่งนาที การกดปุ่มทั้งสองในเวลาเดียวกันจะรีเซ็ตเป็นเที่ยงคืน (12:00 น.) และนับเป็นการกดปุ่มสองครั้ง

เมื่อเวลาเกินขีด จำกัด (12) จะรีเซ็ตเป็น 1 และสลับไฟ AM / PM เมื่อนาทีเกินขีดสูงสุด (59) จะรีเซ็ตเป็น 0 โดยไม่กระทบชั่วโมง

งาน

งานของคุณคือกำหนดเวลาเริ่มต้นและเวลาเป้าหมายเพื่อส่งออกจำนวนกดปุ่มที่ดีที่สุดที่จำเป็นในการตั้งเวลาปลุกของฉันให้เป็นเวลาเป้าหมาย

คุณสามารถป้อนข้อมูลในรูปแบบใดก็ได้ที่เหมาะกับคุณที่สุด ข้อมูลเดียวที่โปรแกรมของคุณควรใช้คือชั่วโมงและนาทีสำหรับอินพุตทั้งสอง นั่นหมายความว่าคุณอาจใช้ข้อมูลเป็นมิลลิวินาทีนับตั้งแต่ยุคและแยกชั่วโมงและนาที แต่คุณไม่สามารถเข้ารหัสอะไรได้ในปีเดือนวินาทีที่สองเป็นต้นโปรดทราบว่าในขณะที่คุณป้อนข้อมูลโดยใช้ "เวลาทางทหาร" (หรือเวลาปกติสำหรับคนส่วนใหญ่ของโลก) แต่นั่นไม่ได้เปลี่ยนวิธีการทำงานของนาฬิกาของฉัน

ตัวอย่าง

1:15 pm -> 2:30 am

คุณสามารถกดปุ่มทั้งสองลงเพื่อรีเซ็ตเป็น 12:00 น. จากนั้นเพิ่มเป็น 2:30 น. ซึ่งจะเป็นการ2+2+30 = 34กดปุ่ม คุณสามารถเพิ่มขึ้นเป็น 2:30 น. ซึ่งจะเป็นการ13+15 = 28กดปุ่ม 28ดังนั้นการส่งออกของคุณคือ

3:58 am -> 4:02 am

คุณสามารถรีเซ็ตและเพิ่มค่าซึ่งจะเป็นการ2+4+2 = 8กดปุ่ม คุณสามารถเพิ่มได้เช่นกันซึ่งจะเป็นการ1+4 = 5กดปุ่ม 5ดังนั้นการส่งออกของคุณคือ

10:55 pm -> 1:00 am

คุณสามารถรีเซ็ตและเพิ่มค่าซึ่งจะเป็นการ2+1 = 3กดปุ่ม คุณสามารถเพิ่มได้เช่นกันซึ่งจะเป็นการ3+5=8กดปุ่ม 3ดังนั้นการส่งออกของคุณคือ

1:00 am -> 1:59 pm

คุณสามารถรีเซ็ตและเพิ่มค่าได้ แต่จะเป็นการกดเพิ่มขึ้นสามครั้งแทนที่จะเป็นการเพิ่ม 12+59 = 71ดังนั้นการส่งออกของคุณคือ

กรณีทดสอบ

Current  Target   = Output
1:15pm   2:30am   = 28
3:58am   4:02am   = 5
10:55pm  1:00am   = 3
1:00am   1:59pm   = 71
12:00am  12:00am  = 0
6:51pm   12:00am  = 2
2:01pm   11:00pm  = 25
2:01pm   11:01pm  = 9
12:59am  12:01am  = 2
11:50am  12:00pm  = 11


13
อึศักดิ์สิทธิ์! การกดปุ่มสองปุ่มจะรีเซ็ตนาฬิกาปลุก (ยุโรป) ของฉันเป็น 0:00 เช่นกัน ... ทุกปีที่ผ่านมาใช้เวลากดปุ่มหลายครั้งเกินไป ... O_o
Arnauld

8
"เวลาทางการทหาร (หรือเวลาปกติของโลกส่วนใหญ่)" ... คำที่คุณต้องการคือ "เวลา 24 ชั่วโมง"
จา

12
@ Jakob ไม่คำที่เขามองหาคือ "เวลาปกติ" ชาวอเมริกันใช้เวลาที่ผิดปกติ, วันที่ผิดปกติ, หน่วยที่ผิดปกติ ฯลฯ
Neil

1
@ ขั้นตอนที่ฉันอยู่ในสหราชอาณาจักรและไม่ทราบว่าคุณหมายถึงอะไรโดย "เวลาทหาร" จนกระทั่งจาคอบอธิบาย เวลา 24 ชั่วโมงทำให้ฉันสมเหตุผล
Darren H

คำตอบ:


5

Husk , 16 ไบต์

§▼ṁ→(Σz%e24 60z-

ลองออนไลน์!

รับอาร์กิวเมนต์เป็นสองรายการ [ชั่วโมงนาที] สำหรับเวลาเริ่มต้นและสิ้นสุดในรูปแบบ 24 ชั่วโมง

ฉันมีความสุขมากที่ฉันสามารถตีกอล์ฟนี้ได้ฉันพบว่าน่าสนใจว่าการจัดการข้อโต้แย้งในองค์ประกอบของฟังก์ชั่นนี้ได้อย่างไร

ฟังก์ชั่นที่คำนวณจำนวนการกดปุ่มที่เราต้องการหากไม่อนุญาตให้รีเซ็ตคือ:

Σz%e24 60z-
         z-    elementwise subtract the two times
 z%e24 60      take the hours difference modulo 24 and the minutes difference modulo 60
Σ              sum the two resulting numbers

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

ต่อไปเราคำนวณจำนวนกดปุ่มที่เราต้องการหากเรารีเซ็ตเวลาเป็น 0:00

ṁ→    take the sum of each element of the list increased by 1

ดังกล่าวก่อนหน้านี้จะดำเนินการเฉพาะในข้อโต้แย้งที่สอง (ครั้งสุดท้าย) และคำนวณhours+minutes+2เพียงในแบบนักเล่นกอล์ฟ

สุดท้าย§▼คือส่วนที่ส่งผ่านอาร์กิวเมนต์ที่สองไปยังทั้งสองฟังก์ชันและส่งคืนผลลัพธ์ที่น้อยกว่าของผลลัพธ์ทั้งสอง


8

JavaScript (ES6), 73 56 54 52 50 ไบต์

ใช้รูปแบบ 24 ชั่วโมง รับอินพุตเป็นจำนวนเต็ม 4 จำนวนแทนชั่วโมงและนาทีของแต่ละครั้ง

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)
  • 2 ไบต์บันทึกขอบคุณที่Arnauld

ลองมัน

ป้อนเวลาในรูปแบบ 24 ชั่วโมงพร้อม:ตัวคั่น

o.innerText=(f=

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)

)(+(x=(i.value="01:00").split`:`)[0],+x[1],+(y=(j.value="13:59").split`:`)[0],+y[1]);oninput=_=>o.innerText=f(+(x=i.value.split`:`)[0],+x[1],+(y=j.value.split`:`)[0],+y[1])
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>Current: </label><input id=i type=time><label for=j>Target: </label><input id=j type=time><pre id=o>


คำอธิบาย

(จะได้รับการอัปเดตในไม่ช้า)

(g,l,h,m)=>

ฟังก์ชั่นที่ไม่ระบุชื่อการจำนวนเต็มเป็นข้อโต้แย้งผ่านพารามิเตอร์g, l, hและmที่gและlตามลำดับ, ชั่วโมงและนาทีของเวลาปัจจุบันและhและmเป็นชั่วโมงและนาทีของเวลาที่กำหนด

2+h+m

อันดับแรกเราคำนวณจำนวนปุ่มที่ต้องกดหากเราเพิ่งรีเซ็ตนาฬิกาซึ่งเป็นเพียง 2 (สำหรับการรีเซ็ต) บวกชั่วโมงเป้าหมายและนาทีเป้าหมาย

h-g+24*(h<g)

ต่อไปเราจะคำนวณจำนวนการกดปุ่มเพื่อให้ถึงเวลาเป้าหมาย เราทำสิ่งนี้โดยการลบชั่วโมงปัจจุบันจากชั่วโมงเป้าหมาย อย่างไรก็ตามถ้าชั่วโมงปัจจุบันน้อยกว่าเป้าหมายนี่จะทำให้เรามีตัวเลขติดลบดังนั้นเราจึงทำการแก้ไขด้วยการเพิ่ม 24 คูณด้วยการตรวจสอบว่าh<g(ซึ่งส่งกลับบูลีน แต่ถูกส่งไปเป็นจำนวนเต็มโดยปริยาย1ถ้าเป็นจริงหรือ0ถ้าเท็จโดย การดำเนินการทางคณิตศาสตร์

+m-l+60*(m<l)

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

Math.min()

ในที่สุดเราได้รับตัวเลขขั้นต่ำ 2 หมายเลขเพื่อให้ผลลัพธ์แก่เรา


1
คุณสามารถทำ(h-g+24)%24+(m-l+60)%60อะไร
Arnauld

7

Pyth , 29 ไบต์

ความท้าทายนี้เห็นได้ชัดว่าไม่ได้เปรียบภาษาการเล่นกอล์ฟจึงเป็นเหตุผลว่าทำไมมันถึงยาวนาน ในทางกลับกันสิ่งนี้ได้รับการปรับปรุงโดยความจริงที่ว่า Pyth นั้นเป็นแบบ Python ดังนั้นเราจึงสามารถใช้โมดูลัสเชิงลบในทางที่ผิดได้

hS,+%-eQ@Q1 60%-@Q2hQ24+2s>Q2

ชุดทดสอบ ตัวเลขใน Pyth ไม่สนับสนุนศูนย์นำหน้า



3

C # (. NET Core) , 56 ไบต์

(H,M,h,m)=>Math.Min(((h+24-H)%24)+((m+60-M)%60),(2+h+m))

ลองออนไลน์!

คล้ายกับคำตอบของ Javascript Bools ใน C # ไม่สามารถแปลงเป็นตัวเลขได้อย่างง่ายดายดังนั้นแทนที่จะ[diff]+24*(H<h)ทำเช่นนั้น([diff]+24)%24ซึ่งทำสิ่งเดียวกันได้อย่างมีประสิทธิภาพ


คุณสามารถลบวงเล็บได้ประมาณ2+h+m2 ไบต์
Kevin Cruijssen

ฉันได้สร้างพอร์ตของคำตอบของคุณใน Java 8และสังเกตเห็นว่าคุณสามารถเล่นกอล์ฟอีกสี่ไบต์ได้โดยการลบวงเล็บให้มากขึ้นซึ่งลงท้ายด้วยสิ่งนี้(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
Kevin Cruijssen

1
คุณไม่ต้องทำSystem.Math.Minหรอกเหรอ?
LiefdeWen

3

Haskell, 41 ไบต์

(a#b)c d=min(a+b+2)$mod(a-c)24+mod(b-d)60

ตรงไปตรงมาสวย รับอินพุตเป็นสี่อาร์กิวเมนต์โดยใช้เวลา 24 ชั่วโมง: ชั่วโมงสิ้นสุด, นาทีสุดท้าย, ชั่วโมงเริ่มต้น, นาทีเริ่มต้น


2

Python 3 , 43 ไบต์

lambda a,b,c,d:min((c-a)%24+(d-b)%60,2+c+d)

ลองออนไลน์!

ป้อนข้อมูลเป็นจำนวนเต็ม 4 จำนวน (เริ่มต้นชั่วโมงเริ่มต้นนาทีสุดท้ายสิ้นสุดนาที)


@ StepHen อ๊ะ แก้ไขได้ง่าย
HyperNeutrino

ล้มเหลว2 01 11 00หรือ ในคำตอบของคุณคุณจะทราบได้อย่างไรว่าเวลานั้นเป็นอย่างไรAMหรือPMถ้าคุณไม่รับสิ่งนั้นเป็นข้อมูลเข้า
Mr. Xcoder

@ Mr.Xcoder; ฉันได้รับ13อินพุตนั้นโดยใช้ TIO ซึ่งถูกต้อง (รีเซ็ต +11 <9 + 59)
ปุย

2
ไม่%เสมอกลับมาเป็นจำนวนบวกในงูใหญ่?
ขนดก

4
@Shaggy จะส่งคืนสัญลักษณ์ของด้านขวาของ%เสมอ1%24= 1, =1%-24 -23มันมีประโยชน์มากสำหรับคำถามนี้
สตีเฟ่น

2

Java 8, 54 50 ไบต์

(h,m,H,M)->Math.min((H-h+24)%24+(M-m+60)%60,H+M+2)

C # คำตอบของพอร์ตของ@KamilDrakari (หลังจากฉันเล่น2 6 ไบต์)

คำอธิบาย:

ลองที่นี่

(h,m,H,M)->       // Method with four integer parameter and integer return-type
  Math.min(       //  Return the lowest of the following two:
                  //   The hours:
   (H-h           //    Second hours - first hours inputs
       +24)       //    +24 so we won't have negative numbers
           %24    //    mod-24 to get the hours
   +              //   And add the minutes:
    (M-m          //    Second minutes - first minutes inputs
         +60)     //    +60 so we won't have negative numbers
             %60  //    mod-60 to get the minutes
    ,H+M          //  And compare it to the second hours + second minutes inputs
        +2)       //   +2 for the added +24 and +60 to get the positive modulo arguments

1

Perl 5 , 71 +2 (-ap) = 73 ไบต์

($w,$x,$y,$z)=@F;$_=($r=2+$y+$z)>($c=($y-$w+24)%24+($z-$x+60)%60)?$c:$r

ลองออนไลน์!

รับอินพุตในรูปแบบ 24 ชั่วโมง (เวลาทหาร) คั่นด้วยช่องว่างเวลาเริ่มต้นก่อนเวลาสิ้นสุดที่สอง: HH MM hh mm


1

เรติน่า 106 ไบต์

\d+
$*
 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2
(1*):(1* )\1(1{24})?
$2
(1*) (1*):\1(1{60})?
$2
(1+)#(?!\1)

\G1

ลองออนไลน์! ลิงค์มีกรณีทดสอบ รับอินพุตเป็นเวลาปัจจุบันและเวลาที่ต้องการในเวลาปกติ 24 ชั่วโมงโดยมีช่องว่างคั่นทั้งสองครั้ง คำอธิบาย:

\d+
$*

แปลงเป็นเอก

 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2

นี่ทำสองสิ่ง; มันเพิ่ม 24 ชั่วโมงและ 60 นาทีในชั่วโมงและนาทีที่ต้องการและยังเพิ่ม 2 ถึงผลรวมของชั่วโมงและนาทีที่ต้องการดั้งเดิมเช่นจำนวนกดปุ่มเพื่อตั้งค่าโดยใช้การรีเซ็ต

(1*):(1* )\1(1{24})?
$2

ลบเวลาปัจจุบันออกจากเวลาที่ต้องการและลบ 24 ที่เราเพิ่มเข้าไปหากทำได้

(1*) (1*):\1(1{60})?
$2

ในทำนองเดียวกันสำหรับนาที นอกจากนี้ยังเพิ่มผลลัพธ์ทั้งสองเข้าด้วยกัน

(1+)#(?!\1)

หากจำนวนการกดเพื่อตั้งค่าโดยใช้เวลาปัจจุบันมากกว่าจำนวนการกดเพื่อตั้งค่าโดยใช้การรีเซ็ตให้ลบออก

\G1

แปลงจำนวนที่เหลือแรกกลับเป็นทศนิยม

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