Найди следующее «интересное» время

9

Я случайно взглянул на часы сегодня в 11:11:11 (а сегодня 1/11; очень жаль, что это не 2011 год), и это заставило меня задуматься: я знаю! Я должен сделать из этого вопрос по коду! Я придурок

В любом случае, ваша задача - взять час, минуту и ​​секунду в качестве входных данных и вывести следующее «интересное» время. Здесь я определю интересные как эти шаги:

  1. Объедините час, минуту и ​​секунду. (Например, в 4:14:14 это будет 41414.)
  2. Проверьте наличие последовательных групп из одной, двух или трех, которые охватывают длину всей строки. Например, я мог найти [41][41][4]в примере время (если группа не может добраться до строки, просто обрежьте ее, как я делал в этом примере). Другой пример: в то время в моем первом примере в начале этого вопроса, было бы [1][1][1][1][1][1], [11][11][11]или [111][111].
  3. Есть ли последовательная группа, которая проходит через всю строку? Если так, то время "интересное!" В противном случае это не так.

Ввод может быть в любом разумном формате, но он не должен быть жестко закодирован. Вывод также может быть в любом приемлемом формате, и он не обязательно должен быть в том же формате, что и ввод.

Если по какой-либо причине вы используете доступ к сети, все загруженные из сети байты засчитываются в ваш счет.

Это ; выигрывает самый короткий код в байтах.

Дверная ручка
источник
1
Это январь, а не ноябрь: P
волатильность
@ Volatlity Упс, опечатка :-P исправлено
Ручка двери
1
Мне нравится ограничение доступа к сети.
Кайл Канос
1
Должен ли код учитывать время только на 12-часовых часах? Например, на 24-часовых часах 14:14:14 было бы интересное время, но не очень интересное на 12-часовых часах (2:14:14)
Кевин Андерсон

Ответы:

2

J 113 99 90

Вероятно, все еще вполне пригодный для игры в гольф.

f=:t#:[:(>:^:([:(3&g+:2&g=.[:*/]=(]$)${.)@(":@{.,3}.7":100#.1,])t#:])^:_)1+(t=.24,2$60)#.]

Принимает вектор в (h m s)качестве входных данных и возвращает вектор в том же формате, что и выходные данные.

Примеры:

   f 0 0 0
0 1 0
   f 4 14 14
4 14 41
   f 23 59 59
0 0 0
   f 3 14 15
3 14 31
летучесть
источник
1

Haskell - 227223

Это один из способов сделать это.

    import Data.List
e _ []=False
e f s=let (h,t)=f s in t`isPrefixOf`h||h`isPrefixOf`t&&e f t
i [a,b,s]=head[t|s<-[s+1..],f<-map splitAt[1..3],let m=b+s`div`60;h=a+m`div`60;t=[h`mod`24,m`mod`60,s`mod`60],e f$concatMap show t]

Примеры

λ: i [11,11,11]
[11,21,1]
λ: i [4,14,14]
[4,14,41]
рассекать
источник
Не могли бы вы опубликовать пробный прогон? Я не разбираюсь в Haskell, поэтому понятия не имею, как работает ввод / вывод и т. Д. :-P
дверная ручка
1

Mathematica 125

F=Do[#~MatchQ~{#〚-1〛..,_}&&Break@#&@Partition[(i=IntegerDigits)@f[n~i~60,100],m,m,1,a_],
{n,#~(f=FromDigits)~60+1,7^6},{m,3}]&

Возвращает образец следующего интересного времени:

F@{11, 11, 11}
F@{4, 14, 14}

{{1, 1, 2}, {1, 1, 2}}

{{4, 1, 4}, {4, 1, a_}}

a_ знаменует конец времени.

ybeltukov
источник
1

Lua

У меня есть четыре разных решения, так как я не был уверен в некоторых требованиях.

Версия 1: удаление 0, ввод в командной строке, а также резервное копирование os.time () (315)

Минимизация:

z=arg if z[1] then y={hour=z[1],min=z[2],sec=z[3],day=1,month=1,year=1}end h,g,e,u=os.date,os.time(y),":",tonumber while 1 do g=g+1 b,c,d=u(h("%H",g)),u(h("%M",g)),u(h("%S",g)) a=b..c..d for x=1,#a/2 do p=1 for _ in a:gmatch(a:sub(1,x))do p=p+1 if p>math.ceil(#a/x) then print(b..e..c..e..d)return 1 end end end end

Полная версия с комментариями:

z=arg if z[1] then y={hour=z[1],min=z[2],sec=z[3],day=1,month=1,year=1}end --get command line arguments
h,g,e,u=os.date,os.time(y),":",tonumber --set up references, if command line arguments accepted use y else use current time
while 1 do
    g=g+1
    b,c,d=u(h("%H",g)),u(h("%M",g)),u(h("%S",g)) --get HH:MM:SS seperately (which allows removal of the zeroes with tonumber())
    a=b..c..d  --concat
    for x=1,#a/2 do  --check up to half of the string
        p=1
        for _ in a:gmatch(a:sub(1,x))do --for each match
            p=p+1  --count number of matches
            if p>math.ceil(#a/x) then print(b..e..c..e..d)return 1 end --if matches span entire string, cheer (and print in a pretty format)
        end
    end
end

Другие версии очень похожи, поэтому я опубликую только минимизированные версии:

Версия 2: нет ввода командной строки (239)

h,g,e,u=os.date,os.time(),":",tonumber while 1 do g=g+1 b,c,d=u(h("%H",g)),u(h("%M",g)),u(h("%S",g)) a=b..c..d for x=1,#a/2 do p=1 for _ in a:gmatch(a:sub(1,x))do p=p+1 if p>math.ceil(#a/x) then print(b..e..c..e..d)return 1 end end end end

Версия 3: удаление не 0, с вводом командной строки (240)

z=arg if z[1] then y={hour=z[1],min=z[2],sec=z[3],day=1,month=1,year=1}end h,g=os.date,os.time(y) while 1 do g=g+1 a=h("%H%M%S",g) for x=1,3 do p=1 for _ in a:gmatch(a:sub(1,x))do p=p+1 if p>6/x then print(h("%T",g))return 1 end end end end

Версия 4: ничего необычного (без удаления 0 или ввода из командной строки) (164)

h,g=os.date,os.time() while 1 do g=g+1 a=h("%H%M%S",g) for x=1,3 do p=1 for _ in a:gmatch(a:sub(1,x))do p=p+1 if p>6/x then print(h("%T",g))return 1 end end end end

Инструкция по применению

Запустите в терминале (версии 1 и 3)

lua interesting.lua HOURS MINUTES SECONDS

или просто

lua interesting.lua

Если вы хотите, чтобы он отключился от системных часов.

Есть ли приз за полноту функции? :П

finnbar
источник