Jam Alarm saya
Saya orang Amerika, dan begitu juga jam alarm (digital) saya. Untuk mengatur alarm, itu dimulai pada waktu sebelumnya. Menekan tombol jam memindahkannya satu jam, dan menekan tombol menit bergerak naik satu menit. Menekan kedua tombol pada saat yang sama mengatur ulang ke tengah malam (12:00 pagi), dan dihitung sebagai dua tombol yang ditekan.
Ketika jam melebihi batasnya (12), reset ke 1 dan matikan lampu AM / PM. Ketika menit melebihi batasnya (59), mereka mengatur ulang ke 0, tanpa mempengaruhi jam.
Tugas
Tugas Anda adalah, diberi waktu mulai dan waktu target, untuk menampilkan jumlah tombol yang optimal yang diperlukan untuk mengatur alarm saya ke waktu target.
Anda dapat mengambil input dalam format apa pun yang paling cocok untuk Anda. Satu-satunya data yang perlu program Anda adalah jam dan menit, untuk kedua input. Itu berarti bahwa Anda, misalnya, dapat mengambil data sebagai milidetik sejak zaman, dan mengekstrak jam dan menit, tetapi Anda tidak dapat menyandikan apa pun ke tahun, bulan, detik, dll. Perhatikan bahwa saat Anda dapat, misalnya, input menggunakan "Waktu militer" (atau waktu reguler untuk sebagian besar dunia), tetapi itu tidak mengubah cara jam saya bekerja.
Contohnya
1:15 pm -> 2:30 am
Anda dapat menekan kedua tombol ke bawah untuk mengatur ulang hingga pukul 12:00 pagi, lalu naik menjadi 02:30, yang merupakan 2+2+30 = 34
penekanan tombol. Anda juga bisa menambah hingga 02:30, yang akan menjadi 13+15 = 28
penekanan tombol. Karena itu, output Anda 28
.
3:58 am -> 4:02 am
Anda dapat mengatur ulang dan menambah, yang merupakan 2+4+2 = 8
penekanan tombol. Anda juga bisa menambahkan, yang merupakan 1+4 = 5
penekanan tombol. Karena itu, output Anda 5
.
10:55 pm -> 1:00 am
Anda dapat mengatur ulang dan menambah, yang merupakan 2+1 = 3
penekanan tombol. Anda juga bisa menambahkan, yang merupakan 3+5=8
penekanan tombol. Karena itu, output Anda 3
.
1:00 am -> 1:59 pm
Anda bisa mengatur ulang dan menambah, tetapi itu akan menjadi tiga penekanan lebih dari sekadar menambah. Karena itu, output Anda 12+59 =
71
.
Uji Kasus
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
sumber
Jawaban:
Sekam , 16 byte
Cobalah online!
Membawa argumen sebagai dua daftar [jam, menit], untuk waktu mulai dan berakhir, dalam format 24 jam.
Saya cukup senang tentang seberapa banyak saya bisa bermain golf yang satu ini, saya merasa menarik bagaimana argumen dikelola dalam komposisi fungsi ini.
Fungsi yang menghitung berapa banyak penekanan tombol yang kita butuhkan jika reset tidak diizinkan adalah sebagai berikut:
Bagian yang menarik adalah bahwa karena sisa solusi ini hanya dapat berfungsi dengan satu daftar sebagai argumen, yang satu ini akan diterapkan sebagian pada argumen pertama dari keseluruhan program, "memakannya" dan hanya menyisakan argumen kedua yang terlihat baik untuk dirinya sendiri maupun sisa program.
Selanjutnya, kita menghitung berapa banyak penekanan tombol yang kita butuhkan jika kita mereset waktu ke 0:00
Seperti yang dikatakan sebelumnya, ini hanya beroperasi pada argumen kedua (waktu terakhir), dan menghitung
hours+minutes+2
, hanya dengan cara golf.Akhirnya,
§▼
adalah bagian yang meneruskan argumen kedua ke kedua fungsi, dan mengembalikan yang lebih rendah dari dua hasil.sumber
JavaScript (ES6),
7356545250 byteMenggunakan format 24 jam. Mengambil input sebagai 4 bilangan bulat yang mewakili jam & menit setiap kali.
Cobalah
Masukkan waktu dalam format 24 jam, dengan
:
pemisah.Penjelasan
(Akan segera diperbarui.)
Fungsi anonim mengambil bilangan bulat sebagai argumen melalui parameter
g
,l
,h
&m
, di manag
&l
masing-masing adalah, jam & menit dari waktu saat ini danh
&m
adalah jam & menit dari target waktu.Pertama, kami menghitung berapa banyak penekanan tombol yang diperlukan jika kami hanya mengatur ulang jam, yang hanya 2 (untuk reset) ditambah jam target dan menit target.
Selanjutnya kita menghitung berapa banyak penekanan tombol yang diperlukan untuk mencapai jam target. Kami melakukan ini dengan mengurangi jam saat ini dari jam target. Namun, jika jam saat ini kurang dari target, ini akan memberi kita angka negatif sehingga kami memperbaiki bahwa dengan menambahkan 24 dikalikan dengan memeriksa jika
h<g
(yang mengembalikan boolean tetapi secara implisit dilemparkan ke bilangan bulat1
, jika benar, atau0
jika salah oleh operasi matematika.Kami menggunakan rumus yang sama untuk menghitung jumlah penekanan untuk mendapatkan dari menit saat ini ke menit target dan menambahkannya ke penekanan jam.
Akhirnya, kami mendapatkan minimal 2 angka untuk memberi kami hasil kami.
sumber
(h-g+24)%24+(m-l+60)%60
?Pyth , 29 byte
Tantangan ini jelas tidak menguntungkan bahasa golf, itu sebabnya begitu lama. Di sisi lain, ini ditingkatkan oleh fakta bahwa Pyth berbasis Python, sehingga kita dapat menyalahgunakan modulus negatifnya.
Test Suite. Angka dalam Pyth tidak mendukung angka nol di depan.
sumber
Jelly , 19 byte
Cobalah online!
Input sebagai 4 bilangan bulat (jam akhir, menit akhir, jam mulai, menit mulai)
sumber
C # (.NET Core) , 56 byte
Cobalah online!
Sangat mirip dengan jawaban Javascript. Bools dalam C # tidak mudah dikonversi ke angka, jadi alih-alih
[diff]+24*(H<h)
saya melakukan([diff]+24)%24
yang secara efektif melakukan hal yang sama.sumber
2+h+m
-2 byte.(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
System.Math.Min
?Haskell, 41 byte
Cukup mudah. Mengambil input sebagai empat argumen menggunakan waktu 24 jam: jam akhir, menit akhir, jam mulai, menit mulai.
sumber
Python 3 , 43 byte
Cobalah online!
Input sebagai 4 bilangan bulat (jam mulai, menit mulai, jam akhir, menit akhir)
sumber
2 01 11 00
? Dalam jawaban Anda, bagaimana Anda menentukan apakah waktu ituAM
atauPM
, jika Anda tidak menganggapnya sebagai input?13
input itu menggunakan TIO, yang benar (reset + 11 <9 + 59).%
selalu mengembalikan angka positif dengan Python?%
.1%24
=1
,1%-24
=-23
. Ini sangat membantu untuk pertanyaan ini.Java 8,
5450 bytePort dari jawaban #KamilDrakari C # (setelah saya main golf
26 byte).Penjelasan:
Coba di sini.
sumber
Perl 5 , 71 +2 (-ap) = 73 byte
Cobalah online!
Mengambil input dalam format 24 jam (waktu militer), dipisahkan oleh spasi, waktu mulai pertama, waktu akhir kedua: HH MM hh mm
sumber
Retina , 106 byte
Cobalah online! Tautan termasuk kasus uji. Mengambil input sebagai arus dan waktu yang diinginkan dalam waktu 24 jam reguler dengan ruang yang memisahkan dua kali. Penjelasan:
Konversikan ke unary.
Ini melakukan dua hal; itu menambah 24 jam dan 60 menit ke jam dan menit yang diinginkan, dan itu juga menambahkan 2 ke jumlah jam dan menit yang diinginkan asli, yaitu jumlah tombol yang ditekan untuk mengatur menggunakan reset.
Kurangi jam saat ini dari jam yang diinginkan, dan kurangi 24 yang kita tambahkan jika kita bisa.
Demikian pula untuk menit-menitnya. Ini juga menambahkan dua hasil bersama.
Jika jumlah penekanan yang diatur menggunakan waktu saat ini lebih dari jumlah penekanan yang diatur menggunakan reset, hapuslah.
Konversi angka yang tersisa pertama kembali ke desimal.
sumber