Подходим поразительные часы


14

Вступление:

Дома у нас есть часы, которые бьют установленное количество каждый час, но также бьют один раз каждые полчаса. Таким образом, с 0:01 до 12:00 включительно это происходит в следующем порядке:

1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10, 1, 11, 1, 12

Вызов:

Учитывая целое число n, выведите список таймфреймов, в которых общее количество ударов равно n. Кроме того, всегда начинайте как минимум за 1 минуту до этого периода и заканчивайте как минимум через 1 минуту после этого периода (и не более 29 минут).
Например, если ввод n=8, вывод может быть:

[00:59-03:01, 01:29-03:31, 02:59-04:01, 05:29-06:31, 06:29-07:01, 06:59-07:31, 07:59-08:01]

Для которых эти временные рамки имеют следующие суммы, все равны 8:

[1+1+2+1+3, 1+2+1+3+1, 3+1+4, 1+6+1, 1+7, 7+1, 8]

Правила вызова:

  • Выход гибкий. Вы можете выводить объекты Time (или Date / DateTime), временные метки, строки (с или без начальных нулей), десятичные дроби с .29/ .31/ .59/ .01(то есть 0.29-3.01вместо 00:29-03:01) и т. Д. Если ясно, что это до и после таймфрейма ,
    Кроме того, вы можете выбрать сумму самостоятельно. Во всех моих примерах я использую 1 минуту, но вы также можете выбрать 5 минут, 15 минут и т. Д. Это также означает, что вы можете использовать .4/ .6/ .9/ .1(т.е. 0.4-3.1вместо 00:24-03:06), например. Список также гибкий. Может быть списком / коллекцией, массивом, разделенной разделителем строкой, печать каждой строки в STDOUT и т. Д.
    Пожалуйста, укажите, какой выбор вывода вы сделали.Примечание. Вам не разрешено выводить суммы таймфреймов, как указано выше, это упоминается только как пояснение. Вы должны вывести временные рамки, в том числе немного до и после него.
  • Удары оборачиваются от 12:00до 00:30. Так что, если n=14два таймфрейма 11:29-00:31и 11:59-01:01.
  • Вход будет в диапазоне 1 <= n <= 90, где 90 - общая сумма всех возможных ударов.
  • Временные рамки, которые вы возвращаете, могут быть в любом порядке.

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Также, пожалуйста, добавьте объяснение, если это необходимо.

Тестовые случаи:

(все используют 1 минуту до / после таймфреймов и ведущих нулей)

Input: 8
Ouput:
[00:59-03:01, 01:29-03:31, 02:59-04:01, 05:29-06:31, 06:29-07:01, 06:59-07:31, 07:59-08:01]

Input: 14
Output:
[00:29-04:01, 00:59-04:31, 02:59-05:01, 04:29-06:31, 05:59-07:01, 11:29-00:31, 11:59-01:01]

Input: 90
Output:
[00:29-00:01, 00:59-00:31, 01:29-01:01, 01:59-01:31, 02:29-02:01, 02:59-02:31, 03:29-03:01, 03:59-03:31, 04:29-04:01, 04:59-04:31, 05:29-05:01, 05:59-05:31, 06:29-06:01, 06:59-06:31, 07:29-07:01, 07:59-07:31, 08:29-08:01, 08:59-08:31, 09:29-09:01, 09:59-09:31, 10:29-10:01, 10:59-10:31, 11:29-11:01, 11:59-11:31]

Input: 1
Output:
[00:29-00:31, 00:59-01:01, 01:29-01:31, 02:29-02:31, 03:29-03:31, 04:29-04:31, 05:29-05:31, 06:29-06:31, 07:29-07:31, 08:29-08:31, 09:29-09:31, 10:29-10:31, 11:29-11:31]

Input: 2
Output:
[00:29-01:01, 00:59-01:31, 01:59-02:01]

1
Я бы пошел на то, что наиболее гибким. Это включает десятичные числа часов, пока числа результата находятся между двумя временами звонка.
Адам

@ Adám Думаю, ты прав. Я отредактировал свой ответ соответственно. У вас должно быть не менее 1 минуты и не более 29 минут, поэтому .4/ .6/ .9/ .1разрешено (это 6 минут, как вы заявили: :24/ :36/ :54/ :06).
Кевин Круйссен

1
Может быть, упомянуть, что временные пары могут быть возвращены в любом порядке?
Адам

ОК n в 0..90, я не нахожу ясно, каков период времени для расчета n ударов: это 12 часов? Они 24 часа? 48 часов? Чем разрешено время возврата в формате 0..24: 0..60?
Рослуп

@RosLuP Временной интервал - это обычные аналоговые часы, поэтому с 00:01 до 12:00. Таким образом, вместо 0..24: 0..60, оно должно быть 0..12: 0..60. Как это устраняет любую путаницу.
Кевин Круйссен

Ответы:


3

APL (Dyalog Classic) , 34 байта SBCS

12|.4 .1∘+¨.5×⍸⎕=⍉∘.-⍨+\,⍪⍨1,⍪⍳12

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

Это решение использует ⎕io←1(индексирование на основе 1).

Справа налево:

⍳12 является 1 2 3...12

превращает его в высокую тонкую матрицу 12x1

1, добавляет столбец 1 с слева

⍪⍨ объединяет одну и ту же матрицу по вертикали, так что теперь это матрица 24x2

, выравнивает матрицу в мажорном порядке, она становится вектором размера 48: 1 1 1 2 1 3...1 12 1 1 1 2...1 12

+\ частичные суммы: 1 2 3 5 6 9...

∘.-⍨ различия между каждой парой элементов, матрица 48x48

транспонирования

⎕=логическая матрица 48x48 с 1 с, где бы ни происходил оцененный input ( )

пары координат, где 1

.5× разделить их пополам

.4 .1∘+¨ добавить 0,4 к первой и 0,1 ко второй координате в каждой паре

12| по модулю 12

уникальный


Какой временной интервал представлен .1на выходе? Также хороший ответ.
Эрик Outgolfer

2
О, и это то, что делает возможным, чтобы это было 34 байта, может быть, хотите <sup>SBCS</sup>сослаться на него или написать так же, как ответ Адама.
Эрик Outgolfer

@EriktheOutgolfer проблема явно разрешает .1 / .4 / .6 / .9 вместо: 01 /: 29 /: 31 /: 59. Мне не нужна специальная кодировка для этого ответа, она в Dyalog Classic, которая имеет свою собственную однобайтовую кодировку.
СПП

не в Dyalog Classic. И да, я знаю, что это явно разрешено, я просто хотел узнать, сколько минут 0.1в выводе;)
Эрик Игрок в гольф

@EriktheOutgolfer "SBCS" добавлено, спасибо; 1 × 60 минут - 6 минут
18:18

5

JavaScript (ES6), 104 байта

Печатает временные интервалы в H.MM,H.MMформате.

F=(n,f=0,s=n,t=f++)=>t<f+23?F(n,f,s-=t&1||t/2%12+1,++t,s||alert([f/2%12+.01,-~t/2%12+.01])):f<24&&F(n,f)

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

Использует по существу тот же алгоритм, что и нерекурсивная версия ниже.


Нерекурсивная версия, 117 байт

Выводит разделенную пробелами строку временных интервалов в H.MM,H.MMформате.

n=>[...Array(24)].map((_,f,a)=>a.map(_=>(s-=t++&1||t/2%12+.5)||(r+=[-~f/2%12+.01,-~t/2%12+.01]+' '),s=n,t=f),r='')&&r

Контрольные примеры

комментарии

n =>                           // n = input
  [...Array(24)].map((_, f, a) // FOR f = 0 TO 23:
    => a.map(_ =>              //   FOR t = f TO f + 23:
      (                        //     update s
        s -=                   //       by subtracting:
          t++ & 1 ||           //         - 1 if t is odd (half hour)
          t / 2 % 12 + .5      //         - the current hour if t is even
      ) || (                   //     if s is equal to zero:
        r += [                 //       update the result string by appending:
          -~f / 2 % 12 + .01   //         - the formatted 'from' time
          ,                    //         - a comma
          -~t / 2 % 12 + .01   //         - the formatted 'to' time
        ] + ' '                //       and a padding space
      ),                       //     inner map() initialization:
      s = n,                   //     - s = target number of strikes
      t = f                    //     - 'to' time = 'from' time
    ),                         //   end of inner map()
    r = ''                     //   start with r = empty string
  )                            // end of outer map()
  && r                         // return r

4

APL (Dyalog Unicode) , 62 59 байт SBCS

Полное тело программы. Подсказки для n. Распечатывает список из двух элементов с использованием десятичных часов.

∪(⎕=∊l+/¨⊂48⍴∊1,¨⍳12)/(¯.1 .1+⊃,⊢/)¨⊃,/(l←⍳48),/¨⊂.5×48⍴⍳24

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

⍳24ɩ ndices 1 ... 24

48⍴ циклический г eshape длиной 48, то есть 1 ... 12 ... 12,1

.5× умножить половину на это

 enclose (чтобы использовать весь этот массив в качестве правого аргумента для каждого левого аргумента)

(),/¨ Для каждого из перечисленных ниже вернуть все подсписки этой длины:

⍳48ɩ ndices 1 ... 48

l← хранить в l(для л engths)

Теперь у нас есть все возможные списки периодов времени для каждой возможной длины цикла.

,/ объединить (букв. сокращение-объединение) списки подсписков

 раскрыть (потому что снижение понизило рейтинг с 1 до 0)

( Применить следующую функцию к каждому:

⊢/ последний (горит справа-сокращение) элемент (время окончания)

⊃, предварять первый элемент (время начала)

¯.1 .1+ добавить отрицательные и положительные десятые к тем

()/ Отфильтруйте эти пары начала и конца с помощью:

⍳12ɩ ndices 1 ... 12

1,¨ добавить 1к каждому

ε NLIST (Flatten)

48⍴ циклический г eshape длиной 48, т.е. 1,1,1,2 ... 1,11,1,12

 enclose (чтобы использовать весь этот массив в качестве правого аргумента для каждого левого аргумента)

l+/¨ для каждого из l(1… 48) вернуть суммы всех подсписков этой длины

ε NLIST (Flatten)

⎕= сравнить числовой ввод с этим

 вернуть только уникальные элементы (пары начало-конец)


0.1 0.5может стать.1 .5
Kritixi Lithos

@ Косквэк Да, я тоже заметил. Спасибо хоть.
Адам

3

Python 3 , 118 116 байт

lambda n:[(a/2+.4,b%24/2+.1)for a in range(24)for b in range(48)if sum((sum(zip([1]*12,range(1,13)),())*2)[a:b])==n]

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

Временные рамки представляются в виде (t1, t2), t1и t2будучи десятичной , представляющие часы. Смещение составляет .1или 6 минут.


1

Пакет, 196 байт

@for /l %%i in (0,1,23)do @set s=%1&for /l %%j in (0,1,23)do @call:c %%i %%j
:c
@set/at=%2+%1,s-=t%%2*(t/2%%12)+1,h=%1/2,i=%1%%2*30+15,t=-~t%%24/2,u=-~t%%2*30+15
@if %s%==0 echo %h%:%i% %t%:%u%

Объяснение: tэто время , в течение полутора часов, начиная с 0для 00:30. Количество ударов в момент времени т тогда 1, 1, 1, 2, 1, и 3т.д. Вычитание 1дает последовательность 0, 0, 0, 1, 0, и 2т.д. , которые целые числа чередоваться с нулями. Это может затем быть получено путем умножением почленного последовательности 0, 0, 1, 1, 2, и 2т.д. с последовательностью 0, 1, 0, 1, 0, и 1т.д. Оба из этих последовательностей могут быть легко рассчитаны с использованием по модулю и (целое число) деления.

Затем остается зациклить все 23 возможных времени запуска, затем взять все 24 времени удара и вычесть количество ударов из входных данных, напечатав время, когда результат равен нулю.

Код проваливается после цикла, но никакого вреда не причиняется, так как ввод не может быть больше 90.


1

APL NARS, 559 байтов

∇r←l w;t;i;j;c;k;m;p
p←{0=2∣¯1+⍵:.01+2÷⍨¯1+⍵⋄¯0.19+2÷⍨¯1+⍵}
m←{0=2∣¯1+⍵:¯.41+2÷⍨¯1+⍵⋄¯0.21+2÷⍨¯1+⍵}
   r←⍬⋄i←0⋄t←∊(¯1+⍳13),¨13⍴1⋄t←t,2↓t⋄k←⍴t
A: j←i+←1⋄→0×⍳i≥k⋄c←0
B: c+←j⊃t⋄:if(c=w)∧(0≤(m i))∧(24≥(p j))⋄r←r,⊂(m i),(p j)⋄:endif⋄→A×⍳c≥w⋄j+←1⋄→B×⍳j≤k⋄→A
∇
∇r←g w;v;i;k;m
   v←{12≤⌊⍵:⍵-12⋄⍵}
   i←1⋄k←⍴w⋄r←⍬
A: →0×⍳i>k⋄r←r,⊂v¨i⊃w⋄i+←1⋄→A
∇   
h←g∘l

h (n) или l (n) возвращает все репрезентативные интервалы в 0-24 часа, которые имеют n тактов. h (n) имеет формат часов 0..11.0..59; вместо этого l (n) имеет формат часов как тест 0..23.0..59

  h 8
    0.59 3.01  1.29 3.31  2.59 4.01  5.29 6.31  6.29 7.01  6.59 7.31  
    7.59 8.01  0.59 3.01  1.29 3.31  2.59 4.01  5.29 6.31  6.29 7.01  
    6.59 7.31  7.59 8.01 
  h 14
    0.29 4.01  0.59 4.31  2.59 5.01  4.29 6.31  5.59 7.01  11.29 0.31  
    11.59 1.01  0.29 4.01  0.59 4.31  2.59 5.01 4.29 6.31  5.59 7.01 
  h 90
    0.29 0.01  0.59 0.31  1.29 1.01  1.59 1.31  2.29 2.01  2.59 2.31  
    3.29 3.01  3.59 3.31  4.29 4.01  4.59 4.31  5.29 5.01  5.59 5.31  
    6.29 6.01  6.59 6.31  7.29 7.01  7.59 7.31  8.29 8.01  8.59 8.31  
    9.29 9.01  9.59 9.31  10.29 10.01  10.59 10.31  11.29 11.01  11.59 11.31    
  h 1
    0.29 0.31  0.59 1.01  1.29 1.31  2.29 2.31  3.29 3.31  4.29 4.31  
    5.29 5.31  6.29 6.31  7.29 7.31  8.29 8.31  9.29 9.31  10.29 10.31  
    11.29 11.31  0.29 0.31  0.59 1.01  1.29 1.31  2.29 2.31  3.29 3.31  
    4.29 4.31  5.29 5.31  6.29 6.31  7.29 7.31  8.29 8.31  9.29 9.31  
    10.29 10.31  11.29 11.31 
  h 2
    0.29 1.01  0.59 1.31  1.59 2.01  0.29 1.01  0.59 1.31  1.59 2.01 
  l 2
    0.29 1.01  0.59 1.31  1.59 2.01  12.29 13.01  12.59 13.31  13.59 14.01 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.