Зміна часового поясу


20

Виклик

Враховуючи час і часовий пояс як вхід, виведіть час у цьому часовому поясі.

Час

Час буде вказано у 24-годинному форматі так:

hh:mm

Де hh - двозначна година, а mm - двоцифрова хвилина. Зауважте, що година і хвилина завжди будуть забитими нулями так:

06:09

Усі наведені часи - у UTC + 00: 00.

Години у вашому виході не повинні бути забитими нулями, але ваш час повинен бути у форматі 24 години

Часовий пояс

Часовий пояс буде надано у такому форматі:

UTC±hh:mm

Там, де ± буде або +, або -, і 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 / Тривалість? Я припускаю, що вони також виключені
pinkfloydx33

Також вхідні значення завжди будуть дійсними часом? Тобто 26:02і 08:74не з’явився б? Те саме для компенсацій за UTC?
pinkfloydx33

@ pinkfloydx33 1) Так, всі ці виключені. 2) Припустимо, що всі дані є дійсними
Beta Decay

Чи повинні ми прокладати висновки нулями? (напр., може 2:25
вийти

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 викреслюється і F ixed I nput

¯5∘↑ останні п'ять символів ("hh: mm")

Крок за кроком на "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")


1
Відсутні провідні нулі у форматованому виході. Слід сказати Python 2 у заголовку. Не вдалося перевести до функції однієї лінії з ;.
Джонатан Аллан


Ах, круто, пропустив це трохи! Спасибі
Джонатан Аллан

2

Пітон 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

Усі тестові справи знаходяться на ideone

Формат виводу розділений пробілом, без провідних нулів.


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, буде вдячна!


Це хибно. Не виконує 2-й тест (де година збільшується). Крім того, для скорочення, чому ви використовуєте subSequence замість підрядкових? Щоб більше грати в гольф, заявляйте Integer i=1;і замінюйте всі інші Integerна i, так що вам доведеться i.valueOfзамість цього Integer.valueOf.
Олів'є Грегоар

@ OlivierGrégoire так? Не могли б ви детальніше зупинитися на другому тесті!
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

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


0

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

Тестові кейси & unolfolf

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

Безумовно

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

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$&

Якщо в результаті є одні цифри, додайте нуль.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.