Encuentra el próximo momento "interesante"

9

Ojeé mi reloj hoy exactamente a las 11:11:11 (y hoy es 1/11; lástima que no sea 2011), y eso me hizo pensar: ¡ Lo sé! ¡Debería hacer una pregunta de código de golf con esto! Soy una idiota.

De todos modos, su desafío es tomar una hora, minuto y segundo como entrada, y generar la próxima hora "interesante". Aquí, definiré interesantes como estos pasos:

  1. Concatenar la hora, minuto y segundo. (Por ejemplo, a las 4:14:14, esto sería 41414.)
  2. Verifique los grupos consecutivos de uno, dos o tres que abarcan la longitud de toda la cadena. Por ejemplo, podría encontrar [41][41][4]en el tiempo de ejemplo (si el grupo no puede alcanzar a través de la cadena, simplemente córtelo como lo hice en este ejemplo). Otro ejemplo: en el momento de mi primer ejemplo al principio de la cuestión, sería [1][1][1][1][1][1], [11][11][11]o [111][111].
  3. ¿Hay un grupo consecutivo que atraviese la cadena? Si es así, ¡el tiempo es "interesante!" De lo contrario, no lo es.

La entrada puede estar en cualquier formato razonable , pero no debe estar codificada. La salida también puede estar en cualquier formato razonable y no necesita estar en el mismo formato que la entrada.

Si utiliza el acceso a la red por algún motivo, todos los bytes descargados de la red cuentan para su puntaje.

Este es el ; el código más corto en bytes gana.

Pomo de la puerta
fuente
1
Es enero, no noviembre: P
Volatilidad
@Volatility chillidos, error tipográfico :-P fijo
Pomo
1
Me gusta la restricción de acceso a la red.
Kyle Kanos
1
¿El código solo debe considerar las horas en un reloj de 12 horas? Por ejemplo, en un reloj de 24 horas 14:14:14 sería un momento interesante pero no tan interesante en un reloj de 12 horas (2:14:14)
Kevin Anderson

Respuestas:

2

J, 113 99 90

Probablemente sigue siendo bastante golfable.

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

Toma un vector (h m s)como entrada y devuelve un vector en el mismo formato que la salida.

Ejemplos:

   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
Volatilidad
fuente
1

Haskell - 227223

Esa es una forma de hacerlo.

    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]

Ejemplos

λ: i [11,11,11]
[11,21,1]
λ: i [4,14,14]
[4,14,41]
silbido
fuente
¿Podría publicar una muestra de ejecución? No tengo idea de Haskell, así que no tengo idea de cómo funciona la entrada / salida, 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}]&

Devuelve un patrón de la próxima vez interesante:

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

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

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

a_ marca el fin de los tiempos.

ybeltukov
fuente
1

Lua

Tengo cuatro soluciones diferentes, ya que no estaba seguro acerca de algunos de los requisitos.

Versión 1: eliminación de 0s, entrada de línea de comando y copia de seguridad os.time () (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

Versión completa con comentarios:

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

Las otras versiones son muy similares, por lo que solo publicaré las versiones minimizadas:

Versión 2: sin entrada de línea 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

Versión 3: sin eliminación de 0, con entrada de línea 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

Versión 4: ninguna de las cosas elegantes (sin eliminación de 0 o entrada de línea 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

Instrucciones de uso

En una terminal, ejecute (versiones 1 y 3)

lua interesting.lua HOURS MINUTES SECONDS

o solo

lua interesting.lua

Si desea que se apague el reloj del sistema.

¿Hay algún premio por la integridad de las características? :PAGS

finnbar
fuente