Finde die nächste "interessante" Zeit

9

Ich habe heute um genau 11:11:11 Uhr auf meine Uhr geschaut (und heute ist 1/11; schade, dass es nicht 2011 ist), und das hat mich zum Nachdenken gebracht: Ich weiß! Ich sollte daraus eine Code-Golf-Frage machen! Ich bin ein Trottel.

Wie auch immer, Ihre Herausforderung besteht darin, eine Stunde, Minute und Sekunde als Eingabe zu nehmen und die nächste "interessante" Zeit auszugeben. Hier werde ich folgende interessante Schritte definieren:

  1. Verketten Sie Stunde, Minute und Sekunde. (Zum Beispiel um 4:14:14 wäre dies 41414.)
  2. Suchen Sie nach aufeinanderfolgenden Gruppen von einer, zwei oder drei, die sich über die Länge der gesamten Zeichenfolge erstrecken. Zum Beispiel könnte ich [41][41][4]in der Beispielzeit finden (wenn die Gruppe nicht durch die Zeichenfolge greifen kann, schneiden Sie sie einfach ab, wie ich es in diesem Beispiel getan habe). Ein anderes Beispiel: in der Zeit , in meinem ersten Beispiel am Anfang der Frage, wäre es [1][1][1][1][1][1], [11][11][11]oder [111][111].
  3. Gibt es eine aufeinanderfolgende Gruppe, die den gesamten String durchläuft? Wenn ja, ist die Zeit "interessant!" Sonst ist es nicht.

Die Eingabe kann in jedem vernünftigen Format erfolgen, darf jedoch nicht fest codiert sein. Die Ausgabe kann auch in einem beliebigen vernünftigen Format erfolgen und muss nicht im selben Format wie die Eingabe vorliegen.

Wenn Sie aus irgendeinem Grund den Netzwerkzugriff verwenden, zählen alle vom Netzwerk heruntergeladenen Bytes zu Ihrer Punktzahl.

Das ist ; Der kürzeste Code in Bytes gewinnt.

Türknauf
quelle
1
Es ist Januar, nicht November: P
Volatilität
@Volatility Whoops, Tippfehler :-P behoben
Türknauf
1
Ich mag die Netzwerkzugriffsbeschränkung.
Kyle Kanos
1
Sollte der Code nur Zeiten im 12-Stunden-Format berücksichtigen? Zum Beispiel wäre eine 24-Stunden-Uhr 14:14:14 eine interessante Zeit, aber nicht so interessant eine 12-Stunden-Uhr (2:14:14)
Kevin Anderson

Antworten:

2

J, 113 99 90

Wahrscheinlich immer noch ziemlich golffähig.

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

Nimmt einen Vektor (h m s)als Eingabe und gibt einen Vektor im gleichen Format wie die Ausgabe zurück.

Beispiele:

   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
Flüchtigkeit
quelle
1

Haskell - 227223

Das ist eine Möglichkeit, es zu tun.

    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]

Beispiele

λ: i [11,11,11]
[11,21,1]
λ: i [4,14,14]
[4,14,41]
swish
quelle
Könnten Sie einen Probelauf posten? Ich habe keine Ahnung von Haskell, daher habe ich keine Ahnung, wie die Ein- / Ausgabe funktioniert usw .:-P
Türknauf
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}]&

Es gibt ein Muster der nächsten interessanten Zeit zurück:

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

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

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

a_ markiert das Ende der Zeit.

ybeltukov
quelle
1

Lua

Ich habe vier verschiedene Lösungen, da ich mir bei einigen Anforderungen nicht sicher war.

Version 1: Entfernen von Nullen, Befehlszeileneingabe sowie Sicherung von os.time () (315)

Minimiert:

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

Vollversion mit Kommentaren:

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

Die anderen Versionen sind sehr ähnlich, daher werde ich nur die minimierten Versionen veröffentlichen:

Version 2: keine Befehlszeileneingabe (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: Keine 0-Entfernung mit Befehlszeileneingabe (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: nichts Besonderes (keine 0-Entfernung oder Befehlszeileneingabe) (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

Gebrauchsanweisung

Führen Sie in einem Terminal aus (Versionen 1 und 3).

lua interesting.lua HOURS MINUTES SECONDS

oder nur

lua interesting.lua

Wenn Sie möchten, dass es von der Systemuhr abweicht.

Gibt es einen Preis für die Vollständigkeit der Funktionen? : P.

finnbar
quelle