Изменить часовой пояс

20

Вызов

Учитывая время и часовой пояс в качестве входных данных, выведите время в этом часовом поясе.

Время

Время будет указано в 24-часовом формате, например:

hh:mm

Где hh - двузначный час, а mm - двузначная минута. Обратите внимание, что час и минута всегда будут дополнены нулями, например:

06:09

Время указано в UTC + 00: 00.

Часы в вашем выводе не должны быть дополнены нулями, но ваше время должно быть в 24-часовом формате

Часовой пояс

Часовой пояс будет указан в следующем формате:

UTC±hh:mm

Где ± будет + или a - и hh, это двухзначный час, а mm это двухзначная минута (опять же, они будут дополнены нулями).

Чтобы найти время в этом часовом поясе, вы либо добавляете (если символ - +), либо вычитаете (если символ - -) время после UTC ± из введенного времени.

Например, если ввод был 24:56и UTC-02:50, вы вычли бы 2 часа и 50 минут из 24:56:

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

Выход будет 22:06.

Примеры

Чикаго

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

Катманду

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

Самоа

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

Гавайи

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

Обратите внимание, что это было в предыдущий день.

Токио

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

Обратите внимание, что это пошло на следующий день.

правила

Вы не должны использовать какие-либо встроенные функции даты или библиотеки.

Предположим, что все входные данные будут действительными временами и смещениями времени.

Часовой пояс будет в диапазоне UTC-24:00от UTC+24:00включительно.

В случае половины третьего ночи правильное представление должно быть 00:30, а не 24:30 .

выигрыш

Самый короткий код в байтах побеждает.

Бета распад
источник
А как насчет TimeSpan / Duration методов / классов? Я предполагаю, что они также исключены
pinkfloydx33
Также всегда будут введенные значения? Т.е. 26:02и 08:74не появится? То же самое для смещений UTC?
pinkfloydx33
@ pinkfloydx33 1) Да, все это исключено. 2) Предположим, что все входные данные действительны
бета-распад
Нужно ли дополнять вывод нулями? (например. Может ли последний тестовый пример вывести 2:25)
Loovjo
1
Если выходные данные не нужно дополнять, будет 1:5ли допустимым время вместо 1:05? Я думаю, что только часы не должны быть дополнены. Также ваш пример с 24:56этим не должен быть, 00:56так как вы указали диапазон до 24:00и выразили подобное в своем сценарии полуночи?
pinkfloydx33

Ответы:

2

APL (Dyalog APL) , 45 байтов

выражение

Принимает две строки в качестве правильного аргумента.

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

Попробуйте онлайн!

объяснение

24 60⊤преобразование числа в основание - 24 b 60

из

оценка

из

отформатированный (т.е. сплющенный с разделительными пробелами)

('+-'∩⍕) пересечение «+ -» и отформатированного ввода (это извлекает плюс или минус)

, с последующим

(... следующее для каждого из входов (время и смещение)

0 60⊥б 60 -в-номер преобразования

2⊃ второй элемент

':'⎕VFI, используя двоеточие в качестве разделителя полей, V erified и Р ixed Я Nput из

¯5∘↑ последние пять символов ("чч: мм")

Пошаговые инструкции «17:25» и «UTC + 09: 00»

Выражение в левой части данных справа, дает данные следующей строки.

                       '17: 25 '' UTC + 09: 00 '
                      / / \ \
(...) ¨ применяет последовательность функций к обоим входам
                    / / \ \
¯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
                       \ \ / /
Это где ¨ останавливается, и выполнение продолжается в результирующем списке
                         \ \ / /
'/', 1045 540
('+ -' ∩⍕), '/' 1045 540
+ '+' '/' 1045 540
+ '+ / 1045 540'
24 60⊤ 1585
                              2 25
Адам
источник
3

C 109 байтов

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

Вызовите следующим образом:

int main() { f("17:25", "UTC+09:00"); }
Линн
источник
1
Как это работает для отрицательных временных смещений, например UTC-03:30?
Нил
Ой, я забыл об этом, но, к счастью, это легко исправить.
Линн
3

JavaScript (ES6), 101 байт

(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

Было бы 121 байт, если бы я добавил часы.

Нил
источник
3

Python 2, 129 байт

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`

Позвонить как T("02:45", "UTC-05:33")

Loovjo
источник
1
Отсутствуют лидирующие нули в форматированном выводе. Должен сказать Python 2 в заголовке. Может сократить до одной функции строки с ;.
Джонатан Аллан
@JonathanAllan Вам не нужно
заполнять
Ах, круто, пропустил это немного! Спасибо
Джонатан Аллан
2

Python 2, 84 байта

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

Все тесты в идеале

Выходной формат разделен пробелом, без начальных нулей.

Джонатан Аллан
источник
2

Java 201 байт

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

Вызывается как T («12:00», «UTC + 02: 40»)

Беззаботный по логике,

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

Любая помощь, чтобы получить его ниже 200 будет принята с благодарностью!

Womba
источник
Это ошибочно. Не выполняет 2-й тест (где час увеличивается). Кроме того, чтобы уменьшить, почему вы используете подпоследовательность вместо подстроки? Чтобы больше играть в гольф, объявите Integer i=1;и замените все остальные Integerна i, так что вы i.valueOfвместо Integer.valueOf.
Оливье Грегуар,
@ Оливье Грегуар, а? Не могли бы вы рассказать о втором тесте, пожалуйста!
Womba
Для теста в Катманду вы выводите 14:27вместо 15:27.
Оливье Грегуар
@ OlivierGrégoire ах хороший момент
Womba
Или даже java.util.function.Function v=Integer::valueOf. Не уверен, что это действительно сэкономит.
Роберт Фрейзер
1

Рубин, 95 байт

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}

использование

f[gets,gets]

Входы (пример)

08:50
UTC-06:00
cia_rana
источник
1

Javascript (ES6), 93 92 байта

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

Контрольные примеры

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
источник
0

Джава 156 150 149 147 142 байта

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

Тестовые случаи и безгольф

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

    }
}

стружка

  • 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 байта

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

205-байтовая версия

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

Оригинал 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
источник
0

CJam , 40 байт

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

Попробуйте онлайн! (Как набор тестов.)

объяснение

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

Сетчатка , 100 байт

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

1{1440}

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

Попробуйте онлайн!

объяснение

:
59$*:,

Заменяет каждый :с 59 из них и запятой в качестве разделителя.

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

Неоднократно дублирует число перед a :. Таким образом, первые два этапа умножают значение часа на 60.

\d+
$*

Перевести все числа в одинарные.

T`1`0`-.+

Если на входе есть знак минус, то этот этап транслитерации превращает все 1s после него в 0s. Мы в основном используем здесь 0как унарную -1цифру.

^
1440$*

Вставьте 1440 1с (т. Е. Полный день). Это должно гарантировать, что время не становится отрицательным.

+`10|\D

Это многократно удаляет все не цифры (то есть пробел UTC, +или- , как и все ,мы вставили) и 10комбинацию, компенсируя тем самым положительные и отрицательные числа. Это в основном вычитает второе число из первого, если оно отрицательное, или добавляет его в противном случае.

1{1440}

Удаляет 1440 1 с, если это возможно (в основном результат по модулю 1440, чтобы уместить его в течение 24 часов).

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

Разложите число на часы и минуты, сопоставив как можно больше фрагментов из 60 цифр (считая фрагменты с $#1 ), а затем оставшиеся цифры (длина которых считается с $.2).

\b\d\b
0$&

Если в результате есть какие-либо цифры, добавьте ноль.

Мартин Эндер
источник