Znajdź następny „interesujący” czas


9

Zdarzyło mi się dzisiaj rzucić okiem na zegarek dokładnie o 11:11:11 (a dziś jest 1/11; szkoda, że ​​to nie 2011), i to sprawiło, że pomyślałem: wiem! Powinienem z tego zrobić pytanie do golfa! Jestem głupkiem

W każdym razie twoim wyzwaniem jest przyjęcie godziny, minuty i sekundy jako danych wejściowych i wygenerowanie następnego „interesującego” czasu. Tutaj zdefiniuję interesujące jako następujące kroki:

  1. Połącz godzinę, minutę i sekundę. (Na przykład o 4:14:14 będzie to 41414.)
  2. Sprawdź kolejne grupy po jednej, dwóch lub trzech, które obejmują całą długość łańcucha. Na przykład mogłem znaleźć [41][41][4]w przykładowym czasie (jeśli grupa nie może sięgnąć przez łańcuch, po prostu odetnij go, jak w tym przykładzie). Inny przykład: w tym czasie w moim pierwszym przykładzie na początku pytanie byłoby [1][1][1][1][1][1], [11][11][11]lub [111][111].
  3. Czy istnieje kolejna grupa, która przechodzi przez cały ciąg? Jeśli tak, czas jest „interesujący!” W przeciwnym razie tak nie jest.

Dane wejściowe mogą mieć dowolny rozsądny format, ale nie mogą być zakodowane na stałe. Dane wyjściowe mogą być również w dowolnym rozsądnym formacie i nie muszą być w tym samym formacie co dane wejściowe.

Jeśli z jakiegoś powodu korzystasz z dostępu do sieci, wszystkie bajty pobrane z sieci liczą się do twojego wyniku.

To jest ; najkrótszy kod w bajtach wygrywa.


1
Jest styczeń, a nie listopad: P
Zmienność

@Volatility Whoops, literówka :-P naprawiono
Klamka

1
Podoba mi się ograniczenie dostępu do sieci.
Kyle Kanos

1
Czy kod powinien uwzględniać tylko czasy na zegarze 12-godzinnym? Na przykład 24-godzinny zegar 14:14:14 byłby interesującym czasem, ale nie tak interesującym na 12-godzinnym zegarze (2:14:14)
Kevin Anderson

Odpowiedzi:


2

J, 113 99 90

Prawdopodobnie wciąż całkiem golfowy.

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

Pobiera wektor (h m s)jako dane wejściowe i zwraca wektor w tym samym formacie co dane wyjściowe.

Przykłady:

   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

To jeden ze sposobów na zrobienie tego.

    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]

Przykłady

λ: i [11,11,11]
[11,21,1]
λ: i [4,14,14]
[4,14,41]

Czy możesz opublikować przykładowy przebieg? Nie mam pojęcia o Haskell, więc nie mam pojęcia, jak działa wejście / wyjście itp .:-P
Klamka

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}]&

Zwraca wzór następnego interesującego czasu:

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

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

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

a_ oznacza koniec czasu.


1

Lua

Mam cztery różne rozwiązania, ponieważ nie byłem pewien niektórych wymagań.

Wersja 1: usuwanie zer, wprowadzanie danych z wiersza poleceń oraz tworzenie kopii zapasowej os.time () (315)

Zminimalizowane:

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

Pełna wersja z komentarzami:

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

Pozostałe wersje są bardzo podobne, więc opublikuję tylko wersje zminimalizowane:

Wersja 2: brak danych z wiersza poleceń (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

Wersja 3: brak usuwania 0, z wejściem wiersza poleceń (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

Wersja 4: żadna z wymyślnych rzeczy (bez usuwania 0 lub wprowadzania z wiersza poleceń) (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

Instrukcje użytkowania

W terminalu uruchom (wersje 1 i 3)

lua interesting.lua HOURS MINUTES SECONDS

Lub tylko

lua interesting.lua

Jeśli chcesz, żeby wyłączało się zegar systemowy.

Czy jest nagroda za kompletność funkcji? : P

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.