Cambia il fuso orario


20

Sfida

Dato un tempo e un fuso orario come input, emette il tempo in quel fuso orario.

Tempo

L'ora verrà indicata nel formato 24 ore in questo modo:

hh:mm

Dove hh è l'ora di due cifre e mm è il minuto di due cifre. Si noti che l'ora e il minuto saranno sempre riempiti con zeri in questo modo:

06:09

Tutti i tempi indicati sono a UTC + 00: 00.

Non è necessario riempire le ore dell'output con zero, ma l'ora deve essere nel formato 24 ore

Fuso orario

Il fuso orario verrà fornito nel seguente formato:

UTC±hh:mm

Dove ± sta per essere un + o un - e hh, è l'ora di due cifre e mm è il minuto di due cifre (di nuovo, questi saranno riempiti con zero).

Per trovare l'ora in quel fuso orario, aggiungere (se il simbolo è +) o sottrarre (se il simbolo è -) il tempo dopo l'ora UTC ± dal tempo immesso.

Ad esempio, se l'input era 24:56e UTC-02:50, sottrai 2 ore e 50 minuti dalle 24:56:

24:56
02:50 -
-----
22:06

L'output sarebbe 22:06.

Esempi

Chicago

Input:  08:50 and UTC-06:00
Output: 02:50

Kathmandu

Input:  09:42 and UTC+05:45
Output: 15:27

Samoa

Input:  06:42 and UTC+13:00
Output: 19:42

Hawaii

Input:  02:40 and UTC-10:00
Output: 16:40

Si noti che questo è andato al giorno precedente.

Tokyo

Input:  17:25 and UTC+09:00
Output: 02:25

Si noti che questo è andato al giorno seguente.

Regole

Non è necessario utilizzare alcuna funzione o libreria di data integrata.

Supponiamo che tutti gli input siano tempi e offset validi.

Il fuso orario sarà nel range UTC-24:00di UTC+24:00compreso.

Nel caso di mezzanotte e mezza , la rappresentazione corretta dovrebbe essere 00:30, no 24:30 .

vincente

Vince il codice più breve in byte.


Che dire di TimeSpan / metodi / classi di durata? Presumo che anche quelli siano esclusi
pinkfloydx33,

Inoltre, i valori di input saranno sempre validi? Cioè 26:02e 08:74non apparirei? Lo stesso per gli offset UTC?
pinkfloydx33,

@ pinkfloydx33 1) Sì, tutti quelli esclusi. 2) Supponi che tutti gli input siano validi
Decadimento beta

Dobbiamo riempire l'output di zero? (es. può essere visualizzato l'ultimo caso di test 2:25)
Loovjo

1
Se l'output non ha bisogno di essere riempito sarebbe un momento 1:5valido invece di 1:05? Penso che solo le ore non dovrebbero essere imbottite. Anche il tuo esempio con 24:56quello non dovrebbe essere 00:56dato che hai dichiarato un intervallo fino a 24:00ed esprimi simile nel tuo scenario di mezzanotte e mezza?
pinkfloydx33,

Risposte:


2

APL (Dyalog APL) , 45 byte

Espressione

Accetta due stringhe come argomento corretto.

24 60⊤∘⍎∘⍕('+-'∩⍕),'/',(0 602':'VFI ¯5∘↑)¨

Provalo online!

Spiegazione

24 60⊤la conversione da numero a base- a 24 b 60

di

la valutazione

di

il formattato (cioè appiattito con spazi di separazione)

('+-'∩⍕) intersezione di "+ -" e input formattato (questo estrae il segno più o meno)

, seguito da

(... quanto segue per ciascuno degli ingressi (il tempo e l'offset)

0 60⊥la conversione da 60 a numero di a b di

2⊃ il secondo elemento di

':'⎕VFIla, utilizzando due punti come separatore di campo, V erified e F ixed I nput di

¯5∘↑ gli ultimi cinque caratteri ("hh: mm")

Istruzioni dettagliate su "17:25" e "UTC + 09: 00"

L'espressione del lato sinistro sui dati del lato destro fornisce i dati della riga successiva.

                       '17: 25 '' UTC + 09: 00 '
                      / / \ \
(...) ¨ applica il treno di funzioni a entrambi gli ingressi
                    / / \ \
¯5∘ ↑ '17: 25 '' UTC + 09: 00 '
':' ⎕VFI '17: 25 ''09: 00' 
2⊃ (1 1) (17 25) (1 1) (9 0)
0 60⊥ ​​17 25 9 0
                      1045 540
                       \ \ / /
Qui è dove ¨ si interrompe e l'esecuzione continua nell'elenco risultante
                         \ \ / /
'/', 1045 540
('+ -' ∩⍕), '/' 1045 540
⍕ '+' '/' 1045 540
⍎ '+ / 1045 540'
24 60⊤ 1585
                              2 25

3

C, 109 byte

a,b,c;f(char*t,char*z){for(c=0;z[3];t=z+=3)sscanf(t,"%d:%d",&a,&b),c+=b+a*60;printf("%d:%02d",c/60%24,c%60);}

Invocare come segue:

int main() { f("17:25", "UTC+09:00"); }

1
Come funziona per compensazioni di tempo negative, ad es. UTC-03:30?
Neil,

Oops, me ne sono dimenticato, ma per fortuna, è una soluzione semplice.
Lynn,

3

JavaScript (ES6), 101 byte

(t,z,g=s=>+(s[3]+s[7]+s[8])+s.slice(3,6)*60,m=g('UTC+'+t)+g(z)+1440)=>(m/60%24|0)+':'+(m/10%6|0)+m%10

Sarebbe 121 byte se riempissi le ore.


3

Python 2, 129 byte

def T(t,a):f=[int.__add__,int.__sub__]["-"in a];m=f(int(t[3:5]),int(a[7:9]));print`f(int(t[0:2])+m/60,int(a[4:6]))%24`+":"+`m%60`

Chiama come T("02:45", "UTC-05:33")


1
Zeri iniziali mancanti nell'output formattato. Dovrebbe dire Python 2 nell'intestazione. Potrebbe ridurre a una funzione di una riga con ;.
Jonathan Allan,


Ah, figo, mi sono perso un po '! Grazie
Jonathan Allan l'

2

Python 2, 84 byte

def f(t,z):i=int;r=60*(i(t[:2])+i(z[3:6]))+i(t[3:])+i(z[3]+z[7:]);print r/60%24,r%60

Tutti i casi di test sono su ideone

Il formato di output è separato dallo spazio, senza zeri iniziali.


2

Java 201 byte

String T(String t,String z){return(24+Integer.valueOf(t.substring(0,2))+Integer.valueOf((String)z.subSequence(3,6)))%24+":"+(60+Integer.valueOf(t.substring(3,5))+Integer.valueOf(z.substring(7,9)))%60;}

Chiamato come T ("12:00", "UTC + 02: 40")

Unglolfed per la logica,

String T(String t, String z) { 
    int i = (24 + Integer.valueOf(t.substring(0, 2)) + Integer.valueOf((String) z.subSequence(3, 6))) % 24;
    int j = (60 + Integer.valueOf(t.substring(3, 5)) + Integer.valueOf(z.substring(7, 9))) % 60;
    return i + ":" + j;
}

Qualsiasi aiuto per ottenerlo sotto i 200 sarebbe apprezzato!


Questo è difettoso. Non soddisfa il 2 ° test (dove l'ora è incrementata). Inoltre, per ridurre, perché usi subSequence invece di sottostringa? Per giocare a golf di più, dichiara Integer i=1;e sostituisci tutti gli altri Integercon i, quindi hai i.valueOfinvece Integer.valueOf.
Olivier Grégoire,

@ OlivierGrégoire eh? Potresti approfondire il secondo test per favore!
Womba,

Per il caso di test di Kathmandu, si esegue l'output 14:27anziché 15:27.
Olivier Grégoire,

@OlivierGrégoire ah buon punto
Womba

O addirittura java.util.function.Function v=Integer::valueOf. Non sono sicuro se ciò risparmierebbe molto.
Robert Fraser,

1

Rubino, 95 byte

g=->s{"60*"+s.scan(/\d+/).map(&:to_i)*?+}
f=->t,z{r=eval(g[t]+z[3]+g[z]);print r/60%24,?:,r%60}

uso

f[gets,gets]

Ingressi (esempio)

08:50
UTC-06:00

1

Javascript (ES6), 93 92 byte

t=>((t=eval(t.replace(/.*?(.)?(..):(..)/g,'$1($2*60+$3)+720')))/60%24|0)+':'+(t/10%6|0)+t%10

Casi test

let f =
t=>((t=eval(t.replace(/.*?(.)?(..):(..)/g,'$1($2*60+$3)+720')))/60%24|0)+':'+(t/10%6|0)+t%10

console.log(f("08:50 UTC-06:00")); //  2:50
console.log(f("09:42 UTC+05:45")); // 15:27
console.log(f("06:42 UTC+13:00")); // 19:42
console.log(f("02:40 UTC-10:00")); // 16:40
console.log(f("17:25 UTC+09:00")); //  2:25


0

Giava 156 150 149 147 142 byte

t->z->{Integer H=100,T=H.valueOf(t.replace(":","")),Z=H.valueOf(z.replace(":","").substring(3)),c=(T/H+Z/H+24)*60+T%H+Z%H;return c/60%24+":"+c%60;}

Casi di prova e non golf

import java.util.function.BiFunction;

public class Main {
    public static void main(String[] args) {

        BiFunction<String,String,String> f = (t,z)->{
            Integer H = 100, // Hundred, used several times, shorter as variable
                    T = H.valueOf(t.replace(":","")), // as int (HHMM)
                    Z = H.valueOf(z.replaceAll("[UTC:]","")), // as int (-HHMM)
                    c = (T/H + Z/H + 24) * 60 + T%H + Z%H; // transform into minutes
            return c/60%24+":"+c%60;
        };

        test(f, "08:50", "UTC-06:00", "02:50");
        test(f, "09:42", "UTC+05:45", "15:27");
        test(f, "03:42", "UTC-05:45", "21:57");
        test(f, "06:42", "UTC+13:00", "19:42");
        test(f, "02:40", "UTC-10:00", "16:40");
        test(f, "17:25", "UTC+09:00", "02:25");
    }

    private static void test(BiFunction<String,String,String> f, String time, String zone, String expected) {
        // Padding is allowed. Make sure the padding is skipped for the test, then.
        String result = String.format("%2s:%2s", (Object[])f.apply(time, zone).split(":")).replace(" ","0");
        if (result.equals(expected)) {
            System.out.printf("%s + %s: OK%n", time, zone);
        } else {
            System.out.printf("%s + %s: Expected \"%s\", got \"%s\"%n", time, zone, expected, result);
        }

    }
}

Trucioli

  • 150 -> 149: a/H*60+b/H*60->(a/H+b/H)*60
  • 149 -> 147: (T/H+Z/H)*60+1440-> (T/H+Z/H+24)*60.
  • 147 -> 142: z.replace(":","").substring(3)->z.replaceAll("[UTC:]","")

0

C # 214 205 183 byte

string f(char[]t,char[]u){int s=~(u[3]-45),z=48,m=(t[3]-z)*10+t[4]-z+((u[7]-z)*10+u[8]-z)*s,h=(t[0]-z)*10+t[1]-z+((u[4]-z)*10+u[5]-z)*s+m/60+(m>>8)+24;return$"{h%24}:{(m+60)%60:D2}";}

Versione da 205 byte

string f(string t,string u){Func<string,int>P=int.Parse;var T=t.Split(':');int s=u[3]<45?1:-1,m=P(T[1])+P(u.Substring(7))*s,h=P(T[0])+P($"{u[4]}"+u[5])*s+m/60+(m<0?-1:0)+24;return$"{h%24}:{(m+60)%60:D2}";}

Ungolfed

string f(char[] t, char[] u)
{
    int s = ~(u[3]-45),
        z = 48,
        m = (t[3] - z) * 10 + t[4] - z + ((u[7] - z) * 10 + u[8] - z) * s,
        h = (t[0] - z) * 10 + t[1] - z + ((u[4] - z) * 10 + u[5] - z) * s + m / 60 + (m>>8) + 24;
    return $"{h % 24}:{(m + 60) % 60:D2}";
}

Originale 214:

string f(string t,string u){Func<string,int>P=int.Parse;var T=t.Split(':');int h=P(T[0]),m=P(T[1]),s=u[3]<45?1:-1;m+=P(u.Substring(7))*s;h+=P($"{u[4]}"+u[5])*s+m/60+(m<0?-1:0)+24;return$"{h%24:D2}:{(m+60)%60:D2}";}

0

CJam , 40 byte

r{':/60b}:F~r3>(\F\~1440,=60b{s2Te[}%':*

Provalo online! (Come una suite di test.)

Spiegazione

r           e# Read first input (time).
{':/60b}:F  e# Define a function F, which splits a string around ':' and
            e# treats the two elements as base-60 digits.
~           e# Run that function on the first input.
r3>         e# Read the second input and discard the 'UTC'.
(           e# Pull off the +-.
\F          e# Apply F to the timezone offset.
\~          e# Execute the + or - on the two amounts of minutes.
1440,=      e# Modulo 1440 to fit everything into the 24-hour format.
60b         e# Obtain base 60 digits again.
{s2Te[}%    e# Convert each digit to a string and pad it to 2 decimal digits.
':*         e# Join them with a ':'.

0

Retina , 100 byte

:
59$*:,
+`(\d+):
$1,$1
\d+
$*
T`1`0`-.+
^
1440$*
+`10|\D

1{1440}

^(1{60})*(.*)
$#1:$.2
\b\d\b
0$&

Provalo online!

Spiegazione

:
59$*:,

Sostituisce ciascuno :con 59 di essi e una virgola come separatore.

+`(\d+):
$1,$1

Duplica ripetutamente il numero davanti a a :. Quindi le prime due fasi moltiplicano il valore orario per 60.

\d+
$*

Converti ogni numero in unario.

T`1`0`-.+

Se c'è un segno meno nell'input, allora questa fase di traslitterazione trasforma tutte le 1s dopo di esso in 0s. Fondamentalmente stiamo usando 0come -1cifra unaria qui.

^
1440$*

Inserire 1440 1s (ovvero un giorno intero). Questo per garantire che il tempo non diventi negativo.

+`10|\D

Questo rimuove ripetutamente tutte le non-cifre (cioè lo spazio, il UTC, il +o -, così come tutto quello ,che abbiamo inserito) e la 10combinazione, cancellando così le cifre positive e negative. Questo sostanzialmente sottrae il secondo numero dal primo se è negativo o lo aggiunge in altro modo.

1{1440}

Rimuove 1440 1s se possibile (basicamente prendendo il risultato modulo 1440 per adattarlo in una singola 24 ore).

^(1{60})*(.*)
$#1:$.2

Decomporre il numero in ore e minuti abbinando il maggior numero possibile di blocchi di 60 cifre (contando i blocchi con $#1) seguito dalle cifre rimanenti (la cui lunghezza viene contata con $.2).

\b\d\b
0$&

Se ci sono cifre singole nel risultato, anteporre uno zero.

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.