Simulasikan Jam Alarm Lama Bodohku

25

Saya memiliki jam alarm tua yang bodoh dengan dua tombol: hourdan minute. The hourtombol increment jam alarm set, dan minutekenaikan waktu menit alarm set. Namun, beberapa perancang pintar menyadari bahwa menekan kedua tombol pada saat yang sama harus memiliki makna, dan memutuskan bahwa menekan hourdan minutesecara bersamaan akan menyebabkan alarm diatur ke 12:00 am/ 0:00. Tugas Anda adalah untuk mensimulasikan perilaku ini.

Tugas

Diberikan waktu mulai dan urutan status tombol, cari tahu waktu akhir.

Mulai dari waktu mulai, naikkan jam untuk setiap kemunculan (1,0), tambah menit untuk setiap kemunculan (0,1), dan atur waktu untuk 0:00untuk setiap kemunculan (1,1). Status (0,0)harus diabaikan karena tidak sesuai dengan tombol yang ditekan.

Ketika menambahkan ke menit dan jam, jika menit / jam berjalan di atas maksimum, atur ke 0, yaitu, penambahan nilai menit 59harus mengatur nilai menit ke 0dan kenaikan nilai jam 23harus mengatur nilai jam 0. Menambah nilai menit / jam di atas batasnya tidak memengaruhi nilai lainnya, misalnya menambah menit 10:59hasil 10:00, bukan 11:00.

Contoh

Mengingat waktu 13:58dan langkah input [(0,1),(0,1),(0,1),(0,0),(1,1),(1,0)],

  1. (0,1). Ini sesuai dengan minutepenekanan. Waktunya sekarang 13:59.
  2. (0,1). Ini sesuai dengan minutepenekanan. Waktunya sekarang 13:00.
  3. (0,1). Ini sesuai dengan minutepenekanan. Waktunya sekarang 13:01.
  4. (0,0). Ini sesuai dengan tidak ada tombol yang ditekan. Waktu, tidak terpengaruh, sekarang13:01
  5. (1,1). Ini sesuai dengan kedua tombol yang sedang ditekan. Waktunya sekarang 0:00.
  6. (1,0)Ini sesuai dengan hourpenekanan. Waktunya sekarang 1:00.

Karena kita berakhir dengan 1:00, itu adalah output.

I / O

Input akan terdiri dari waktu dan urutan status tombol. Outputnya adalah satu kali.

Waktu input dan waktu output mungkin

  • 2-tupel (hour, minute)atau (minute, hour)dalam 24-jam waktu seperti (13, 30)( hourberkisar dari 0ke 23dan minuteberkisar dari 0ke 59)
  • sama seperti sebelumnya tetapi dalam 12waktu -hour dan Boolean am/ pmswitch ( hourberkisar dari 0ke 11atau 12dan 1untuk 11dengan minutedari 0ke 59).
  • beberapa menit sejak 0:00seperti 810 (dari 0 hingga 1439, inklusif)
  • format lain yang menyandikan informasi yang sama

Urutan status tombol adalah representasi dari daftar Boolean 2-tupel, misalnya:

  • daftar tuple: [(0,1),(1,0),(0,0),(1,1)]
  • string yang dibatasi ruang: "01 10 00 11"
  • Sebuah benang: "01100011"
  • di Kuarter: [1,2,0,3]
  • dikonversi menjadi integer: 99
  • format lain yang menyandikan informasi yang sama

Uji Kasus

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
fireflame241
sumber
4
Sangat terkait
Stephen
Apakah format input dari dua set data sebagai satu daftar dapat diterima? Misalnya [[initialHour, initialMinute], [hourPressed1, minuitePressed1], [hourPressed2, minuitePressed2], ...]?
Jonathan Allan
@ JonathanAllan Ya.
fireflame241
Apa arti 1200 jam dalam waktu digital normal?
Ferrybig

Jawaban:

8

Jelly , 13 byte

_`+Ạ}?/%24,60

Cobalah online!

Erik the Outgolfer
sumber
Catatan, saya tidak yakin kita bisa melanjutkan dan menggunakan format input itu (jadi saya bertanya) karena OP menyatakan "Urutan tombol menyatakan representasi daftar".
Jonathan Allan
@JonathanAllan jika demikian maka OP akan mengomentari jawaban saya tapi saya menggunakan format yang tepat yang Anda gunakan dalam komentar Anda ... kadang-kadang OP malas atau lupa untuk memperbarui tantangan
Erik the Outgolfer
6

C, 89 87 byte

Terima kasih kepada @Jonathan Frech karena telah menghemat dua byte!

f(h,m,s)char*s;{for(;*s;++s)*s++&1?*s&1?h=m=0:++h:*s&1&&++m;printf("%d %d",h%24,m%60);}

Cobalah online!

Steadybox
sumber
6

Jelly ,  21  (17?) 19 byte

17 byte? - Jika format input: [[initHour, initMinute], [a1, b1], [a2, b2], ...]dapat diterima, kami akan memiliki tautan monadik dan dapat menghapus W;dari awal baris kedua.

Catatan: Ini sekarang mengarah ke jawaban Erik the Outgolfers Jelly , jadi saya tidak akan repot-repot bermain golf lagi (saya belum melihatnya) ...

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

Tautan diad mengambil daftar waktu awal sebagai bilangan bulat [hour, minute](24 jam) di sebelah kiri dan daftar tombol menyatakan [[hourPressed, minPressed], ...]di sebelah kanan
yang mengembalikan daftar waktu hasil akhir sebagai bilangan bulat, lagi [hour, minute](24 jam).

Cobalah online! atau lihat test-suite

Bagaimana?

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)
Jonathan Allan
sumber
-1 byte dengan mengganti ⁹Ạ¤dengan Ạ}. Lain -2 untuk menggunakan format yang diizinkan. Akhirnya, -1 lain karena rantai sebelum di µsini disebut sebagai angka dua ..
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)

Cobalah online!

Fungsi yang membutuhkan waktu sebagai tuple (jam, menit); output dengan cara yang sama.

Chas Brown
sumber
-3 byte dengan menggunakan all(b)alih-alih 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
73 bytes
Halvard Hummel
lambda(h,m),(d,e):Apakah pola ini cocok dengan Python !?
Quelklef
5

Retina , 75 byte

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

1>`:

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

.*,1:1
:

Hapus semuanya hingga dan termasuk tombol ganda terakhir tekan, ganti dengan waktu kosong (kalau-kalau itu tombol terakhir tekan).

\d+
$*

Konversikan ke unary.

O`\D1*

Sortir menit hingga akhir.

,

Tambahkan jam bersama.

1>`:

Tambahkan menit bersama-sama, tetapi jaga jamnya terpisah.

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

Kurangi jam dan menit modulo 24 atau 60 sesuai kebutuhan.

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

Konversikan ke desimal.

\b\d\b
0$&

Memformat menjadi dua digit.

Neil
sumber
4

Python 3, 135 117 115 byte

-20 byte terima kasih kepada 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

Cobalah online!

Mengambil waktu sebagai daftar dalam formulir [hour, minute].

Lirik
sumber
Anda mungkin dapat mengganti (m[0]+1)dengan -~m[0]dan if m[0]<23 else 0dengan *(m[0]<23).
Jonathan Frech
Juga, karena bdan cselalu nilai boolean, Anda bisa menggantinya b+c>1dengan b&c.
Jonathan Frech
76 byte (Tautan pendek, karena TIO terlalu besar untuk kotak komentar)
Halvard Hummel
4

Haskell , 58 byte

foldl(#)
_#(1,1)=(0,0)
(h,m)#(x,y)=(mod(h+x)24,mod(m+y)60)

Cobalah online! Contoh penggunaan: foldl(#) (23,58) [(0,1),(1,0),(0,0),(0,1),(0,1)].

Laikoni
sumber
4

JavaScript (ES6), 55 byte

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

Mengambil input dalam sintaks currying, dengan waktu mulai dalam bentuk array [min, hour]dan langkah-langkah sebagai array Kuarter. Waktu keluaran dalam format yang sama dengan waktu input.

Uji Kasus

Justin Mariner
sumber
3

Perl 6 , 40 byte

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

Cobalah online!

Mengambil daftar yang berisi waktu mulai diikuti oleh tombol yang ditekan. Mengembalikan waktu akhir. Waktu dan tombol (hour, minute)berpasangan. Waktu 24 jam.

nwellnhof
sumber
3

Perl 5 , 70 byte

69 byte kode +1 untuk -nbendera

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

Cobalah online!

Masukkan format

hh:mm,abcdabcdabcdaddccbbaa

dimana:

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

Spasi atau pemisah lain di antara mesin cetak tidak signifikan.

Penjelasan

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
Xcali
sumber
3

Swift , 106 96 byte

-10, terima kasih kepada 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)}

Cobalah di ideone!

fungsi akan mengambil nilai awal dan array tupel dan mengembalikan waktu akhir.

Naresh
sumber
96 byte , dengan mencetak ke stdout sebagai gantinya: 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)}. Ini juga menghilangkan typealias.
Tn. Xcoder
1
Ngomong-ngomong, selamat datang di PPCG! Jawaban pertama yang luar biasa.
Tn. Xcoder
terima kasih banyak, sebenarnya saya menggunakan print () pertama ... tapi saya lupa setelah beralih di antara implementasi yang berbeda. Sekali lagi terima kasih atas bantuan Anda.
Naresh
1

Logo Terrapin, 304 bytes

Tidak dioptimalkan; banyak ruang.

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

Mengambil daftar sebagai input pertama dan jam awal + menit (input terpisah) masing-masing sebagai kedua dan ketiga.

Saya tidak dapat menyalin + menempel dari Logo Terrapin karena ini adalah versi uji coba jadi itu :(

Adrian Zhang
sumber
1

R , 61 byte

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

Dibawa Isebagai vektor panjang-2 c(H,M)dan Bsebagai daftar panjang-2 vektor untuk tombol c(H,M),. Beriterasi B, pengaturan Iuntuk c(0,0)jika jumlahnya adalah 2. Kemudian mod turun di akhir. Ada juga fungsi di header untuk menerjemahkan penekanan tombol ke format R yang tepat jika Anda ingin menguji semuanya; dibutuhkan array [(H,M),...]sebagai string.

Cobalah online!

Giuseppe
sumber
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);}}}

Cobalah online!

Mengambil input seperti pada trinary, dengan 0 == (1,0), 1 == (0,1), 2 == (1,1), dan waktu dalam array dengan indeks 0 menjadi jam dan 1 menjadi menit. Memodifikasi susunan waktu pada tempatnya.

jkelm
sumber
0

Mathematica, 54 byte

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

Fungsi anonim. Mengambil daftar 2-tupel sebagai input dan mengembalikan 2-tupel sebagai output.

LegionMammal978
sumber
0

Scala , 116 byte

Jadi saya hanya mengambil waktu mulai sebagai dua parameter pertama dari func saya ( hdan m), dan saya mengambil urutan input sebagai 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)

Saya bertanya-tanya ... haruskah saya menghitung deklarasi func ( def time(h:Int,m:Int,a:Array[Tuple2[Int,Int]]):Tuple2[Int,Int]={ditambah akhir }) dalam hitungan byte?

Cobalah online!

V. Courtois
sumber