Руки прирікань годинника


9

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

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

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

Відповідно до сторінки OEIS , одинадцять разів перекриття:

00:00:00 plus 0/11 s, 01:05:27 plus 3/11 s,
02:10:54 plus 6/11 s, 03:16:21 plus 9/11 s,
04:21:49 plus 1/11 s, 05:27:16 plus 4/11 s,
06:32:43 plus 7/11 s, 07:38:10 plus 10/11 s,
08:43:38 plus 2/11 s, 09:49:05 plus 5/11 s,
10:54:32 plus 8/11 s.

Наступного разу буде 12:00:00. Для цього завдання не потрібні секунди та їх дробові частини. Просто округніть до найближчої хвилини.

Тестові приклади:

0:00 (Or 12:00) > 1:05
1:00 > 1:05
11:56 > 12:00 (Or 0:00)
6:45 > 7:38
5:00 > 5:27
6:30 > 6:33 (round up)

Програма може бути функцією або повною програмою. Мені байдуже, чи ви обираєте ви, 0:00або 12:00обидва прийнятні. Удачі!


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Мего

Відповіді:


6

JavaScript (Node.js) , 54 47 байт (округніть до найближчого)

-7 байт. Дякуємо @ user202729

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60+.5|0]

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


JavaScript (Node.js) , 40 33 44 байт (округлює до 0)

-3 байти завдяки @Arnauld

-4 байти завдяки @Kevin Cruijssen

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60|0]

Пояснення

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60|0]    Full Code
a                                               Hours
   b                                            Minutes
    =>[                    ,               ]    return array with
       (a+=        )                            add to the current hour
           b>5.46*a                             1 if the minute's clock hand has 
                                                passed the hour's clock hand. Here we use
                                                equation 60*a/11 which is the same as 5.46*a
                    +a/11                       and add 1 when hour is 11
                         |0                     floor the result

                            a%12*65.46%60|0     Here we do equation ((720/11)*a) (mod 60)
                            a%12                In case of hour 12 we take 0
                                *65.46          multiply hour by 720/11 which can be shortened to
                                                65.46 to save 1 byte.
                                      %60       mod 60
                                         |0     floor the result

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

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


Це не здається правильним, якщо ви приймаєте, як працює справжній годинник: datagenetics.com/blog/november12016/index.html
Ніч2,

У вас є деякі помилки округлення. 05:00повинен виводити, 05:27але виводити 05:25замість цього, і 06:45виводити, 07:38але виводити 07:35замість цього Тут, можливо, корисна послідовність оейсів: A178181
Kevin Cruijssen

1
@LuisfelipeDejesusMunoz Два тестових випадки, які я подав, справді є правильними, але, 11:56здається, виводиться 00:05замість 00:00(або 12:00).
Кевін Кройсейсен

@KevinCruijssen Готово. Я думаю, що a=(a+=b>=a*5)%12можна трохи скоротити, але я не надто хороший у цьому
Луїс Феліпе Де Ісус Муноз

1
Це не Math.round(x)просто 0|x+.5?
користувач202729

5

J , 31 байт

0.5<.@+>:@<.&.(11r720*12 60&#.)

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

Спосіб округлення числа в J полягає в тому, щоб додати 0.5та взяти слово ( <.). Займає занадто багато байт ...


Пояснення

12 60&#. (змішане базове перетворення) перетворюється з масиву [година, хвилина] в хвилину, що пройшла з 0:00.

Зауважте, що починаючи з 0:00, кожні 12/11 годин (тобто 720/11 хвилин), дві руки перекриваються один раз.

Тому, враховуючи хвилинну величину, просто округляйте її до найближчого кратного 720/11 (відмінне від себе). Цього можна досягти за *допомогою 11/720 (J має раціональне число в прямому значенні 11r720), взяти слово <., приріст >:, а потім помножити на 720/11.

Зауважте, що "помножити на 11/720" і "помножити на 720/11" є двома зворотними діями, а також "перетворити з [години, хвилини] на кількість пройденої хвилини" і навпаки. На щастя, J має вбудований &.(під), який повертає деяку дію після застосування перетворення.

Після цього просто зробіть округлення: 0.5 +потім <..


5

R , 68 байт

a=round(1:30*720/11);a[a>sum(scan()*c(60,1))][1]%/%c(60,1)%%c(12,60)

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

  • -2 байти завдяки Джузеппе
  • +7 байт через відсутність округлення :(

Використання рівняння:

same_position_minutes = 720/11 * index

де index0 для першого положення, що перекривається (00:00), 1 для другого і так далі ...


1
Я думаю, що у вас є сторонній набір дужок навколо(a[...]...c(60,1))
Джузеппе,

@Giuseppe: Так, ти маєш рацію ... дякую!
digEmAll

@digEmAll Це дає неправильну відповідь 6:30 > 6:33.
mbomb007

@ mbomb007: ти прав, виправлений;)
digEmAll

4

R , 88 байт

i=scan();d=1+60*i[1]+i[2];while(abs(60*(h=d%/%60%%12)-11*(m=d%%60))>5){d=d+1};paste(h,m)

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

Збільшити час на одну хвилину. Перевіряє кут. Якщо недостатньо закрити, петлі, поки не знайдеться рішення.


1
Так, це класний спосіб зробити це. Я ніколи не думав моделювати фактичний годинник!
Програми Redwolf


2

Java 8, 89 82 байт

(h,m)->(m=m<(m=(int)(h%12*720d/11%60))?m:(int)(++h%12*720d/11%60))*0+h%12%11+" "+m

Виправлено. Побачу, чи зможу я пізніше його пограти в гольф (напевно, надіславши іншу відповідь)

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

Пояснення:

ЗРОБИТИ


Те саме питання (очевидно), як і відповідь, яку ви надіслали - напр .: f.apply(56).apply(10)врожайність11 59
Джонатан Аллан

@JonathanAllan Виправлено. Побачимо, чи зможу пізніше видалити кілька байт ..
Кевін Круїйсен

@KevinCruijssen Це дає неправильну відповідь 6:30 > 6:33.
mbomb007

@ mbomb007 Я знаю. Я чекаю відповіді ОП, перш ніж виправити це. Чи дозволено нам підлогу, круглий, стельовий або обидва (якщо я б опублікував виклик, я би застосував четвертий варіант, але спочатку дочекаємось ОП).
Кевін Кройсейсен

@KevinCruijssen Тестовий випадок було відредаговано на запитання через коментар ОП . Використовуючи найбільш поширене визначення раунду , наміри ОП зрозумілі.
mbomb007

2

Apl (Dyalog Unicode) , 28 байт

((⍳11),⍪0,+\∊5/⊂5 6)(⍸⌷1⊖⊣)⎕

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


Пояснення

((⍳11),⍪0,+\∊5/⊂5 6)є матрицею разів, коли руки перекриваються (надруковані в кінці посилання tio)
(⍸⌷1⊖⊣)⎕знаходять інтервал, протягом якого вхід знаходиться в матриці, а індекси під ним обертаються.


2

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

(h,m)=>{h%=12;int n=(5*h+h/2)%60;return (m>n||h>10)?f(h+1,0):h+":"+n;}

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

Я думаю, що це проходить усі тестові випадки. Хоча випадок h = 11 є якось потворним

Пояснення:

(h,m)=>{ // Lambda receiving 2 integers
    h%=12; // Just to get rid of the 0/12 case
    int n=(5*h+h/2)%60; // get the minute at which the hands overlap 
                        //for current hour.
    return 
    (m>n||h>10)? // if current minute > n or h=11
        f(h+1,0) // it will happen next hour
    :
        h+":"+n; // return result
}

Це дає неправильну відповідь 6:30 > 6:33.
mbomb007

@ mbomb007 Спасибі, я буду дивитись на це. Я зробив першу спробу ще до того, як був доданий повний список часів накладання.
F.Carette

Зараз має бути нормально. Оскільки у нас немає чіткої інструкції, що робити у випадках, коли currentTime == overlapTime, я повертаю поточний час у цих випадках (задано (1,5) поверненням "1: 5", а не "2:11") .
F.Carette

1

JavaScript, 41 байт

p=>q=>(p+=q>=(5.5*p|0),p%=11,[p,5.5*p|0])


1

Желе , 25 байт

‘2¦ɓ;W}Ṣi¹ịḷø5,6ẋ5ÄĖØ0W¤;

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

Монадійне посилання, яке сприймає час як список з двома цілими числами і повертає список з двома цілими числами, відповідним наступному разу, коли руки будуть доторкані.


0

Perl 6 , 43 байти

(* *60+*+33).round(65.45).round.polymod(60)

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

Анонімне Незалежно від лямбда, яке займає два цілі числа, що представляють години та хвилини, і повертає години та хвилини у зворотному порядку. Зараз він не відповідає, коли ви вводите вирівняний час, незалежно від того, виводить він наступний вирівняний час або залишається на тому ж. Я чекаю від ОП, щоб відповісти на це питання, але зараз я ставлюсь до цього як до невизначеного.

Пояснення

(* *60+*+33)   # Converts the two inputs to number of minutes
            .round(65.45)   # Round to the nearest multiple of 65.45
                         .round  # Round to the nearest integer
                               .polymod(60) # Repeatedly modulo by 60 and return the list of results
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.