Знайдіть наступний «цікавий» час


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
Волатильність

@Volatility Упс, помилка :-P фіксована
дверна ручка

1
Мені подобається обмеження доступу до мережі.
Кайл Канос

1
Чи повинен код вважати лише час на 12-годинному годиннику? Наприклад, цілодобовий годинник 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_ позначає кінець часу.


1

Луа

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

Версія 1: видалення 0s, введення командного рядка, а також резервне копіювання 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

Якщо ви хочете, щоб він вийшов із системного годинника.

Чи є приз за повноту функції? : P

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