Trouvez toutes les heures qui suivent un modèle


13

Votre travail consiste à écrire un programme qui imprime toutes les heures (au format HH: MM, 24 heures) qui suivent l'un des modèles suivants:

  • Heures égales à des minutes, par exemple 22: 22,01: 01
  • Heures égales aux minutes inverses, par exemple 10:01, 01:10, 22:22
  • Séquences correspondant à H: MM ou HH: MM, toujours imprimées avec HH: MM. Par exemple 00:12, 01:23, 23:45, 03:45, etc. (toujours une seule étape entre les chiffres)

Règles:

  • Vous pouvez choisir n'importe quelle langue que vous aimez
  • Vous ne pouvez pas imprimer des heures répétées
  • Une fois par ligne, suivant l'ordre du jour
  • Le gagnant sera choisi le 5 février.

PS: c'est ma première question, il pourrait y avoir quelques incohérences. N'hésitez pas à modifier.

PS2: Voici les 44 solutions attendues (déjà présentées par Josh et primo, merci!)

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
15h15
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
Je m'attends à ce que ce 3:45soit écrit 03:45au HH:MMformat et donc pas une séquence.
Howard

droite! Cela me manque dans les exemples
RSFalcon7

3
ne 13:57compter qu'une séquence? Et alors 6:54? Sur la même note, 6:42il convient également de décider.
John Dvorak

3
Est-ce que les temps avec un seul chiffre qui n'est pas un zéro de tête comme 00:01compter comme une séquence?
Josh

2
@ RSFalcon7 Ainsi, seuls quelques zéros de tête sont ignorés? Lesquels? 23:45, 02:34, 00:23, 00:02 semblent être des cas similaires.
Joachim Isaksson

Réponses:


4

Golfscript ( 82 72)

Encore un débutant, mais il n'y avait pas de réponse GS, alors ... :)

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

PHP ne pourra pas battre cela.
primo

Et C ne pourra certainement pas battre cela.
Josh

4

PHP - 93 octets

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

Cela trouvera des modèles comme 02:34, mais ne trouvera pas de modèles comme 00:23ou 00:02. Si je comprends les clarifications du PO dans les commentaires, c'est correct.

Imprime un total de 44 résultats:

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

Une version itérative de 119 caractères:

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 grand merci à @squeamish ossifrage!


1
Ça devrait être bon maintenant.
Josh

2
Ma solution sort ceux (comme 02:34). La règle les m-12==h*11attrape.
Josh

2
Vous pouvez remplacer 100*h+m==1234||100*h+m==2345par ((m-h)==22)&&!((m-1)%11)(peut-être même avec moins de supports)
r3mainer

1
Cagnotte! Revenez à 128 caractères. Merci!
Josh

1
Ma compréhension était de ne pas inclure les séquences qui ont seulement un seul chiffre comme 00:01. Je posterai sur la question d'origine pour clarification.
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:])

Supprimer tous les zéros en tête avant les séquences donne 57 résultats au total.


2

APL (90)

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

C'est ça. Je suis parti pour faire un dialecte de perl où chaque mot clé et la plupart des fonctions sont un seul caractère. +1, btw;)
primo

1

Javascript - 171 caractères (5/2/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)

Je prends au sérieux le golf. Si je regarde en arrière à partir de maintenant, j'ai coupé près de 30 caractères! JSBin .

Non golfé (et commenté):

// 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 caractères (ancien) (02/02/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 peu d'expérimentation et d'amélioration du lot (9 caractères) :) JSBin

196 caractères (ancien) (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)

Asseyez-vous avec un esprit frais et améliorez-le beaucoup, un seul revêtement :) JSBin .

208 caractères (ancien) (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)}}

Donne exactement les 44 temps requis (chacun dans la nouvelle ligne)

Continuera d'améliorer mon code.

J'apprécierais fortement toute rétroaction. Je vous remercie.


Mis à jour récemment !!
Gaurang Tandon

1

Python 3, 248 caractères

Je suppose que je suis un peu en retard et pas très bon aussi, mais finalement, j'ai eu ma première chose de codegolf à partager:

J'ai décidé de ne prendre en charge que des séquences réelles comme 01:23 et 23:45, pas 00:12. Quoi qu'il en soit, je parie qu'il y a beaucoup à faire pour mieux faire, alors n'hésitez pas et partagez un commentaire avec moi.

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

J'ai la version très descriptive avec moi sur ma boîte à pâte


0

Delphes

J'y travaille toujours mais c'est ce que j'ai jusqu'à présent.
Cela fonctionne, mais je suis sûr qu'il est possible de le raccourcir.
Éditer: imprime 48 fois.

Sans retrait 422 caractères

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.

Avec 557 caractères en retrait

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

Incrémente de 00:00 à 23:59, transforme en chaîne, puis vérifie (test 1 ou 2) ou 3

Production:

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

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

Cela ne détourne en rien les règles. Vous devez installer le module pecl_http et mettre short_open_tag à "1" dans php.ini.


+1, si rien d'autre pour sournois, bien qu'Octave le bat à 38 caractères disp(urlread('http://bit.ly/1fzhb3C')):)
Joachim Isaksson

... bien que vous devriez probablement considérer le HTML statique conçu sur mesure, vous chargez une partie du code source, sinon un fichier statique ferait l'affaire (et ne compterait pas non plus ...?)
Joachim Isaksson

-7

TI-BASIC

Pour votre calculatrice TI-84

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

3
En quoi cela répond-il à la question?
Howard

2
Pour être juste, la question indique "suivez l' un des modèles suivants"
Danny

2
@Danny, je pense que cela déforme trop les règles.
John Dvorak du

1
@JanDvorak Comment est-ce que cela contourne les règles ???
Timtech

2
OK ... laissez-moi réfléchir à d'autres façons d'exprimer cette règle. Je ne sais toujours pas si vous l'avez mal interprété exprès, mais cela semble assez clair pour moi ainsi que pour l'autre répondeur jusqu'à présent.
John Dvorak
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.