เข็มนาฬิกาแห่งความพินาศ


9

คุณถูกผูกมัดกับเก้าอี้ ข้างใต้คุณเป็นภูเขาไฟขนาดใหญ่ นาฬิกา 12 ชั่วโมงถัดจากคุณติ๊กเป็นลางสังหรณ์และคุณเห็นว่ามันมีสายไฟที่นำขึ้นจากด้านหลังจนถึงโซ่ซึ่งจะนำคุณไปสู่ศูนย์กลางของโลก บันทึกลงในนาฬิกาเป็นโน้ต:

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

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

ตามหน้า OEISเวลาที่คาบเกี่ยวกันสิบเอ็ดครั้งคือ:

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.

ครั้งต่อไปจะเป็นเวลา 12:00:00 น. ไม่จำเป็นต้องใช้เวลาวินาทีและส่วนที่เป็นเศษส่วนสำหรับความท้าทายนี้ เพียงแค่ปัดเศษเป็นนาทีที่ใกล้ที่สุด

กรณีทดสอบ:

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)

โปรแกรมสามารถเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ ฉันไม่สนใจว่าคุณจะเลือก0:00หรือ12:00ไม่และทั้งคู่ก็เป็นที่ยอมรับ โชคดี!


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Mego

คำตอบ:


6

JavaScript (Node.js) , 54 47 ไบต์ (ปัดไปทางซ้ายสุด)

-7 ไบต์ ขอบคุณ @ user202729

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

ลองออนไลน์!


JavaScript (Node.js) , 40 33 44 ไบต์ (ปัดไปทาง 0)

-3 ไบต์ขอบคุณ @Arnauld

-4 ไบต์ขอบคุณ @Kevin Cruijssen

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

คำอธิบาย

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

หมายเหตุด้านข้าง:ฉันค่อนข้างมั่นใจว่าคนนี้มีความรู้ทางคณิตศาสตร์มากกว่า ฉันเพิ่งจะรู้วิธีรวมและทวีคูณ

ลองออนไลน์!


สิ่งนี้ดูไม่ถูกต้องหากคุณคำนึงถึงการทำงานของนาฬิกาจริง: datagenetics.com/blog/november12016/index.html
Night2

คุณมีข้อผิดพลาดในการปัดเศษ 05:00ควรเอาท์พุท05:27แต่เอาท์พุท05:25แทนและ06:45ควรเอาท์พุท07:38แต่เอาท์พุท07:35แทน นี่อาจเป็นลำดับ oeis ที่มีประโยชน์: A178181
Kevin Cruijssen

1
@LuisfelipeDejesusMunoz สองกรณีทดสอบที่ฉันให้นั้นถูกต้องแน่นอน แต่11:56ดูเหมือนว่าคุณจะส่งออก00:05แทน00:00(หรือ12:00)
Kevin Cruijssen

@KevinCruijssen เรียบร้อยแล้ว ฉันคิดว่าa=(a+=b>=a*5)%12จะสั้นลงเล็กน้อย แต่ฉันไม่เก่งเกินไป
Luis felipe De jesus Munoz

1
ไม่ได้เป็นMath.round(x)เพียงแค่0|x+.5?
user202729

5

J , 31 ไบต์

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

ลองออนไลน์!

วิธีการปัดเศษตัวเลขใน J คือการบวก0.5และนำพื้น ( <.) ใช้จำนวนไบต์มากเกินไป ...


คำอธิบาย

12 60&#. (การแปลงฐานแบบผสม) แปลงจากอาร์เรย์ของ [ชั่วโมงนาที] เป็นนาทีที่ผ่านมาตั้งแต่ 0:00

โปรดทราบว่าเริ่มตั้งแต่ 0:00 ทุก 12/11 ชั่วโมง (นั่นคือ 720/11 นาที) ทั้งสองมือซ้อนทับกันหนึ่งครั้ง

ดังนั้นให้ค่านาทีเพียงแค่ปัดขึ้นเป็นพหุคูณที่ใกล้ที่สุดของ 720/11 (แตกต่างจากตัวเอง) สามารถทำได้โดย*11/720 (J มีตัวอักษรจำนวนตรรกยะ11r720) <.เพิ่มพื้นเพิ่มขึ้น>:แล้วคูณด้วย 720/11

โปรดทราบว่า "ทวีคูณโดย 11/720" และ "ทวีคูณด้วย 720/11" คือการกระทำแบบย้อนกลับ 2 ครั้งรวมถึง "แปลงจาก [ชั่วโมงนาที] เป็นจำนวนนาทีที่ผ่านไป" และในทางกลับกัน โชคดีที่ J มีอยู่แล้วในตัว&. (ใต้) ซึ่งจะย้อนกลับการกระทำบางอย่างหลังจากใช้การแปลง

หลังจากนั้นเพียงแค่ทำปัดเศษ: แล้ว0.5 +<.


5

R , 68 ไบต์

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

ลองออนไลน์!

  • -2 ไบต์ขอบคุณ Giuseppe
  • +7 ไบต์เนื่องจากการปัดเศษที่ขาดหายไป :(

ใช้ประโยชน์จากสมการ:

same_position_minutes = 720/11 * index

โดยที่index0 คือตำแหน่งทับซ้อนแรก (00:00), 1 สำหรับตำแหน่งที่ 2 และอื่น ๆ ...


1
ฉันคิดว่าคุณมีชุดวงเล็บที่ไม่ธรรมดา(a[...]...c(60,1))
จูเซปเป้

@Giuseppe: ใช่คุณพูดถูก ... ขอบคุณ!
digEmAll

@digEmAll 6:30 > 6:33นี้จะช่วยให้คำตอบที่ถูกต้องสำหรับ
mbomb007

@ mbomb007: ถูกต้องคงที่;)
digEmAll

4

R , 88 ไบต์

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)

ลองออนไลน์!

เพิ่มเวลาหนึ่งนาที ตรวจสอบมุม หากไม่ใกล้พอให้วนซ้ำจนกว่าจะพบวิธีแก้ปัญหา


1
นั่นเป็นวิธีที่ยอดเยี่ยมในการทำ ฉันไม่เคยคิดถึงการจำลองนาฬิกาจริง!
Redwolf

3

Python 3 , 80 78 ไบต์

นี่คือการส่งครั้งแรกของฉันดังนั้นการวิจารณ์ที่สร้างสรรค์ยินดีต้อนรับ :)

-2 ไบต์ขอบคุณ @Jo King

def f(h,m):n=65.45;r=round(((60*h+m)//n%11+1)*n);print('%i:%02i'%(r//60,r%60))

ลองออนไลน์! (78) ลองออนไลน์! (80)


2
ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี!
mbomb007

2

Java 8, 89 82 ไบต์

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

แก้ไขแล้ว. จะดูว่าฉันสามารถเล่นกอล์ฟในภายหลังได้หรือไม่

ลองออนไลน์

คำอธิบาย:

ทำ


ปัญหาเดียวกัน (ชัด) ตามที่คุณตอบ - เช่น: f.apply(56).apply(10)อัตราผลตอบแทน11 59
Jonathan Allan

@JonathanAllan แก้ไขแล้ว จะดูว่าฉันสามารถลบบางส่วนทีหลังได้
ไหม

@KevinCruijssen 6:30 > 6:33นี้จะช่วยให้คำตอบที่ถูกต้องสำหรับ
mbomb007

@ mbomb007 ฉันรู้ ฉันรอคำตอบของ OP ก่อนที่จะแก้ไข ไม่ว่าเราควรปูพื้นรอบเพดานหรือทั้งสองอย่างก็ได้รับอนุญาต (ถ้าฉันจะโพสต์การท้าทายฉันจะใช้ตัวเลือกที่สี่ แต่ให้รอ OP ก่อน)
Kevin Cruijssen

@KevinCruijssen กรณีทดสอบถูกแก้ไขเป็นคำถามเนื่องจากความคิดเห็นโดย OPแสดงความคิดเห็นโดยสหกรณ์การใช้คำจำกัดความทั่วไปของการปัดเศษเจตนาของ OP นั้นชัดเจน
mbomb007

2

Apl (Dyalog Unicode)ขนาด 28 ไบต์

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

ลองออนไลน์!


คำอธิบาย

((⍳11),⍪0,+\∊5/⊂5 6)คือเมทริกซ์ของเวลาที่มือซ้อนทับกัน (พิมพ์ที่ส่วนท้ายของลิงก์ tio)
(⍸⌷1⊖⊣)⎕ค้นหาช่วงเวลาที่อินพุตอยู่ในเมทริกซ์และดัชนีด้านล่างที่ล้อมรอบ


2

C # (. NET Core) 70 ไบต์

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

ลองออนไลน์!

ฉันคิดว่ามันผ่านการทดสอบทุกกรณี แม้ว่าตัวเรือน h = 11 จะดูน่าเกลียด

คำอธิบาย:

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

6:30 > 6:33นี้จะช่วยให้คำตอบที่ถูกต้องสำหรับ
mbomb007

@ mbomb007 ขอบคุณฉันจะดูสิ่งนี้ ฉันลองครั้งแรกก่อนที่จะเพิ่มรายการเวลาทับซ้อนทั้งหมด
F.Carette

มันควรจะโอเคแล้ว เนื่องจากเราไม่มีคำแนะนำที่ชัดเจนเกี่ยวกับสิ่งที่ต้องทำในกรณีที่ currentTime == overlapTime ฉันกลับเวลาปัจจุบันในกรณีเหล่านี้ (ที่กำหนด (1,5) ส่งคืน "1: 5" และไม่ใช่ "2:11") .
F.Carette

1

JavaScript ขนาด 41 ไบต์

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


1

เยลลี่ 25 ไบต์

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

ลองออนไลน์!

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


0

Perl 6 , 43 ไบต์

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

ลองออนไลน์!

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

คำอธิบาย

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