Оптимізація тривоги


28

Мій будильник

Я американець, як і мій (цифровий) будильник. Щоб встановити будильник, він запускається в той час, як був раніше. Натискання кнопки години переміщує її на одну годину, а натискання на кнопку хвилини переміщує її на одну хвилину. Одночасне натискання обох кнопок скидає її до півночі (12:00) і вважається двома натисканнями кнопок.

Коли години перевищують обмеження (12), він скидається на 1 і перемикає світло AM / PM. Коли хвилини перевищують обмеження (59), вони скидаються на 0, не впливаючи на години.

Завдання

Ваше завдання - задати час початку та цільовий час - вивести оптимальну кількість натискань кнопок, необхідних для встановлення моєї тривоги на цільовий час.

Ви можете брати інформацію в будь-якому форматі, який вам найбільше підходить. Єдині дані, які потрібні вашій програмі, - це години та хвилини для обох даних. Це означає, що, наприклад, ви можете приймати дані як мілісекунди з епохи, і витягувати години та хвилини, але ви можете нічого не кодувати в рік, місяць, секунду тощо. "військовий час" (або звичайний час для більшості країн світу), але це не змінює способу роботи мого годинника.

Приклади

1:15 pm -> 2:30 am

Ви можете натиснути обидві кнопки, щоб скинутись до 12:00, потім збільшувати до 2:30, що було б 2+2+30 = 34натисканням кнопок. Ви також можете збільшити до 2:30 ранку, що було б 13+15 = 28натисканням кнопок. Тому ваш результат є 28.

3:58 am -> 4:02 am

Ви можете скинути та збільшити, що було б 2+4+2 = 8натисканням кнопок. Ви також можете збільшити, що було б 1+4 = 5натисканням кнопок. Тому ваш результат є 5.

10:55 pm -> 1:00 am

Ви можете скинути та збільшити, що було б 2+1 = 3натисканням кнопок. Ви також можете збільшити, що було б 3+5=8натисканням кнопок. Тому ваш результат є 3.

1:00 am -> 1:59 pm

Ви можете скинути і збільшити, але це було б більше трьох натискань, ніж просто збільшення. Тому ваш результат є 12+59 = 71.

Випробування

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


13
О ні! Натискання двох кнопок також скидає мій (європейський) будильник на 0:00 ... Усі ці роки витрачалися на натискання кнопок занадто багато разів ... O_o
Arnauld

8
"військовий час (або звичайний час для більшої частини світу)" ... термін, який ви шукаєте, - це "24-годинний час".
Якоб

12
@Jakob Ні, термін, який він шукає, - це "звичайний час". Американці використовують нерегулярний час, нерегулярні дати, нерегулярні підрозділи тощо.
Ніл

1
@StepHen Я перебуваю у Великобританії і не знав, що ви розумієте під "військовим часом", поки Якоб не пояснив це. 24-й час має ідеальний сенс для мене
Даррен Х

Відповіді:


5

Лушпиння , 16 байт

§▼ṁ→(Σz%e24 60z-

Спробуйте в Інтернеті!

Аргументи приймаються як два списки [години, хвилини], час початку та закінчення, у форматі 24 години.

Я дуже радий тому, наскільки мені вдалося пограти в цей гольф, мені здається цікавим, як керуються аргументами в цьому складі функцій.

Функція, яка обчислює, скільки натискань клавіш нам потрібно, якщо скидання не дозволено, є наступним:

Σz%e24 60z-
         z-    elementwise subtract the two times
 z%e24 60      take the hours difference modulo 24 and the minutes difference modulo 60
Σ              sum the two resulting numbers

Цікава частина полягає в тому, що оскільки решта цього рішення може працювати лише з одним списком як аргумент, це частково застосовується до першого аргументу всієї програми, "з'їдаючи" його і залишаючи видимим лише другий аргумент і для себе, і для решта програми.

Далі ми обчислюємо, скільки натискань клавіш нам потрібно, якщо скинути час до 0:00

ṁ→    take the sum of each element of the list increased by 1

Як було сказано раніше, це діє лише на другому аргументі (остаточний час), а hours+minutes+2на обчисленнях - просто в гольфірному порядку.

Нарешті, §▼це частина, яка передає другий аргумент обом функціям і повертає менший з двох результатів.


8

JavaScript (ES6), 73 56 54 52 50 байт

Використовується 24-годинний формат. Вводиться як 4 цілих числа, що представляють години та хвилини кожного разу.

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)

Спробуй це

Введіть час у форматі 24 години за допомогою :роздільника.

o.innerText=(f=

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)

)(+(x=(i.value="01:00").split`:`)[0],+x[1],+(y=(j.value="13:59").split`:`)[0],+y[1]);oninput=_=>o.innerText=f(+(x=i.value.split`:`)[0],+x[1],+(y=j.value.split`:`)[0],+y[1])
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>Current: </label><input id=i type=time><label for=j>Target: </label><input id=j type=time><pre id=o>


Пояснення

(Невдовзі оновиться.)

(g,l,h,m)=>

Функція Анонімний приймає цілі числа в якості аргументів з допомогою параметрів g, l, hі m, де g& l, відповідно, годинник і хвилини поточного часу і h& mє години і хвилини заданого часу.

2+h+m

Спочатку ми обчислюємо, скільки потрібно натискання кнопок, якщо ми просто скинули годинник, який просто 2 (для скидання) плюс цільова година та цільова хвилина.

h-g+24*(h<g)

Далі обчислюємо, скільки натискань кнопок потрібно для досягнення цільової години. Ми робимо це, віднімаючи поточну годину від цільової години. Однак, якщо поточна година менша від цілі, це дасть нам від’ємне число, тому ми виправляємо це, додаючи 24, помножене, перевіряючи, якщо h<g(що повертає булеве значення, але неявно переноситься на ціле число 1, якщо істинне, або 0якщо помилкове значення математичні операції.

+m-l+60*(m<l)

Ми використовуємо аналогічну формулу, щоб обчислити кількість натискань, щоб отримати від поточної хвилини до цільової хвилини, і додамо її до годинних натискань.

Math.min()

Нарешті, ми отримуємо мінімум з двох чисел, щоб дати нам результат.


1
Ви могли б зробити (h-g+24)%24+(m-l+60)%60?
Арнольд

7

Pyth , 29 байт

Це завдання, очевидно, не дає переваги мовам для гри в гольф, тому це так довго. З іншого боку, це покращується тим, що Pyth заснований на Python, тому ми можемо зловживати його негативним модулем.

hS,+%-eQ@Q1 60%-@Q2hQ24+2s>Q2

Тестовий сюїт. Числа в Pyth не підтримують провідні нулі.



3

C # (.NET Core) , 56 байт

(H,M,h,m)=>Math.Min(((h+24-H)%24)+((m+60-M)%60),(2+h+m))

Спробуйте в Інтернеті!

Дуже схожа на відповідь Javascript. Булі в C # не конвертуються легко в цифри, тому замість цього [diff]+24*(H<h)я зробив, ([diff]+24)%24що ефективно робить те саме.


Ви можете видалити круглі дужки приблизно 2+h+mна -2 байти.
Кевін Круїйсен

Я створив порт вашої відповіді на Java 8 , і помітив, що ви можете (H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
переграти

1
Чи не довелося б вам це зробити System.Math.Min?
LiefdeWen

3

Haskell, 41 байт

(a#b)c d=min(a+b+2)$mod(a-c)24+mod(b-d)60

Досить прямо. Вводиться як чотири аргументи, використовуючи 24-годинний час: кінцева година, кінцева хвилина, година початку, хвилина початку.


2

Python 3 , 43 байти

lambda a,b,c,d:min((c-a)%24+(d-b)%60,2+c+d)

Спробуйте в Інтернеті!

Введіть як 4 цілих числа (година початку, хвилина початку, кінець години, кінець хвилини)


@StepHen Whoops. Легке виправлення.
HyperNeutrino

Невдачі2 01 11 00 ? Як ви визначаєте, у своїй відповіді, час AMчи PM, якщо ви не приймаєте це як вхід?
Містер Xcoder

@ Mr.Xcoder; Я отримую 13для цього вхід за допомогою TIO, що є правильним (скидання + 11 <9 + 59).
Shaggy

2
Чи %завжди повертається додаткове число в Python?
Кудлатий

4
@Shaggy завжди повертає знак правої сторони %. 1%24= 1, 1%-24= -23. Це дуже корисно для цього питання.
Стівен

2

Java 8, 54 50 байт

(h,m,H,M)->Math.min((H-h+24)%24+(M-m+60)%60,H+M+2)

Порт @KamilDrakari C # відповідь «s (після того, як я golfed 2 6 байт).

Пояснення:

Спробуйте тут.

(h,m,H,M)->       // Method with four integer parameter and integer return-type
  Math.min(       //  Return the lowest of the following two:
                  //   The hours:
   (H-h           //    Second hours - first hours inputs
       +24)       //    +24 so we won't have negative numbers
           %24    //    mod-24 to get the hours
   +              //   And add the minutes:
    (M-m          //    Second minutes - first minutes inputs
         +60)     //    +60 so we won't have negative numbers
             %60  //    mod-60 to get the minutes
    ,H+M          //  And compare it to the second hours + second minutes inputs
        +2)       //   +2 for the added +24 and +60 to get the positive modulo arguments

1

Perl 5 , 71 +2 (-ap) = 73 байти

($w,$x,$y,$z)=@F;$_=($r=2+$y+$z)>($c=($y-$w+24)%24+($z-$x+60)%60)?$c:$r

Спробуйте в Інтернеті!

Приймає введення у форматі 24 години (військовий час), розділеному пробілами, час початку перший, час закінчення другий: HH MM hh mm


1

Сітківка , 106 байт

\d+
$*
 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2
(1*):(1* )\1(1{24})?
$2
(1*) (1*):\1(1{60})?
$2
(1+)#(?!\1)

\G1

Спробуйте в Інтернеті! Посилання включає тестові випадки. Приймає введення як поточний і бажаний час у звичайний 24-годинний пробіл з проміжком, який розділяє два рази. Пояснення:

\d+
$*

Перетворити в одинарне.

 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2

Це робить дві речі; він додає 24 години і 60 хвилин до потрібних годин і хвилин, а також додає 2 до суми початкових бажаних годин і хвилин, тобто кількості натискань кнопок, встановлених за допомогою скидання.

(1*):(1* )\1(1{24})?
$2

Віднімаємо поточні години від потрібних годин і віднімаємо 24, які ми додали, якщо зможемо.

(1*) (1*):\1(1{60})?
$2

Аналогічно і хвилин. Це також додає два результати разом.

(1+)#(?!\1)

Якщо кількість натискань, встановлених за допомогою поточного часу, перевищує кількість натискань, встановлених за допомогою скидання, видаліть її.

\G1

Перетворити перше число, що залишилося, назад у десятковий.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.