Mô phỏng Đồng hồ báo thức cũ ngu ngốc của tôi


25

Tôi có một chiếc đồng hồ báo thức cũ ngu ngốc với hai nút: hourminute. Các hournút increments giờ của một báo động thiết lập, và minutegia tăng thời gian phút của một báo động thiết lập. Tuy nhiên, một số nhà thiết kế thông minh nhận ra rằng nhấn cả hai nút cùng một lúc sẽ có ý nghĩa và quyết định rằng nhấn hourminuteđồng thời sẽ khiến báo thức được đặt thành 12:00 am/ 0:00. Nhiệm vụ của bạn là mô phỏng hành vi này.

Bài tập

Đưa ra thời gian bắt đầu và một chuỗi các trạng thái nút, tìm ra thời gian kết thúc.

Bắt đầu từ thời gian bắt đầu, tăng số giờ cho mỗi lần xuất hiện (1,0), tăng số phút cho mỗi lần xuất hiện (0,1)và đặt thời gian 0:00cho mỗi lần xuất hiện (1,1). Các trạng thái (0,0)nên được bỏ qua vì chúng tương ứng với không nhấn nút nào.

Khi thêm vào phút và giờ, nếu số phút / giờ vượt quá mức tối đa, hãy đặt nó thành 0, tức là tăng giá trị phút 59nên đặt giá trị phút thành 0và tăng giá trị giờ 23nên đặt giá trị giờ thành 0. Việc tăng các giá trị phút / giờ vượt quá giới hạn của chúng không ảnh hưởng đến giá trị khác, ví dụ, tăng số phút 10:59lợi tức 10:00, không 11:00.

Thí dụ

Cho thời gian 13:58và bước đầu vào [(0,1),(0,1),(0,1),(0,0),(1,1),(1,0)],

  1. (0,1). Điều này tương ứng với minuteviệc được nhấn. Hiện tại là 13:59.
  2. (0,1). Điều này tương ứng với minuteviệc được nhấn. Hiện tại là 13:00.
  3. (0,1). Điều này tương ứng với minuteviệc được nhấn. Hiện tại là 13:01.
  4. (0,0). Điều này tương ứng với không nhấn nút. Thời gian, không bị ảnh hưởng, bây giờ13:01
  5. (1,1). Điều này tương ứng với cả hai nút được nhấn. Hiện tại là 0:00.
  6. (1,0)Điều này tương ứng với hourviệc được nhấn. Hiện tại là 1:00.

Kể từ khi chúng tôi kết thúc 1:00, nó là đầu ra.

Tôi / O

Đầu vào sẽ bao gồm thời gian và một chuỗi các trạng thái nút. Đầu ra là một lần duy nhất.

Thời gian đầu vào và thời gian đầu ra có thể là

  • một tuple 2 (hour, minute)hoặc (minute, hour)trong 24thời gian hai giờ như (13, 30)( hourphạm vi từ 0đến 23minutephạm vi từ 0đến 59)
  • giống như trước nhưng trong 12thời gian-giờ và một Boolean am/ pmswitch ( hourdao động từ 0để 11hay 121đến 11với minutetừ 0để 59).
  • một số phút kể từ 0:00như 810 (từ 0 đến 1439, bao gồm)
  • bất kỳ định dạng nào khác mã hóa cùng một thông tin

Chuỗi các trạng thái nút là một đại diện của một danh sách các bộ 2 Boolean, ví dụ:

  • một danh sách các bộ dữ liệu: [(0,1),(1,0),(0,0),(1,1)]
  • một chuỗi giới hạn không gian: "01 10 00 11"
  • một chuỗi: "01100011"
  • trong Đệ tứ: [1,2,0,3]
  • chuyển đổi thành một số nguyên: 99
  • bất kỳ định dạng nào khác mã hóa cùng một thông tin

Các trường hợp thử nghiệm

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



Là một định dạng đầu vào của hai bộ dữ liệu là một danh sách có thể chấp nhận? Chẳng hạn [[initialHour, initialMinute], [hourPressed1, minuitePressed1], [hourPressed2, minuitePressed2], ...]?
Jonathan Allan

@Jonathan Allan Có.
fireflame241

1200am có nghĩa là gì trong thời gian kỹ thuật số bình thường?
Ferrybig

Câu trả lời:


8

Thạch , 13 byte

_`+Ạ}?/%24,60

Hãy thử trực tuyến!


Lưu ý, tôi không chắc chúng ta có thể tiếp tục và sử dụng định dạng đầu vào đó (vì vậy tôi đã hỏi) vì OP tuyên bố "Trình tự các trạng thái nút là một đại diện của một danh sách".
Jonathan Allan

@Jonathan ALLan nếu vậy thì OP sẽ nhận xét về câu trả lời của tôi nhưng tôi đang sử dụng định dạng chính xác mà bạn đã sử dụng trong nhận xét của mình ... đôi khi OP lười biếng hoặc quên cập nhật thử thách
Erik the Outgolfer


6

Jelly ,  21  (17?) 19 byte

17 byte? - Nếu định dạng đầu vào: [[initHour, initMinute], [a1, b1], [a2, b2], ...]có thể chấp nhận được, chúng tôi sẽ có một liên kết đơn âm và có thể xóa W;khỏi đầu dòng thứ hai.

Lưu ý: Điều này hiện đang hội tụ về câu trả lời của Erik the Outgolfers Jelly , vì vậy tôi sẽ không bận tâm đến việc chơi gôn nữa (tôi đã không nhìn thấy nó) ...

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

Một liên kết dyadic lấy danh sách thời gian ban đầu là số nguyên [hour, minute](24 giờ) ở bên trái và danh sách các trạng thái nút [[hourPressed, minPressed], ...]ở bên phải
trả về danh sách thời gian kết quả cuối cùng dưới dạng số nguyên, một lần nữa [hour, minute](24 giờ).

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm

Làm sao?

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 byte bằng cách thay thế ⁹Ạ¤bằng Ạ}. -2 khác để sử dụng một định dạng được phép. Cuối cùng, -1 khác vì chuỗi trước µđây được gọi là dyad ..
Erik the Outgolfer

6

Python 2 , 84 75 byte

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

Hãy thử trực tuyến!

Chức năng mất thời gian như một tuple (giờ, phút); đầu ra cùng một cách.


-3 byte bằng cách sử dụng all(b)thay vì 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 Outgolfer


lambda(h,m),(d,e):mẫu này có khớp với Python không!?
Quelklef

5

Võng mạc , 75 byte

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

1>`:

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

.*,1:1
:

Xóa mọi thứ lên đến và bao gồm lần nhấn nút đôi cuối cùng, thay thế nó bằng thời gian trống (trong trường hợp đó là lần nhấn nút cuối cùng).

\d+
$*

Chuyển đổi sang unary.

O`\D1*

Sắp xếp các phút để kết thúc.

,

Thêm giờ với nhau.

1>`:

Thêm các phút với nhau, nhưng giữ cho giờ riêng biệt.

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

Giảm số giờ và phút modulo 24 hoặc 60 khi thích hợp.

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

Chuyển đổi thành số thập phân.

\b\d\b
0$&

Định dạng thành hai chữ số.


4

Python 3, 135 117 115 byte

-20 byte nhờ 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

Hãy thử trực tuyến!

Mất thời gian như một danh sách trong mẫu [hour, minute].


Bạn có thể thay thế (m[0]+1)bằng -~m[0]if m[0]<23 else 0với *(m[0]<23).
Jonathan Frech

Ngoài ra, như bcluôn luôn là các giá trị boolean, bạn có thể thay thế b+c>1bằng b&c.
Jonathan Frech

76 byte (Liên kết rút ngắn, do TIO quá lớn cho hộp bình luận)
Halvard Hummel


4

JavaScript (ES6), 55 byte

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

Đưa đầu vào theo cú pháp currying, với thời gian bắt đầu ở dạng mảng [min, hour]và các bước dưới dạng mảng Đệ tứ. Thời gian đầu ra có cùng định dạng với thời gian đầu vào.

Các trường hợp thử nghiệm


3

Perl 6 , 40 byte

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

Hãy thử trực tuyến!

Đưa ra một danh sách chứa thời gian bắt đầu theo sau là nhấn nút. Trả về thời gian kết thúc. Thời gian và nút là (hour, minute)cặp. Thời gian 24 giờ.


3

Perl 5 , 70 byte

69 byte mã + 1 cho -ncờ

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

Hãy thử trực tuyến!

Định dạng đầu vào

hh:mm,abcdabcdabcdaddccbbaa

Ở đâu:

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

Khoảng cách hoặc các dải phân cách khác giữa các máy ép là không đáng kể.

Giải trình

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

Swift , 106 96 byte

-10, nhờ 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)}

Hãy thử nó trên ideone!

Hàm sẽ lấy giá trị ban đầu và mảng các bộ dữ liệu và trả về thời gian cuối cùng.


Thay vào đó, 96 byte , bằng cách in sang 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)}. Điều này cũng được loại bỏ typealias.
Ông Xcoder

1
Nhân tiện, chào mừng bạn đến với PPCG! Câu trả lời đầu tiên tuyệt vời.
Ông Xcoder

cảm ơn bạn rất nhiều, thực sự tôi đã sử dụng print () trước tiên ... nhưng tôi đã quên sau khi chuyển đổi giữa các triển khai khác nhau. Cảm ơn một lần nữa vì sự giúp đỡ của bạn.
Naresh

1

Logo Terrapin, 304 byte

Không được tối ưu hóa; nhiều không gian.

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

Lấy danh sách làm đầu vào đầu tiên và giờ bắt đầu + phút (đầu vào riêng biệt) lần lượt là thứ hai và thứ ba.

Tôi không thể sao chép + dán từ Logo Terrapin vì đây là phiên bản dùng thử nên đó là :(


1

R , 61 byte

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

Lấy Ilàm một vectơ có độ dài 2 c(H,M)Bnhư một danh sách các vectơ có độ dài 2 cho các nút , c(H,M). Lặp thông qua B, thiết lập Iđể c(0,0)nếu tổng là 2. Sau đó, nó mod xuống ở cuối. Ngoài ra còn có một chức năng trong tiêu đề để dịch các nút nhấn sang định dạng R bên phải nếu bạn muốn kiểm tra tất cả; nó lấy mảng [(H,M),...]làm chuỗi.

Hãy thử trực tuyến!


1

C # (.NET Core) , 93 byte

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

Hãy thử trực tuyến!

Lấy đầu vào như trong nhị phân, với 0 == (1,0), 1 == (0,1), 2 == (1,1) và thời gian trong một mảng với chỉ số 0 là giờ và 1 là phút. Sửa đổi mảng thời gian tại chỗ.



0

Toán học, 54 byte

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

Chức năng ẩn danh. Lấy danh sách 2 tup làm đầu vào và trả về 2 tuple làm đầu ra.


0

Scala , 116 byte

Vì vậy, tôi chỉ lấy thời gian bắt đầu làm hai tham số đầu tiên của func ( hm) của mình và tôi lấy chuỗi đầu vào là một mảng [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)

Tôi tự hỏi ... tôi có nên đếm khai báo func ( def time(h:Int,m:Int,a:Array[Tuple2[Int,Int]]):Tuple2[Int,Int]={cộng với kết thúc }) bằng số byte không?

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.