Encontre a próxima hora "interessante"

9

Por acaso, olhei para o meu relógio hoje exatamente às 11:11:11 (e hoje é 1/11; pena que não é 2011), e isso me fez pensar: eu sei! Eu deveria fazer disso uma questão de código de golfe! Eu sou um trouxa.

De qualquer forma, seu desafio é levar uma hora, minuto e segundo como entrada e gerar o próximo horário "interessante". Aqui, definirei interessante como estas etapas:

  1. Concatene a hora, o minuto e o segundo. (Por exemplo, às 4:14:14, seria 41414.)
  2. Verifique se há grupos consecutivos de um, dois ou três que abrangem o comprimento de toda a cadeia. Por exemplo, eu poderia encontrar [41][41][4]no tempo do exemplo (se o grupo não puder alcançar a string, basta cortá-la como fiz neste exemplo). Outro exemplo: no tempo em meu primeiro exemplo no início da questão, seria [1][1][1][1][1][1], [11][11][11]ou [111][111].
  3. Existe um grupo consecutivo que percorre todo o caminho da cadeia? Nesse caso, o tempo é "interessante!" Caso contrário, não é.

A entrada pode estar em qualquer formato razoável , mas não deve ser codificada. A saída também pode estar em qualquer formato razoável e não precisa estar no mesmo formato da entrada.

Se você usa o acesso à rede por algum motivo, todos os bytes baixados da rede contam para a sua pontuação.

Isso é ; o código mais curto em bytes vence.

Maçaneta da porta
fonte
11
É janeiro, não novembro: P
Volatilidade
@Volatility Whoops, erro tipográfico :-P fixo
Doorknob
11
Eu gosto da restrição de acesso à rede.
precisa saber é o seguinte
11
O código deve considerar apenas os horários em um relógio de 12 horas? Por exemplo, em um relógio de 24 horas 14:14:14 seria um momento interessante, mas não tão interessante em um relógio de 12 horas (02:14:14)
Kevin Anderson

Respostas:

2

J, 113 99 90

Provavelmente ainda é bastante jogável.

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

Pega um vetor (h m s)como entrada e retorna um vetor no mesmo formato da saída.

Exemplos:

   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
Volatilidade
fonte
1

Haskell - 227223

Essa é uma maneira de fazer isso.

    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]

Exemplos

λ: i [11,11,11]
[11,21,1]
λ: i [4,14,14]
[4,14,41]
swish
fonte
Você poderia publicar uma amostra de execução? Eu sou ignorante sobre Haskell então eu não tenho idéia de como a entrada / saída funciona, etc :-P
Doorknob
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}]&

Ele retorna um padrão do próximo momento interessante:

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

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

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

a_ marca o fim dos tempos.

ybeltukov
fonte
1

Lua

Eu tenho quatro soluções diferentes, pois não tinha certeza sobre alguns dos requisitos.

Versão 1: remoção de 0s, entrada de linha de comando, bem como os.time () backup (315)

Minimizado:

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

Versão completa com comentários:

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

As outras versões são muito semelhantes, então eu publicarei apenas as versões minimizadas:

Versão 2: nenhuma entrada de linha de 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

Versão 3: remoção 0, com entrada de linha de 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

Versão 4: nenhuma das coisas sofisticadas (nenhuma remoção de 0 ou entrada de linha de 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

Instruções de uso

Em um terminal, execute (versões 1 e 3)

lua interesting.lua HOURS MINUTES SECONDS

ou apenas

lua interesting.lua

Se você deseja que ele desligue o relógio do sistema.

Existe um prêmio pela integridade dos recursos? : P

finnbar
fonte