Finde alle Zeiten, die einem Muster folgen

13

Ihre Aufgabe ist es, ein Programm zu schreiben, das alle Male (im Format HH: MM, 24 Stunden) nach einem der folgenden Muster druckt:

  • Stunden entsprechen Minuten, zB 22: 22,01: 01
  • Stunden entsprechen umgekehrten Minuten, z. B. 10:01, 01:10, 22:22
  • Sequenzen, die mit H: MM oder HH: MM übereinstimmen, werden immer mit HH: MM gedruckt. ZB 00:12, 01:23, 23:45, 03:45 usw. (immer ein einzelner Schritt zwischen den Ziffern)

Regeln:

  • Sie können jede Sprache wählen, die Sie mögen
  • Sie können nicht mehrmals drucken
  • Einmal pro Zeile in der Reihenfolge des Tages
  • Der Gewinner wird am 5. Februar ermittelt.

PS: Dies ist meine erste Frage, es könnte einige Inkonsistenzen geben. Fühlen Sie sich frei zu bearbeiten.

PS2: Hier sind die erwarteten 44 Lösungen (bereits vorgestellt von Josh und primo, Danke!)

00:00
00:12
01.01
01.10
01:23
02.02
02:20
02:34
03.03
03:30
03:45
04.04
04:40
04:56
05.05
05:50
06.06
07.07
08.08
09.09
10:01
10:10
11:11
12:12
12:21
12:34
13:13
13:31
14:14
14:41
15:15
15:51
16:16
17:17
18:18
19:19
20.02
20:20
21:12
21:21
22:22
23:23
23:32
23:45
RSFalcon7
quelle
2
Ich würde erwarten, dass 3:45das 03:45im HH:MMFormat geschrieben ist und somit keine Sequenz.
Howard
richtig! Ich vermisse das in den Beispielen
RSFalcon7
3
wird 13:57als eine Folge zählen? Was ist 6:54? In diesem Sinne 6:42muss auch entschieden werden.
John Dvorak
3
Werden Zeiten mit nur einer Ziffer, die keine führende Null ist, als 00:01Folge gezählt?
Josh
2
@ RSFalcon7 Werden also nur einige führende Nullen ignoriert? Welche? 23:45, 02:34, 00:23, 00:02 scheinen ähnliche Fälle zu sein.
Joachim Isaksson

Antworten:

4

Golfscript ( 82 72)

Immer noch ein Anfänger, aber es gab keine GS-Antwort, also ... :)

24,{'0'\+-2>..+\.-1%+}%5,{'0'7,{+}/>4<.(;0\+}%|{2=54<},$);{2/~':'\++}%n*
Joachim Isaksson
quelle
PHP wird das nicht übertreffen können.
Primo
Und C wird das definitiv nicht schlagen können.
Josh
4

PHP - 93 Bytes

<?for(;24>$h;)@ereg(+$h=&date(i,$i).$m=date(s,$i++),"0123456$h$h".strrev($h))&&print"$h:$m
";

Dies findet Muster wie 02:34oder, findet aber keine Muster wie 00:23oder 00:02. Wenn ich die Erläuterungen des OP in den Kommentaren verstehe, ist dies richtig.

Druckt insgesamt 44 Ergebnisse:

00:00
00:12
01:01
01:10
01:23
02:02
02:20
02:34
03:03
03:30
03:45
04:04
04:40
04:56
05:05
05:50
06:06
07:07
08:08
09:09
10:01
10:10
11:11
12:12
12:21
12:34
13:13
13:31
14:14
14:41
15:15
15:51
16:16
17:17
18:18
19:19
20:02
20:20
21:12
21:21
22:22
23:23
23:32
23:45
primo
quelle
4

C 118 (ursprünglich 136)

h,m;main(){h<24&&main(m>57?m=0,h++:h==m|h==m%10*10+m/10|m-12==h*11|h==m-22&!(~-m++%11)&&printf("%02d:%02d\n",h,m-1));}

Eine iterative Version mit 119 Zeichen:

h;main(m){for(;h<24;h++)for(m=0;m<57;m++)h==m|h==m%10*10+m/10|m-12==h*11|h==m-22&!(~-m%11)&&printf("%02d:%02d\n",h,m);}

Ein großes Dankeschön an @squeamish ossifrage!

Josh
quelle
1
Sollte jetzt gut sein.
Josh
2
Meine Lösung gibt solche (wie 02:34) aus. Die Regel m-12==h*11fängt sie.
Josh
2
Sie könnten ersetzen 100*h+m==1234||100*h+m==2345durch ((m-h)==22)&&!((m-1)%11)(vielleicht sogar mit weniger Klammern)
zimperliche Ossifrage
1
Jackpot! Zurück zu 128 Zeichen. Vielen Dank!
Josh
1
Mein Verständnis war, keine Sequenzen einzuschließen, die nur eine einzige Ziffer haben, wie z 00:01. Ich werde die ursprüngliche Frage zur Klärung posten.
Josh
2

Python (178)

s=sorted
for i in[x for x in['%04d'%i for i in range(2400)if i/10%10<6]if s(x[:2])==s(x[2:])or len({i-ord(y)for i,y in enumerate(x.lstrip('0'))})==1]:print'%2s:%2s'%(i[:2],i[2:])

Das Entfernen aller führenden Nullen vor der Sequenz ergibt insgesamt 57 Ergebnisse.

Joachim Isaksson
quelle
2

APL (90)

F←{,'ZI2'⎕FMT⍵}⋄↑⊃¨{(F⍺),':',F⍵}/¨Z/⍨{(⍺=⍵)∨(≡/0 1⌽∘F¨⍺⍵)∨∧/¯1=2-/⍎¨(⍕⍺),F⍵}/¨Z←,1-⍨⍳24 60
Marinus
quelle
Das ist es. Ich mache einen Perl-Dialekt, bei dem jedes Schlüsselwort und die meisten Funktionen ein einzelnes Zeichen sind. +1, übrigens;)
Primo
1

Javascript - 171 Zeichen (02.05.14)!

for(h='00';+h<24;h=(++h<10?'0':'')+h)for(m='00';+m<60;m=(++m<10?'0':'')+m)if(h[1]+h[0]==m||h==m||+m[1]-m[0]==1&&+m[0]-h[1]==1&&(!+h[0]||+h[1]-h[0]==1))console.log(h+':'+m)

Ich bekomme ernsthaft den Dreh raus zum Golfen. Wenn ich jetzt zurückblicke, habe ich fast 30 Zeichen gekürzt! JSBin .

Ungolfed (und kommentiert):

// Note: +'string' is same as 'parseInt(string, 10)'
// Also, this code is not the shortest one, I have purposely made this code longer for
// understanding purposes

for(h = '0'; +h < 24; h = +h + 1 + '') //initialize h(our), loop while it's less than 24
{                                      // increase it by 1 and cast back to string
    for(m = '0'; +m < 60; m= +m + 1 + '') // intialize m(inute), loop while < 60
    {                                  // increase it by 1 and cast back to string
        if(h.length < 2) h = 0 + h;    // if it is '9', convert to '09'
        if(m.length < 2) m = 0 + m;    // if it is '9', convert to '09'

        // Tests for printing
        if(h[0] === m[1] && m[0] === h[1] ||
           h === m ||
           +m[1] - +m[0] === 1 && +m[0] - +h[1] === 1 && (+h[0] === 0 || +h[1] -+ h[0] === 1))
        console.log(h + ':' + m);  // print
    } // inner loop end
}     // outer loop end

187 Zeichen (alt) (02.04.14)

for(h='00';+h<24;h=(+h<9?'0':'')+(+h+1))for(m='00';+m<60;m=(+m<9?'0':'')+(+m+1))if(h[0]==m[1]&&m[0]==h[1]||h==m||+m[1]-m[0]==1&&+m[0]-h[1]==1&&(!+h[0]||+h[1]-h[0]==1))console.log(h+':'+m)

Ein bisschen experimentieren und viel verbessern (9 Zeichen) :) JSBin

196 Zeichen (alt) (02.03.14)

for(h='00';+h<24;h=(+h<9?'0':'')+(+h+1))for(m='00';+m<60;m=(+m<9?'0':'')+(+m+1))if(h[0]==m[1]&&m[0]==h[1]||h==m||+m[1]-m[0]==1&&+m[0]-h[1]==1&&(!+h[0]||+h[1]-h[0]==1))console.log(h+':'+m)

Saß mit einem frischen Verstand und verbesserte es viel, ein Einzeiler :) JSBin .

208 Zeichen (alt) (02.02.14)

for(h='0';+h<24;h=+h+1+''){for(m='0';+m<60;m=+m+1+''){if(h.length<2)h=0+h
if(m.length<2)m=0+m
if(h[0]==m[1]&&m[0]==h[1]||h==m||+m[1]-+m[0]==1&&+m[0]-+h[1]==1&&(+h[0]==0||+h[1]-+h[0]==1))console.log(h+':'+m)}}

Gibt genau die 44 benötigten Zeiten an (jeweils in neuer Zeile)

Wird meinen Code weiter verbessern.

Ich würde mich über Feedback sehr freuen. Vielen Dank.

Gaurang Tandon
quelle
Kürzlich aktualisiert !!
Gaurang Tandon
1

Python 3, 248 Zeichen

Ich schätze, ich bin etwas spät dran und auch nicht sehr gut, aber endlich habe ich meine erste Codegolf-Sache zu teilen:

Ich habe mich entschieden, nur echte Sequenzen wie 01:23 und 23:45 zu unterstützen, nicht 00:12. Wie auch immer, ich wette, es gibt eine Menge zu verbessern, also machen Sie bitte weiter und teilen Sie mir einen Kommentar mit.

import itertools as t
s=sorted
r=range
i=int
d='%02d'
e=d+':'+d
print([e%(i(a[0]),i(a[1])) for a in t.product([d% x for x in r(0,24)], [d% x for x in r(0,60)]) if s(a[0])==s(a[1]) or list(a[0]+a[1])==[str(x) for x in r(i(a[0][0]),i(a[1][-1])+1)]])

Habe die sehr anschauliche Version dazu auf meinem Pastebin

Oliver Friedrich
quelle
0

Delphi

Ich arbeite immer noch daran, aber das ist es, was ich bisher habe.
Es funktioniert, aber ich bin mir sicher, dass es möglich ist, es kürzer zu machen.
Bearbeiten: Druckt 48 Mal.

Ohne Einzug 422 Zeichen

uses System.SysUtils,DateUtils;var t:TTime;a,b,c,d:integer;s:string;begin t:=StrToTime('00:01');while t<StrToTime('23:59')do begin s:=FormatDateTime('hhnn',t);a:=StrToInt(s[1]);b:=StrToInt(s[2]);c:=StrToInt(s[3]);d:=StrToInt(s[4]);if((a+1=b)and(b+1=c)and(c+1=d))or((a=0)and(b+1=c)and(c+1=d))or((a=0)and(b=0)and(c+1=d))or((a=d)and(b=c))or((a=c)and(b=d))then WriteLn(FormatDateTime('hh:nn',t));t:=IncMinute(t)end;ReadLn;end.

Mit 557 Zeichen Einzug

uses
  System.SysUtils, DateUtils;

var
  t:TTime;
  a,b,c,d:integer;
  s:string;
begin
  t:=StrToTime('00:01');
  while t<StrToTime('23:59')do
  begin
    s:=FormatDateTime('hhnn',t);
    a:=StrToInt(s[1]);
    b:=StrToInt(s[2]);
    c:=StrToInt(s[3]);
    d:=StrToInt(s[4]);
    if((a+1=b) and (b+1=c) and (c+1=d)) or
      ((a=0) and (b+1=c) and (c+1=d)) or
      ((a=0) and (b=0) and (c+1=d)) or
      ((a=d) and (b=c)) or ((a=c) and (b=d)) then
      WriteLn(FormatDateTime('hh:nn',t));
    t:=IncMinute(t)
  end;
  ReadLn;
end.
Teun Pronk
quelle
0

q (116)

distinct{t:string 00:00+x;$[(t[0 1]in(t[3 4];t[4 3]))|all 1=1_deltas{"I"$x}each t[0 1 3 4];t;"00:00"]}each til 1440

Inkrementiert 00:00 bis 23:59, wandelt in eine Zeichenfolge um und überprüft dann (Test 1 oder 2) oder 3

Ausgabe:

("00:00";"01:01";"01:10";"01:23";"02:02";"02:20";"03:03";"03:30";"04:04";"04:40";"05:05";"05:50";"06:06";"07:07";"08:08";"09:09";"10:01";"10:10";"11:11";"12:12";"12:21";"12:34";"13:13";"13:31";"14:14";"14:41";"15:15";"15:51";"16:16";"17:17";"18:18";"19:19";"20:02";"20:20";"21:12";"21:21";"22:22";"23:23";"23:32";"23:45")
nightTrevors
quelle
0

PHP - 56 39 31 Bytes

<? http_redirect("goo.gl/W2M5mo")?>

Es verbiegt die Regeln in keiner Weise. Sie müssen das Modul pecl_http installiert und short_open_tag in php.ini auf "1" gesetzt haben.

user3188175
quelle
+1, wenn auch sonst nichts für Schlauheit, obwohl Octave es mit 38 Zeichen übertrifft disp(urlread('http://bit.ly/1fzhb3C')):)
Joachim Isaksson
... obwohl Sie wahrscheinlich das benutzerdefinierte statische HTML berücksichtigen sollten, laden Sie einen Teil des Quellcodes, andernfalls würde eine statische Datei ausreichen (und ebenfalls nicht gezählt werden ...?)
Joachim Isaksson
-7

TI-BASIC

Für Ihren TI-84 Taschenrechner

DelVar AWhile A<24:A+1→A:Disp A,":",A:End
Timtech
quelle
3
Inwiefern beantwortet dies die Frage?
Howard
2
Um fair zu sein, lautet die Frage "folge einem der folgenden Muster"
Danny
2
@Danny Ich denke, das verbiegt die Regeln zu sehr.
John Dvorak
1
@ JanDvorak Wie biegt das die Regeln ???
Timtech
2
OK ... lassen Sie mich über andere Möglichkeiten nachdenken, um diese Regel auszudrücken. Ich bin mir immer noch nicht sicher, ob Sie es absichtlich falsch interpretiert haben, aber es scheint mir und den anderen Antwortenden bis jetzt klar genug zu sein.
John Dvorak