Trova la prossima volta "interessante"


9

Mi è capitato di dare un'occhiata al mio orologio oggi esattamente alle 11:11:11 (e oggi è 1/11; peccato che non sia il 2011), e questo mi ha fatto pensare: lo so! Dovrei fare una domanda di golf del codice da questo! Sono un cretino.

Ad ogni modo, la tua sfida è prendere un'ora, un minuto e un secondo come input e produrre il prossimo "interessante" tempo. Qui, definirò interessanti questi passaggi:

  1. Concatena l'ora, i minuti e i secondi. (Ad esempio, alle 4:14:14, questo sarebbe 41414.)
  2. Verifica la presenza di gruppi consecutivi di uno, due o tre che coprono la lunghezza dell'intera stringa. Ad esempio, potrei trovare [41][41][4]nel tempo di esempio (se il gruppo non riesce a raggiungere la stringa, basta tagliarlo come ho fatto in questo esempio). Un altro esempio: nel tempo nel mio primo esempio all'inizio della questione, sarebbe [1][1][1][1][1][1], [11][11][11]o [111][111].
  3. Esiste un gruppo consecutivo che attraversa completamente la stringa? Se è così, il tempo è "interessante!" Altrimenti no.

L'input può essere in qualsiasi formato ragionevole , ma non deve essere codificato. L'output può anche essere in qualsiasi formato ragionevole e non deve essere nello stesso formato dell'input.

Se si utilizza l'accesso alla rete per qualche motivo, tutti i byte scaricati dalla rete vengono conteggiati nel punteggio.

Questo è ; vince il codice più breve in byte.


1
È gennaio, non novembre: P
Volatilità il

@Volatility Whoops, errore di battitura :-P fisso
Maniglia della porta

1
Mi piace la limitazione dell'accesso alla rete.
Kyle Kanos,

1
Il codice dovrebbe considerare solo i tempi su un orologio di 12 ore? Ad esempio, su un orologio di 24 ore 14:14:14 sarebbe un momento interessante ma non così interessante su un orologio di 12 ore (2:14:14)
Kevin Anderson,

Risposte:


2

J, 113 99 90

Probabilmente ancora abbastanza golfabile.

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

Prende un vettore (h m s)come input e restituisce un vettore nello stesso formato dell'output.

Esempi:

   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

Questo è un modo per farlo.

    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]

Esempi

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

Potresti pubblicare un'esecuzione di esempio? Non ho idea di Haskell, quindi non ho idea di come funzioni l'input / output, ecc :-P
Maniglia della porta

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

Restituisce uno schema del prossimo momento interessante:

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

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

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

a_ segna la fine dei tempi.


1

Lua

Ho quattro diverse soluzioni, poiché non ero sicuro di alcuni dei requisiti.

Versione 1: rimozione di 0s, input da riga di comando e backup os.time () (315)

ridotti al minimo:

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

Versione completa con commenti:

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

Le altre versioni sono molto simili, quindi posterò solo le versioni ridotte a icona:

Versione 2: nessun input da riga di comando (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

Versione 3: rimozione n. 0, con input da riga di comando (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

Versione 4: nessuna delle cose fantasiose (nessuna rimozione 0 o input da riga di comando) (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

Istruzioni d'uso

In un terminale, eseguire (versioni 1 e 3)

lua interesting.lua HOURS MINUTES SECONDS

o solo

lua interesting.lua

Se si desidera che si spenga l'orologio di sistema.

C'è un premio per la completezza delle funzionalità? : P

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.