Che ora è?


25

Mi piace risparmiare tempo quasi letteralmente, indossando tre orologi al polso ... Il problema è che ognuno di loro ha un tempo diverso. Un orologio è indietro di x minuti rispetto all'ora effettiva. Un orologio è x minuti in anticipo rispetto all'ora effettiva. L'ultimo orologio mostra l'ora effettiva.

Il problema è che non riesco a capire quale orologio ha l'ora corretta ...

A partire dall'ora visualizzata su ciascun orologio, determinare l'ora effettiva. Se non è possibile determinare l'ora, stampare "Guarda il sole".

Input: tre letture, separate da singoli caratteri di spazio: H1:M1 H2:M2 H3:M3 in ciascuna lettura H1, H2, H3 rappresentano le ore visualizzate (0 <H1, H2, H3 <13) e M1, M2, M3 rappresentano i minuti visualizzati (0 <= M1 , M2, M3 <60). Se il numero di minuti è inferiore a 10, viene immesso uno 0 iniziale nell'input. Allo stesso modo, se il numero di ore è inferiore a 10, viene inserito uno 0 iniziale nell'input.

Uscita: The correct time is HH:MM dove HH: MM è l'ora corretta. Se non è possibile determinare l'ora corretta, viene visualizzato Look at the sun.

Ingresso 1: 05:00 12:00 10:00

Uscita 1: The correct time is 05:00

Ingresso 2: 11:59 12:30 01:01

Uscita 2: The correct time is 12:30

Ingresso 3: 12:00 04:00 08:00

Uscita 3: Look at the sun

Il codice più corto vince ... Non si applicano penalità speciali. Inoltre, tieni presente che abbiamo a che fare con un orologio di 12 ore ... Non mi interessa AM o PM ... Immagina di avere a che fare con orologi analogici ...


Per ora corretta, intendi l'ora locale attuale?
Ottimizzatore

7
@sanchises Perché sono distanti 4 ore. 12:00è esattamente tra 8:00e 4:00anche, sai ...
Siguza

1
Dici che l'output è del modulo The correct time is HH:MM, senza un punto, ma poi procedi con un punto nei primi due esempi. Quale versione è corretta?
Sp3000,

1
È consentito leggere i tempi come argomenti della riga di comando?
Dennis,

1
Come in whattimeisit 07:21 08:39 08:00? Sicuro!
WallyWest,

Risposte:


10

CJam, 86 83 77 75 71 byte

"The correct time is "ea{aea+':f/60fb(f-:+720%!},{];"Look at the sun"}*

Grazie a @ jimmy23013 per giocare a golf a 6 byte dal mio codice.

Provalo online nell'interprete CJam .

Casi test

$ cjam time.cjam 05:00 12:00 10:00; echo
The correct time is 05:00
$ cjam time.cjam 11:59 12:30 01:01; echo
The correct time is 12:30
$ cjam time.cjam 12:00 04:00 08:00; echo
Look at the sun

Come funziona

"The correct time is "
        e# Push that string.
ea      e# Push the array of command-line arguments.
{       e# Filter; for each time T:
  a     e#   Wrap T in an array.
  ea+   e#   Concatenate with the array of all times.
  ':f/  e#   Split each time at the colon.
  60fb  e#   Consider it a base 60 integer.
  (f-   e#   Shift out the converted T and subtract it from the remaining times.
  :+    e#   Add them.
  720%! e#   Push 1 is the sum is 0 modulo 720 and 0 if not.
},      e#   Keep the time iff a 1 has been pushed.

        e# The array on the stack now contains one or three times.

{       e# Reduce; for each time but the first:
  ];    e#   Discard the entire stack.
  "Look at the sun"
        e#   Push that string.
}*      e#

1
qS/_':f/60fb_f{f-:+720%!,}\"The correct time is "f\2/.e&$("Look at the sun"@?. bimplica :i.
jimmy23013,

3
"The correct time is "lS/_':f/60fb:T.{Tf-:+720%{}@?}{];"Look at the sun"}*.
jimmy23013,

Hai perso il caso quando x = 0
Lakshay Garg,

@LakshayGarg: la domanda dice che ognuno di loro ha un tempo diverso . Sarebbe falso se x = 0.
Dennis,

@Dennis Potresti riuscire a ridurlo ulteriormente, non è necessario il punto di arresto alla fine ...
WallyWest

7

JavaScript ( ES6 ), 164 168 172

Per ogni lettura, calcola la distanza dalle altre due. Quello che ha la stessa distanza è ciò di cui hai bisogno. Se ce n'è più di uno, non puoi dirlo.

F=s=>(s=s.split(' '))
  .map(x=>([h,m]=x.split(':'),+m+(h%12)*60))
  .map((v,i,z)=>(v+v-z[++i%3]-z[++i%3])%720||'The correct time is '+s[k+=i],k=-2)
[k]||'Look at the sun'


// TEST

out=x=>O.innerHTML += x+'\n';

['12:30 01:01 11:59', '11:50 11:55 12:00', '05:00 12:00 10:00', '12:10 04:10 08:10', '07:00 06:00 08:00']
.forEach(x => out(x + ' -> ' + F(x)))

go=_=>out(I.value + ' -> ' + F(I.value))
<pre id=O></pre>
<input id=I><button onclick="go()">Test</button>


Non dovrebbe dare 3:00 per l'ingresso 3:00 3:00 3:00. Quando x = 0: P
Lakshay Garg

4
@LakshayGarg no. Problem is they each give a different timequindi x non può essere 0.
edc65

Con ogni voto ottenuto, dovresti edc65++.
Alex A.

4

Python 3, 166 163 byte

L=input().split()
f=lambda x:int(x[:2])*60+int(x[3:])
s=""
for a in L:s=[s,s and"Look at the sun"or"The correct time is "+a][(sum(map(f,L))-3*f(a))%720<1]
print(s)

usi

      a-b == b-c
<==>  a+c-2*b == 0
<==>  (a+b+c)-3*b == 0

con aritmetica che è minuti modulo 720.


Utilizzando un approccio simile (a + abc == 0) ho scoperto che l'ordinamento non è necessario. Hai provato ad evitarlo?
edc65,

@ edc65 Ho provato a tenere un conto, ma penso che si sia rivelato più a lungo. Inizialmente avevo anche un + abc ma sono molte le chiamate a f(e pre-list-comp è lunga)
Sp3000

2

Python 2, 254 ... 199 207 203 194 200 200 byte

Probabilmente alcuni modi per accorciarlo, dammi un po 'di tempo ..

t=[x.split(':')for x in raw_input().split()]
a,b,c=[int(x[0])*60+int(x[1])for x in t]
print["The correct time is "+':'.join(t[[(c+a)%720%(b/2)<1,2][(a+b)%720%(c/2)<1]]),"Look at the sun"][(a-b)%240<1]

Grazie a Sp3000 mi ha aiutato a risolvere questo problema.

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.