Стрелки Судьбы

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, и оба приемлемы. Удачи!

Redwolf Программы
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Мего

Ответы:

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
Night2
У вас есть ошибки округления. 05:00должен выводить, 05:27но выводит 05:25вместо этого, и 06:45должен выводить, 07:38но выводит 07:35вместо этого. Вот, возможно, полезная последовательность oeis: A178181
Кевин Круйссен
1
@LuisfelipeDejesusMunoz Два приведенных мною тестовых примера действительно верны, но 11:56кажется, что вы выводите 00:05вместо 00:00(или 12:00).
Кевин Круйссен
@KevinCruijssen Готово. Я думаю, что a=(a+=b>=a*5)%12можно немного сократить, но я не слишком хорош в этом
Луис Филипе Де Иисус Муньос
1
Не Math.round(x)просто 0|x+.5?
user202729
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» представляют собой 2 обратных действия, а также «преобразовать из [часа, минуты] в число пройденных минут» и наоборот. К счастью, J имеет встроенный&. функцию (under), которая отменяет некоторые действия после применения преобразования.

После этого просто выполните округление: 0.5 +тогда <..

user202729
источник
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

где index 0 для первой позиции перекрытия (00:00), 1 для 2-й и так далее ...

digEmAll
источник
1
Я думаю, что у вас есть посторонние скобки вокруг(a[...]...c(60,1))
Джузеппе
@ Джузеппе: да, ты прав ... спасибо!
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)

Попробуйте онлайн!

Увеличьте время на одну минуту. Проверяет угол. Если не достаточно близко, петли, пока решение не найдено.

Jayce
источник
1
Да, это крутой способ сделать это. Я никогда не думал о симуляции реальных часов!
Программы
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 Я знаю. Я жду ответа OP прежде, чем исправить это. Должны ли мы пол, раунд, потолок или и то и другое (если бы я отправил вызов, я бы использовал четвертый вариант, но сначала дождемся OP).
Кевин Круйссен
@KevinCruijssen Тестовый пример был отредактирован в вопросе из-за комментария ОП . Используя наиболее распространенное определение раунда , цель ОП ясна.
mbomb007
2

Apl (Dyalog Unicode) , 28 байт

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

Попробуйте онлайн!


объяснение

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

jslip
источник
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
}
F.Carette
источник
Это дает неправильный ответ для 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)

Попробуйте онлайн!

Аноним Любая лямбда, которая принимает два целых числа, представляющих часы и минуты, и возвращает часы и минуты в обратном порядке. Прямо сейчас это не согласуется, когда вы вводите выровненное время, выводит ли оно следующее выровненное время или остается на том же. Я жду, когда OP ответит на этот вопрос, но сейчас я отношусь к нему как к неопределенному.

объяснение

(* *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
Джо Кинг
источник