Trova tutte le volte che seguono uno schema


13

Il tuo lavoro è scrivere un programma che stampa tutte le volte (nel formato HH: MM, 24 ore) che segue uno dei seguenti schemi:

  • Ore pari a minuti, ad es. 22: 22,01: 01
  • Ore pari a minuti inversi, ad esempio 10:01, 01:10, 22:22
  • Sequenze, che corrispondono a H: MM o HH: MM, sempre stampate con HH: MM. Ad esempio 00:12, 01:23, 23:45, 03:45, ecc. (Sempre un singolo passaggio tra le cifre)

Regole:

  • Puoi scegliere la lingua che preferisci
  • Non è possibile stampare tempi ripetuti
  • Una volta per riga, seguendo l'ordine del giorno
  • Il vincitore sarà scelto il 5 febbraio.

PS: questa è la mia prima domanda, potrebbe avere alcune incongruenze. Sentiti libero di modificare.

PS2: ecco le previste 44 soluzioni (già presentate da Josh e primo, grazie!)

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
00:12
00:21
00: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

2
Mi aspetto che 3:45sia scritto 03:45in HH:MMformato e quindi non una sequenza.
Howard,

giusto! Mi manca questo negli esempi
RSFalcon7,

3
non 13:57conta come una sequenza? Che dire 6:54? Sulla stessa nota, 6:42deve essere deciso anche.
John Dvorak,

3
I tempi con una sola cifra che non è uno zero iniziale come 00:01contare come una sequenza?
Josh,

2
@ RSFalcon7 Quindi solo alcuni zeri iniziali vengono ignorati? Quale? 23:45, 02:34, 00:23, 00:02 sembrerebbero casi simili.
Joachim Isaksson,

Risposte:


4

Golfscript ( 82 72)

Ancora un principiante, ma non c'era una risposta GS, quindi ... :)

24,{'0'\+-2>..+\.-1%+}%5,{'0'7,{+}/>4<.(;0\+}%|{2=54<},$);{2/~':'\++}%n*

PHP non sarà in grado di batterlo.
primo

E C sicuramente non sarà in grado di batterlo.
Josh,

4

PHP - 93 byte

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

Questo troverà schemi come 02:34, ma non troverà schemi come 00:23o 00:02. Se capisco i chiarimenti dell'OP nei commenti, questo è corretto.

Stampa un totale di 44 risultati:

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

4

C, 118 (inizialmente 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));}

Una versione iterativa con 119 caratteri:

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);}

Un grande grazie a @squeamish ossifrage!


1
Dovrebbe essere buono ora.
Josh,

2
La mia soluzione produce quelli (come 02:34). La regola m-12==h*11li cattura.
Josh,

2
Potresti sostituirlo 100*h+m==1234||100*h+m==2345con ((m-h)==22)&&!((m-1)%11)(forse anche con meno parentesi)
r3mainer

1
Montepremi! Torna indietro a 128 caratteri. Grazie!
Josh,

1
La mia comprensione era di non includere sequenze che hanno una sola cifra come 00:01. Invierò sulla domanda originale per chiarimenti.
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:])

Eliminare tutti gli zero iniziali prima delle sequenze produce 57 risultati in totale.


2

APL (90)

F←{,'ZI2'⎕FMT⍵}⋄↑⊃¨{(F⍺),':',F⍵}/¨Z/⍨{(⍺=⍵)∨(≡/0 1⌽∘F¨⍺⍵)∨∧/¯1=2-/⍎¨(⍕⍺),F⍵}/¨Z←,1-⍨⍳24 60

Questo è tutto. Vado a fare un dialetto di perl in cui ogni parola chiave e la maggior parte delle funzioni sono un singolo carattere. +1, a proposito;)
primo

1

Javascript - 171 caratteri (5/5/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)

Prendo sul serio il golf. Se guardo indietro da adesso, ho ridotto di quasi 30 caratteri! JSBin .

Ungolf (e commentato):

// 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 caratteri (vecchio) (4/2/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)

Un po 'di sperimentazione e miglioramento del lotto (9 caratteri) :) JSBin

196 caratteri (Vecchio) (3/2/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)

Seduto con una mente fresca e migliorato molto, una fodera :) JSBin .

208 caratteri (Vecchio) (2/2/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)}}

Fornisce esattamente i 44 tempi richiesti (ciascuno nella nuova riga)

Continuerò a migliorare il mio codice.

Gradirei molto qualsiasi feedback. Grazie.


Aggiornato di recente !!
Gaurang Tandon,

1

Python 3, 248 caratteri

Suppongo di essere un po 'in ritardo e non molto bravo, ma alla fine ho avuto la mia prima cosa da codegolf da condividere:

Ho deciso di supportare solo sequenze reali come 01:23 e 23:45, non 00:12. Comunque, scommetto che c'è molto da fare meglio, quindi per favore vai avanti e condividi un commento con me.

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)]])

Ho la versione molto descrittiva insieme ad essa sul mio pastebin


0

Delphi

Ci sto ancora lavorando, ma questo è quello che ho finora.
Funziona, ma sono sicuro che è possibile accorciarlo.
Modifica: stampa 48 volte.

Senza trattino 422 caratteri

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.

Con trattino 557 caratteri

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.

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

Incrementa da 00:00 a 23:59, lancia su stringa, quindi seleziona (test 1 o 2) o 3

Produzione:

("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")

0

PHP - 56 39 31 byte

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

Non piega le regole in alcun modo. È necessario il modulo pecl_http installato e short_open_tag impostato su "1" in php.ini.


+1, se non altro per subdolo, anche se Octave lo batte a 38 caratteri disp(urlread('http://bit.ly/1fzhb3C')):)
Joachim Isaksson

... anche se probabilmente dovresti considerare l'HTML statico personalizzato che stai caricando una parte del codice sorgente, altrimenti farebbe un file statico (e allo stesso modo non verrà conteggiato ...?)
Joachim Isaksson

-7

TI-BASIC

Per la tua calcolatrice TI-84

DelVar AWhile A<24:A+1→A:Disp A,":",A:End

3
In che modo risponde alla domanda?
Howard,

2
Per essere onesti la domanda afferma che "segui uno dei seguenti schemi"
Danny,

2
@Danny Penso che questo stia piegando troppo le regole, però.
John Dvorak,

1
@JanDvorak Come sta piegando le regole ???
Timtech,

2
OK ... fammi pensare ad altri modi per esprimere quella regola. Non sono ancora sicuro che tu abbia frainteso di proposito, ma sembra abbastanza chiaro a me così come all'altra risposta finora.
John Dvorak,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.