จำลองนาฬิกาปลุกเก่าของฉันโง่


25

ฉันมีนาฬิกาปลุกโง่เก่าที่มีสองปุ่ม: และhour ปุ่มเพิ่มชั่วโมงของการปลุกชุดและเพิ่มขึ้นในเวลานาทีของการปลุกชุด แต่บางออกแบบสมาร์ทตระหนักว่าการกดปุ่มทั้งสองในเวลาเดียวกันควรจะมีความหมายและตัดสินใจว่าการกดและพร้อมกันจะทำให้เกิดการเตือนภัยที่จะตั้งค่าให้/ งานของคุณคือการจำลองพฤติกรรมนี้minutehourminutehourminute12:00 am0:00

งาน

ให้เวลาเริ่มต้นและลำดับของปุ่มสถานะให้คิดเวลาสิ้นสุด

เริ่มต้นจากเวลาเริ่มต้นเพิ่มชั่วโมงสำหรับการเกิดขึ้นของแต่ละคน(1,0), เพิ่มนาทีสำหรับการเกิดขึ้นของแต่ละ(0,1)และตั้งเวลาในการสำหรับการเกิดขึ้นของแต่ละ0:00 (1,1)รัฐ(0,0)ควรละเลยเพราะพวกเขาสอดคล้องกับปุ่มไม่ถูกกด

เมื่อมีการเพิ่มนาทีและชั่วโมงถ้านาที / ชั่วโมงไปข้างต้นสูงสุดตั้งค่าให้0เช่นการเพิ่มค่านาที59ควรตั้งค่านาทีไป0และการเพิ่มค่าชั่วโมงควรตั้งค่าชั่วโมง23 0การเพิ่มค่านาที / ชั่วโมงเหนือขีด จำกัด ของพวกเขาไม่ส่งผลกระทบต่อค่าอื่น ๆ เช่นการเพิ่มนาทีของ10:59อัตราผลตอบแทนไม่ได้10:0011:00

ตัวอย่าง

ให้เวลาการป้อนข้อมูล13:58และขั้นตอน[(0,1),(0,1),(0,1),(0,0),(1,1),(1,0)],

  1. (0,1). สิ่งนี้สอดคล้องกับminuteการถูกกด 13:59เวลาขณะนี้
  2. (0,1). สิ่งนี้สอดคล้องกับminuteการถูกกด 13:00เวลาขณะนี้
  3. (0,1). สิ่งนี้สอดคล้องกับminuteการถูกกด 13:01เวลาขณะนี้
  4. (0,0). สิ่งนี้สอดคล้องกับปุ่มที่ไม่มีการกด เวลาไม่ได้รับผลกระทบคือตอนนี้13:01
  5. (1,1). สิ่งนี้สอดคล้องกับปุ่มทั้งสองที่ถูกกด 0:00เวลาขณะนี้
  6. (1,0)สิ่งนี้สอดคล้องกับhourการถูกกด 1:00เวลาขณะนี้

เนื่องจากเราลงท้ายด้วย1:00มันคือผลลัพธ์

I / O

อินพุตจะประกอบด้วยเวลาและลำดับสถานะของปุ่ม เอาท์พุทเป็นครั้งเดียว

เวลาอินพุตและเวลาเอาต์พุตอาจเป็น

  • 2 tuple (hour, minute)หรือ(minute, hour)ใน24เวลาของคุณเช่น(13, 30)( hourช่วงจาก0ถึง23และminuteช่วงจาก0ถึง59)
  • เช่นเดียวกับก่อนหน้านี้ แต่ใน12เวลา -hour และบูลีนam/ pmสวิทช์ ( hourช่วงจาก0ไป11หรือ12และ1จะ11มีminuteจาก0ไป59)
  • จำนวนนาทีตั้งแต่0:00เช่น 810 (จาก 0 ถึง 1439, รวม)
  • รูปแบบอื่นใดที่เข้ารหัสข้อมูลเดียวกัน

ลำดับของปุ่มสถานะเป็นการแสดงรายการของบูลีน 2-tuples ตัวอย่างเช่น:

  • รายการของสิ่งอันดับ: [(0,1),(1,0),(0,0),(1,1)]
  • สตริงที่คั่นด้วยช่องว่าง: "01 10 00 11"
  • สตริง: "01100011"
  • ในควอเทอนารี: [1,2,0,3]
  • แปลงเป็นจำนวนเต็ม: 99
  • รูปแบบอื่นใดที่เข้ารหัสข้อมูลเดียวกัน

กรณีทดสอบ

time,steps -> output
06:49,[(0, 1)] -> 06:50
12:23,[(1, 0)] -> 13:23
02:23,[(0, 1), (1, 0)] -> 03:24
21:40,[(0, 1), (0, 1), (0, 1), (0, 1)] -> 21:44
13:10,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (1, 1), (0, 1), (0, 1)] -> 00:02
21:33,[(1, 0), (0, 1), (1, 0), (0, 1)] -> 23:35
14:21,[(0, 1), (0, 1), (0, 1)] -> 14:24
02:39,[(0, 0), (0, 1)] -> 02:40
16:07,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1)] -> 19:16
17:55,[(0, 1), (1, 0), (0, 1)] -> 18:57
15:55,[(1, 0), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0)] -> 23:00
22:11,[(0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1)] -> 00:19
03:58,[(1, 0), (0, 0), (0, 0), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1)] -> 07:03
13:02,[(0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0)] -> 16:06
04:37,[(1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (1, 0)] -> 08:47
00:01,[(0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1)] -> 03:08
02:58,[(1, 0), (1, 0), (0, 1)] -> 04:59
01:43,[(0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1)] -> 04:52
07:54,[(1, 0), (0, 1), (1, 0), (1, 0), (1, 1)] -> 00:00
09:33,[(0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1)] -> 10:38
09:01,[(0, 1), (0, 1)] -> 09:03
19:04,[(0, 1), (1, 0), (0, 1), (1, 0)] -> 21:06
11:17,[(0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (1, 1), (0, 1), (0, 1)] -> 00:02
19:32,[(0, 1), (1, 0), (0, 1), (1, 0), (1, 0), (1, 0)] -> 23:34
17:31,[(0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 0), (1, 1), (0, 1)] -> 00:01
06:46,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1)] -> 18:16


กรณีทดสอบใน[h, m]รูปแบบด้วยขั้นตอน Quaternary
Justin Mariner

รูปแบบอินพุตของชุดข้อมูลสองชุดเป็นรายการเดียวที่ยอมรับได้หรือไม่ ยกตัวอย่างเช่น[[initialHour, initialMinute], [hourPressed1, minuitePressed1], [hourPressed2, minuitePressed2], ...]?
Jonathan Allan

@JanathanAllan ใช่
fireflame241

1200am คืออะไรในเวลาดิจิตอลปกติ
Ferrybig

คำตอบ:


8

เยลลี่ขนาด 13 ไบต์

_`+Ạ}?/%24,60

ลองออนไลน์!


หมายเหตุฉันไม่แน่ใจว่าเราสามารถไปข้างหน้าและใช้รูปแบบอินพุตนั้น (ดังนั้นฉันถาม) เนื่องจากสถานะ OP "ลำดับของปุ่มสถานะเป็นการแสดงรายการ"
Jonathan Allan

@JanathanAllan ถ้าเป็นเช่นนั้น OP จะแสดงความคิดเห็นในคำตอบของฉัน แต่ฉันใช้รูปแบบที่แน่นอนที่คุณใช้ในความคิดเห็นของคุณ ... บางครั้ง OP ก็ขี้เกียจหรือลืมที่จะอัปเดตความท้าทาย
Erik the Outgolfer


6

เยลลี่ ,  21  (17?) 19 ไบต์

17 ไบต์ - หากรูปแบบการป้อนข้อมูล: [[initHour, initMinute], [a1, b1], [a2, b2], ...]ยอมรับได้เราจะมีลิงค์แบบ monadic และอาจลบออกW;จากจุดเริ่มต้นของบรรทัดที่สอง

หมายเหตุ: นี่คือการบรรจบกันกับคำตอบของ Erik the Outgolfers Jellyดังนั้นฉันจะไม่รบกวนการเล่นกอล์ฟมากขึ้น (ฉันไม่เคยเห็น)

N⁹⁹Ạ¤?+⁸
W;ç/%24,60

ลิงก์ dyadic จะแสดงรายการเวลาเริ่มต้นเป็นจำนวนเต็ม[hour, minute](24 ชั่วโมง) ทางด้านซ้ายและรายการปุ่มสถานะ[[hourPressed, minPressed], ...]ทางด้านขวา
ซึ่งส่งคืนรายการเวลาสิ้นสุดผลลัพธ์เป็นจำนวนเต็มอีกครั้ง[hour, minute](24 ชั่วโมง)

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

N⁹⁹Ạ¤?+⁸ - Link 1, nextState: list, currentState [cH, cM]; list, presses [pH, pM]
     ?   - if:
    ¤    - ...condition: nilad followed by link(s) as a nilad:
  ⁹      -   chain's right argument, presses
   Ạ     -   all truthy? (1 for [1,1] 0 otherwise)
N        - ...then: negate (the left argument, currentState, i.e. [-cH, -cM])
 ⁹       - ...else: chain's right argument, presses
       ⁸ - chain's left argument, currentState
      +  - add
           i.e.: if presses was [1,1] then [cH+-cH,cM+-cM]=[0,0]
                 otherwise [cH+pH,cM+cM]

W;ç/%24,60
     24,60 - literal list of integers [24,60]
    %      - modulo by (vectorises)

-1 ไบต์โดยการแทนที่ด้วย⁹Ạ¤ อีก -2สำหรับการใช้รูปแบบที่ได้รับอนุญาต สุดท้ายอีก -1เพราะห่วงโซ่ก่อนที่นี่จะเรียกว่าเป็นคู่ .. มีẠ}µ
เอริก Outgolfer

6

Python 2 , 84 75 ไบต์

lambda c,a:reduce(lambda(h,m),(d,e):(d&e)and(0,0)or((h+d)%24,(m+e)%60),a,c)

ลองออนไลน์!

ฟังก์ชั่นที่ต้องใช้เวลาเป็นสิ่งอันดับ (ชั่วโมงนาที); แสดงผลแบบเดียวกัน


-3 ไบต์โดยใช้all(b)แทนb[0]&b[1]:lambda c,a:reduce(lambda t,b:all(b)and((t[0]+b[0])%24,(t[1]+b[1])%60)or(0,0),a,c)
Erik the Outgolfer


lambda(h,m),(d,e):รูปแบบนี้ตรงกันใน Python หรือไม่?
Quelklef

5

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

.*,1:1
:
\d+
$*
O`\D1*
,

1>`:

+`1{24}:|:1{60}
:
(?<=^|:)1*
$.&
\b\d\b
0$&

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

.*,1:1
:

ลบทุกอย่างจนถึงและรวมถึงการกดปุ่มสองครั้งสุดท้ายแทนที่ด้วยเวลาว่าง (ในกรณีที่เป็นการกดปุ่มสุดท้าย)

\d+
$*

แปลงเป็นเอก

O`\D1*

เรียงนาทีไปยังจุดสิ้นสุด

,

เพิ่มชั่วโมงเข้าด้วยกัน

1>`:

เพิ่มนาทีด้วยกัน แต่แยกชั่วโมง

+`1{24}:|:1{60}
:

ลดโมดูโลชั่วโมงและนาที 24 หรือ 60 ตามความเหมาะสม

(?<=^|:)1*
$.&

แปลงเป็นทศนิยม

\b\d\b
0$&

จัดรูปแบบเป็นตัวเลขสองหลัก


4

Python 3, 135 117 115 ไบต์

-20 ไบต์ขอบคุณ Jonathan Frech

def a(m,f):
 for b,c in f:
  if b&c:m=[0,0]
  elif b:m[0]=-~m[0]*(m[0]<23)
  elif c:m[1]=-~m[1]*(m[1]<59)
 return m

ลองออนไลน์!

[hour, minute]ต้องใช้เวลาเป็นรายการในรูปแบบที่


คุณอาจจะสามารถที่จะแทนที่(m[0]+1)ด้วย-~m[0]และมีif m[0]<23 else 0 *(m[0]<23)
Jonathan Frech

นอกจากนี้ในฐานะbและcมักจะมีค่าบูลีนคุณสามารถแทนที่ด้วยb+c>1 b&c
Jonathan Frech

76 ไบต์ (ลิงค์สั้นลงเนื่องจาก TIO เป็นขนาดใหญ่กล่อง comment)
Halvard ฮัมเมล


4

JavaScript (ES6), 55 ไบต์

t=>a=>a.map(x=>x>2?t=[0,0]:t[x-1]++)&&[t[0]%60,t[1]%24]

รับอินพุตในรูปแบบ currying โดยมีเวลาเริ่มต้นในรูปแบบอาร์เรย์[min, hour]และขั้นตอนเป็นอาร์เรย์แบบ Quaternary เวลาเอาต์พุตอยู่ในรูปแบบเดียวกับเวลาอินพุต

กรณีทดสอบ


3

Perl 6 , 40 ไบต์

{.reduce({(@^a Z+@^b)X*!@b.min})Z%24,60}

ลองออนไลน์!

ทำรายการที่มีเวลาเริ่มต้นตามด้วยการกดปุ่ม ส่งคืนเวลาสิ้นสุด เวลาและปุ่มเป็น(hour, minute)คู่ เวลา 24 ชั่วโมง


3

Perl 5 , 70 ไบต์

รหัสขนาด 69 ไบต์ + 1 สำหรับการ-nตั้งค่าสถานะ

s/.*d/0:0/;/(.*):(\d+)/;printf"%02d:%02d",($1+y/c//)%24,($2+y/b//)%60

ลองออนไลน์!

รูปแบบอินพุต

hh:mm,abcdabcdabcdaddccbbaa

ที่อยู่:

hh=start hour
mm=start minute
 a = (0, 0) = no buttons pressed
 b = (0, 1) = minute button pressed
 c = (1, 0) = hour button pressed
 d = (1, 1) = both buttons pressed

ช่องว่างหรือตัวคั่นอื่น ๆ ระหว่างการกดนั้นไม่มีนัยสำคัญ

คำอธิบาย

s/.*d/0:0/;    # If both buttons were ever pressed, previous presses
               # don't matter.  Get rid of them and set start time to midnight.
/(.*):(\d+)/;  # Extract start hour and minute
printf"%02d:%02d",            # Output numbers with leading 0
($1+y/c//)%24,                # Take starting hour, add number of presses, remainder 24
($2+y/b//)%60                 # Take starting minute, add number of presses, remainder 24

3

สวิฟท์ , 106 96 ไบต์

-10 ขอบคุณ Xcoder

func x(m:(Int,Int),n:[(Int,Int)]){let i=n.reduce(m){($0.0+$1.0,$0.1+$1.1)};print(i.0%24,i.1%60)}

ลองใช้กับ ideone!

ฟังก์ชั่นจะใช้ค่าเริ่มต้นและอาร์เรย์ของสิ่งอันดับและส่งกลับครั้งสุดท้าย


96 ไบต์โดยพิมพ์ไป STDOUT func x(m:(Int,Int),n:[(Int,Int)]){let i=n.reduce(m){($0.0+$1.0,$0.1+$1.1)};print(i.0%24,i.1%60)}แทน: typealiasนอกจากนี้ยังได้รับการกำจัดของ
Mr. Xcoder

1
ยังไงก็ตามยินดีต้อนรับสู่ PPCG! คำตอบแรกที่น่าตื่นตาตื่นใจ
Mr. Xcoder

ขอบคุณมากจริง ๆ แล้วฉันใช้ print () ก่อน ... แต่ฉันลืมหลังจากสลับระหว่างการใช้งานที่แตกต่างกัน ขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ
Naresh

1

โลโก้ Terrapin ขนาด 304 ไบต์

ไม่ปรับให้เหมาะสม ช่องว่างมากมาย

MAKE "M :B MAKE "H :A LABEL "L IF EMPTY? :I OP LIST :H :M MAKE "C FIRST :I IF AND ((ITEM 2 :C)=1) ((ITEM 1 :C) = 0) MAKE "M :M+1 IF :M=60 MAKE "M 0 IF AND ((ITEM 1 :C) = 1) ((ITEM 2 :C)=1 MAKE "M 0 MAKE "H 0 IF AND ((ITEM 1 :C)-1) ((ITEM 2 :C) = 0) MAKE "H :H + 1 IF :H = 23 MAKE "H 0 MAKE "I BF :I GO "L

ใช้รายการเป็นอินพุตแรกและชั่วโมงเริ่มต้น + นาที (อินพุตแยก) เป็นวินาทีและสามตามลำดับ

ฉันไม่สามารถคัดลอก + วางจากโลโก้ Terrapin ได้เนื่องจากเป็นรุ่นทดลองนั่นคือ :(


1

R , 61 ไบต์

function(I,B){for(b in B)I=I+"if"(sum(b)>1,-I,b)
I%%c(24,60)}

ใช้Iเป็นเวกเตอร์ความยาว 2 c(H,M)และBเป็นรายการของเวกเตอร์ความยาว 2 สำหรับปุ่ม, c(H,M). iterates ผ่านBการตั้งค่าIไปถ้ารวมเป็นc(0,0) 2จากนั้นมันจะปรับลงในตอนท้าย นอกจากนี้ยังมีฟังก์ชั่นในส่วนหัวเพื่อแปลปุ่มกดเป็นรูปแบบ R ที่ถูกต้องหากคุณต้องการทดสอบพวกเขาทั้งหมด มันต้องใช้อาร์เรย์[(H,M),...]เป็นสตริง

ลองออนไลน์!


1

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

(n,l)=>{for(int i=0,x;i<n.Length;){x=n[i++];if(x>1)l[0]=l[1]=0;else{l[x]=++l[x]%(24+36*x);}}}

ลองออนไลน์!

ใช้อินพุตเหมือนใน trinary โดยมี 0 == (1,0), 1 == (0,1), 2 == (1,1) และเวลาในอาร์เรย์ที่มีดัชนี 0 เป็นชั่วโมงและ 1 นาที ปรับเปลี่ยนอาร์เรย์เวลาในสถานที่



0

Mathematica, 54 ไบต์

Switch[#2,a={0,0},#,a+1,a,_,Mod[+##,{24,60}]]&~Fold~#&

ฟังก์ชั่นไม่ระบุชื่อ รับรายการของ 2-tuples เป็นอินพุตและส่งคืน 2-tuple เป็นเอาต์พุต


0

สกาลา , 116 ไบต์

ดังนั้นฉันจึงใช้เวลาเริ่มต้นเป็นพารามิเตอร์สองตัวแรกของ func ( hและm) ของฉันและฉันใช้ลำดับอินพุตเป็น Array [Tuple2]

var x=h
var y=m
for(u<-a)u match{case (0,1)=>y=(y+1)%60
case (1,0)=>x=(x+1)%24
case (1,1)=>{x=0;y=0}
case _=>}
(x,y)

ฉันสงสัยว่า ... ฉันควรนับการประกาศ func ( def time(h:Int,m:Int,a:Array[Tuple2[Int,Int]]):Tuple2[Int,Int]={รวมถึงจุดสิ้นสุด}) เป็นจำนวนไบต์หรือไม่

ลองออนไลน์!

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