Trouvez le prochain moment «intéressant»


9

Il m'est arrivé de jeter un coup d'œil à ma montre aujourd'hui à exactement 11:11:11 (et aujourd'hui c'est 1/11; dommage que ce ne soit pas 2011), et cela m'a fait penser: je sais! Je devrais en faire une question de code! Je suis un dork.

Quoi qu'il en soit, votre défi est de prendre une heure, une minute et une seconde en entrée et de sortir la prochaine fois "intéressante". Ici, je vais définir intéressant comme ces étapes:

  1. Concatène l'heure, la minute et la seconde. (Par exemple, à 4:14:14, ce serait 41414.)
  2. Recherchez les groupes consécutifs d'un, deux ou trois qui couvrent la longueur de la chaîne entière. Par exemple, je pourrais trouver [41][41][4]dans l'exemple de temps (si le groupe ne peut pas atteindre à travers la chaîne, il suffit de le couper comme je l'ai fait dans cet exemple). Un autre exemple: dans le temps dans mon premier exemple au début de la question, ce serait [1][1][1][1][1][1], [11][11][11]ou [111][111].
  3. Y a-t-il un groupe consécutif qui va jusqu'au bout de la chaîne? Si oui, le moment est "intéressant!" Sinon, ce n'est pas le cas.

L'entrée peut être dans n'importe quel format raisonnable , mais elle ne doit pas être codée en dur. La sortie peut également être dans n'importe quel format raisonnable , et elle n'a pas besoin d'être au même format que l'entrée.

Si vous utilisez l'accès au réseau pour une raison quelconque, tous les octets téléchargés à partir du réseau comptent pour votre score.

C'est ; le code le plus court en octets gagne.


1
C'est janvier, pas novembre: P
Volatilité

@Volatility Whoops, faute de frappe :-P fixe
Poignée de porte

1
J'aime la restriction d'accès au réseau.
Kyle Kanos

1
Le code ne devrait-il prendre en compte que les heures sur une horloge de 12 heures? Par exemple, sur une horloge de 24 heures, 14:14:14 serait une heure intéressante mais pas aussi intéressante sur une horloge de 12 heures (2:14:14)
Kevin Anderson

Réponses:


2

J, 113 99 90

Probablement encore assez golfable.

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

Prend un vecteur (h m s)en entrée et renvoie un vecteur au même format que la sortie.

Exemples:

   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

C'est une façon de procéder.

    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]

Exemples

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

Pourriez-vous publier un exemple de cycle? Je suis la moindre idée de Haskell donc je ne sais pas comment l'entrée / sortie fonctionne, 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}]&

Il renvoie un motif de la prochaine fois intéressante:

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

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

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

a_ marque la fin du temps.


1

Lua

J'ai quatre solutions différentes, car je n'étais pas sûr de certaines des exigences.

Version 1: suppression des 0, entrée de ligne de commande ainsi que sauvegarde os.time () (315)

Minimisé:

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

Version complète avec commentaires:

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

Les autres versions sont très similaires, donc je ne publierai que les versions réduites:

Version 2: aucune entrée de ligne de commande (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

Version 3: pas de suppression 0, avec entrée de ligne de commande (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

Version 4: aucun des trucs de fantaisie (pas de suppression 0 ou d'entrée de ligne de commande) (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

Instructions d'utilisation

Dans un terminal, exécutez (versions 1 et 3)

lua interesting.lua HOURS MINUTES SECONDS

ou juste

lua interesting.lua

Si vous voulez qu'il disparaisse de l'horloge système.

Y a-t-il un prix pour l'exhaustivité des fonctionnalités? : P

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.