Zmień strefę czasową

20

Wyzwanie

Biorąc pod uwagę czas i strefę czasową jako dane wejściowe, wyświetlaj czas w tej strefie czasowej.

Czas

Czas zostanie podany w formacie 24-godzinnym tak:

hh:mm

Gdzie hh to dwucyfrowa godzina, a mm to dwucyfrowa minuta. Zauważ, że godzina i minuta zawsze będą wypełnione zerami w następujący sposób:

06:09

Wszystkie podane godziny są w UTC + 00: 00.

Godziny na wyjściu nie muszą być uzupełnione zerami, ale twój czas musi być w formacie 24-godzinnym

Strefa czasowa

Strefa czasowa zostanie podana w następującym formacie:

UTC±hh:mm

Gdzie ± będzie albo +, albo - i hh, jest dwucyfrową godziną, a mm jest dwucyfrową minutą (ponownie, będą one uzupełnione zerami).

Aby znaleźć czas w tej strefie czasowej, możesz dodać (jeśli symbolem jest +) lub odjąć (jeśli symbolem jest -) czas po UTC ± od wprowadzonego czasu.

Na przykład, jeśli dane wejściowe były 24:56i UTC-02:50, odejmowałbyś 2 godziny i 50 minut od 24:56:

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

Wynik byłby 22:06.

Przykłady

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

Hawaje

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

Pamiętaj, że poszło to do poprzedniego dnia.

Tokio

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

Pamiętaj, że poszło to następnego dnia.

Zasady

Nie wolno używać żadnych wbudowanych funkcji daty ani bibliotek.

Załóż, że wszystkie dane wejściowe będą prawidłowe i przesunięcia czasowe.

Strefa czasowa będzie w zakresie UTC-24:00od UTC+24:00włącznie.

W przypadku wpół do północy , prawidłowa reprezentacja powinna być 00:30, nie 24:30 .

Zwycięski

Najkrótszy kod w bajtach wygrywa.

Rozpad beta
źródło
Co z metodami / klasami TimeSpan / Duration? Zakładam, że są one również wyłączone
pinkfloydx33
Czy wartości wejściowe zawsze będą prawidłowe? Tj. 26:02I 08:74nie pojawiłby się? To samo dotyczy przesunięć UTC?
pinkfloydx33
@ pinkfloydx33 1) Tak, wszystkie wykluczone. 2) Załóżmy, że wszystkie dane wejściowe są prawidłowe
Beta
Czy musimy uzupełnić dane wyjściowe zerami? (np. Czy można 2:25
wypisać
1
Jeśli wynik nie musi być wypełniany, czy czas 1:5byłby prawidłowy zamiast 1:05? Sądzę, że nie należy podchodzić tylko godzin. Twój przykład 24:56nie powinien tak być, 00:56ponieważ określiłeś zakres do 24:00i wyrażasz podobny w swoim scenariuszu o północy po północy?
pinkfloydx33

Odpowiedzi:

2

APL (Dyalog APL) , 45 bajtów

Wyrażenie

Bierze dwa ciągi jako właściwy argument.

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

Wypróbuj online!

Wyjaśnienie

24 60⊤konwersja liczby na bazę a 24 b 60

z

ewaluacja

z

sformatowany (tzn. spłaszczony spacjami)

('+-'∩⍕) przecięcie „+ -” i sformatowanego wejścia (wyodrębnia plus lub minus)

, śledzony przez

(... następujące dla każdego wejścia (czas i przesunięcie)

0 60⊥b 60 -to-liczby konwersji

2⊃ drugi element

':'⎕VFIThe, stosując okrężnicy jako separator pola, V erified i F ixed że informacje wejściowe z

¯5∘↑ pięć ostatnich znaków („gg: mm”)

Krok po kroku w „17:25” i „UTC + 09: 00”

Wyrażenie po lewej stronie danych po prawej stronie podaje dane następnego wiersza.

                       „17: 25” „UTC + 09: 00”
                      / / \ \
(...) ¨ stosuje ciąg funkcji do obu wejść
                    / / \ \
¯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
                       \ \ / /
W tym miejscu ¨ zatrzymuje się, a wykonywanie jest kontynuowane na wynikowej liście
                         \ \ / /
„/”, 1045 540
(„+ -” ∩⍕), ”/„ 1045 540
+ „+” ”/„ 1045 540
⍎ „+ / 1045 540”
24 60⊤ 1585
                              2 25
Adám
źródło
3

C, 109 bajtów

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

Wywołaj w następujący sposób:

int main() { f("17:25", "UTC+09:00"); }
Lynn
źródło
1
Jak to działa np. W przypadku ujemnych przesunięć czasowych UTC-03:30?
Neil
Ups, zapomniałem o nich, ale na szczęście jest to łatwa naprawa.
Lynn,
3

JavaScript (ES6), 101 bajtów

(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

Byłbym 121 bajtów, gdybym uzupełniał godziny.

Neil
źródło
3

Python 2, 129 bajtów

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`

Zadzwoń jako T("02:45", "UTC-05:33")

Loovjo
źródło
1
Brakuje zer wiodących w sformatowanym wyjściu. W nagłówku powinien znajdować się napis Python 2. Można zmniejszyć do funkcji jednej linii za pomocą ;.
Jonathan Allan,
@JonathanAllan Nie potrzebujesz
zerowania
Ach, spoko, trochę tego przegapiłem! Dzięki
Jonathan Allan,
2

Python 2, 84 bajtów

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

Wszystkie przypadki testowe są w ideone

Format wyjściowy jest oddzielony spacją, bez zer wiodących.

Jonathan Allan
źródło
2

Java 201 bajtów

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

Nazywany jako T („12:00”, „UTC + 02: 40”)

Nieprzyzwyczajony do logiki,

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

Będziemy wdzięczni za każdą pomoc, aby uzyskać mniej niż 200!

Womba
źródło
To jest wadliwe. Nie spełnia drugiego testu (w którym godzina jest zwiększana). Ponadto, aby zmniejszyć, dlaczego używasz subSequence zamiast podciągów? Aby zagrać w golfa więcej, zadeklaruj Integer i=1;i zamień wszystkie pozostałe Integerna i, więc masz i.valueOfzamiast Integer.valueOf.
Olivier Grégoire,
@ OlivierGrégoire huh? Czy mógłbyś rozwinąć drugi test?
Womba,
W przypadku testowym Kathmandu wyprowadzasz dane 14:27zamiast 15:27.
Olivier Grégoire,
@ OlivierGrégoire ah good point
Womba
Lub nawet java.util.function.Function v=Integer::valueOf. Nie jestem pewien, czy to naprawdę dużo zaoszczędziłoby.
Robert Fraser,
1

Rubinowy, 95 bajtów

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}

Stosowanie

f[gets,gets]

Wejścia (przykład)

08:50
UTC-06:00
cia_rana
źródło
1

JavaScript (ES6), 93 92 bajty

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

Przypadki testowe

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

Arnauld
źródło
0

Jawa 156 150 149 147 142 bajty

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

Walizki testowe i bez golfa

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

    }
}

Wióry

  • 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:]","")
Olivier Grégoire
źródło
0

C # 214 205 183 bajtów

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

Wersja 205 bajtów

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

Nie golfił

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

Oryginał 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}";}
pinkfloydx33
źródło
0

CJam , 40 bajtów

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

Wypróbuj online! (Jako zestaw testowy.)

Wyjaśnienie

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 ':'.
Martin Ender
źródło
0

Siatkówka , 100 bajtów

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

1{1440}

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

Wypróbuj online!

Wyjaśnienie

:
59$*:,

Zastępuje każdy :z 59 z nich i przecinek jako separator.

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

Wielokrotnie duplikuje liczbę przed znakiem :. Pierwsze dwa etapy mnożą wartość godzinną przez 60.

\d+
$*

Konwertuj każdą liczbę na jednoargumentową.

T`1`0`-.+

Jeśli na wejściu znajduje się znak minus, to ten etap transliteracji zamienia wszystkie 1s po nim na 0s. Zasadniczo używamy tutaj 0jako jednoznacznej -1cyfry.

^
1440$*

Wstaw 1440 1s (tzn. Cały dzień). Ma to na celu zapewnienie, że czas nie będzie ujemny.

+`10|\D

Powoduje to wielokrotne usuwanie wszystkich cyfr (tj. Spacji, the UTC, +lub -, a także wszystkich ,wstawionych przez nas 10znaków ) i kombinacji, tym samym anulując cyfry dodatnie i ujemne. To zasadniczo odejmuje drugą liczbę od pierwszej, jeśli jest ujemna, lub dodaje ją w inny sposób.

1{1440}

Usuwa 1440 1s, jeśli to możliwe (w zasadzie biorąc wynik modulo 1440, aby dopasować go do jednego 24 godzin).

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

Rozłóż liczbę na godziny i minuty, dopasowując jak najwięcej fragmentów 60 cyfr (licząc fragmenty $#1), a następnie pozostałe cyfry (których długość jest liczona $.2).

\b\d\b
0$&

Jeśli w wyniku są jakieś pojedyncze cyfry, wstaw zero.

Martin Ender
źródło