Alterar o fuso horário


20

Desafio

Dado um horário e um fuso horário como entrada, produza a hora nesse fuso horário.

Tempo

A hora será fornecida no formato de 24 horas, da seguinte forma:

hh:mm

Onde hh é a hora de dois dígitos e mm é o minuto de dois dígitos. Observe que a hora e o minuto sempre serão preenchidos com zeros da seguinte maneira:

06:09

Todos os horários indicados são às UTC + 00: 00.

As horas na sua saída não precisam ser preenchidas com zeros, mas seu horário deve estar no formato de 24 horas

Fuso horário

O fuso horário será fornecido no seguinte formato:

UTC±hh:mm

Onde ± será um + ou a - e hh, é a hora de dois dígitos e mm é o minuto de dois dígitos (novamente, estes serão preenchidos com zeros).

Para encontrar a hora nesse fuso horário, você adiciona (se o símbolo for +) ou subtrai (se o símbolo for -) a hora após o UTC ± a partir da hora inserida.

Por exemplo, se a entrada fosse 24:56e UTC-02:50, você subtrairia 2 horas e 50 minutos de 24:56:

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

A saída seria 22:06.

Exemplos

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

Havaí

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

Observe que isso foi para o dia anterior.

Tóquio

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

Observe que isso ocorreu no dia seguinte.

Regras

Você não deve usar nenhuma função ou biblioteca de data incorporada.

Suponha que todas as entradas tenham horários e compensações válidos.

O fuso horário estará no intervalo UTC-24:00de UTC+24:00inclusão.

No caso da meia-noite e meia , a representação correta deve ser 00:30, não 24:30 .

Ganhando

O código mais curto em bytes vence.


E quanto aos métodos / classes TimeSpan / Duration? Presumo aqueles também são excluídos
pinkfloydx33

Os valores de entrada também serão sempre tempos válidos? Ou seja, 26:02e 08:74não apareceria? O mesmo para as compensações UTC?
pinkfloydx33

@ pinkfloydx33 1) Sim, todos os excluídos. 2) Suponha que toda a entrada seja válida
Beta Decay

Temos que preencher a saída com zeros? (por exemplo, pode a última saída do caso de teste 2:25)
Loovjo 11/09

1
Se a saída não precisar ser preenchida, uma hora 1:5seria válida em vez de 1:05? Eu acho que apenas as horas não devem ser preenchidas. Além disso, seu exemplo 24:56não deve ser esse, 00:56já que você declarou um intervalo até 24:00e expressa similar no cenário da meia-noite e meia?
pinkfloydx33

Respostas:


2

APL (Dyalog APL) , 45 bytes

Expressão

Toma duas strings como argumento correto.

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

Experimente online!

Explicação

24 60⊤a conversão de número em base a 24 b 60

do

a avaliação

do

o formatado (ou seja, achatado com espaços separados)

('+-'∩⍕) interseção de "+ -" e a entrada formatada (extrai o sinal de mais ou menos)

, Seguido por

(... o seguinte para cada uma das entradas (a hora e o deslocamento)

0 60⊥a uma b 60 -para-número conversão de

2⊃ o segundo elemento de

':'⎕VFIo, utilizando cólon como separador de campo, V erified e F ixed eu Nput de

¯5∘↑ os últimos cinco caracteres ("hh: mm")

Passo a passo em "17:25" e "UTC + 09: 00"

A expressão do lado esquerdo nos dados do lado direito fornece os dados da próxima linha.

                       '17: 25 '' UTC + 09: 00 '
                      / / \ \
(...) ¨ aplica o trem de função às duas entradas
                    / / \ \
¯5∘ ↑ '17: 25 '' UTC + 09: 00 '
':' FIVFI '17: 25 ''09: 00' ' 
2⊃ (1 1) (17 25) (1 1) (9 0)
0 60⊥ ​​17 25 9 0
                      1045 540
                       \ \ / /
É aqui que ¨ para e a execução continua na lista resultante
                         \ \ / /
'/', 1045 540
('+ -' ∩⍕), '/' 1045540
⍕ '+' '/' 1045540
⍎ '+ / 1045540'
24 60⊤ 1585
                              2 25

3

C, 109 bytes

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

Invoque da seguinte maneira:

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

1
Como isso funciona para compensações de tempo negativo, por exemplo UTC-03:30?
Neil

Opa, eu esqueci disso, mas felizmente, é uma solução fácil.
Lynn

3

JavaScript (ES6), 101 bytes

(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

Seria 121 bytes se eu preenchesse as horas.


3

Python 2, 129 bytes

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`

Ligar como T("02:45", "UTC-05:33")


1
Zeros à esquerda ausentes na saída formatada. Deve dizer Python 2 no cabeçalho. Pode reduzir a uma função de uma linha com ;.
Jonathan Allan


Ah, legal, perdi esse pedaço! Obrigado
Jonathan Allan

2

Python 2, 84 bytes

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

Todos os casos de teste estão em ideone

O formato de saída é separado por espaço, sem zeros à esquerda.


2

Java 201 bytes

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

Chamado como T ("12:00", "UTC + 02: 40")

Sem o domínio da lógica,

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

Qualquer ajuda para obtê-lo abaixo de 200 seria apreciada!


Isso é falho. Não realiza o segundo teste (onde a hora é incrementada). Além disso, para reduzir, por que você usa subSequence em vez de substring? Para golfe mais, declarar Integer i=1;e substituir todos os outros Integerpor i, assim que você tem i.valueOfem vez de Integer.valueOf.
Olivier Grégoire

@ OlivierGrégoire hein? Você poderia elaborar o segundo teste, por favor!
Womba 11/09/16

Para o caso de teste de Kathmandu, você produz em 14:27vez de 15:27.
Olivier Grégoire

@ OlivierGrégoire ah good point
Womba 11/09/16

Ou até java.util.function.Function v=Integer::valueOf. Não tenho certeza se isso realmente economizaria muito.
Robert Fraser

1

Ruby, 95 bytes

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]

Entradas (exemplo)

08:50
UTC-06:00

1

Javascript (ES6), 93 92 bytes

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

Casos de teste

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 bytes

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

Casos de teste e não destruídos

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

    }
}

Aparas de madeira

  • 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 Bytes

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

Versão de 205 bytes

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

Original 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 bytes

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

Experimente online! (Como uma suíte de teste.)

Explicação

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 bytes

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

1{1440}

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

Experimente online!

Explicação

:
59$*:,

Substitui cada um :por 59 e uma vírgula como separador.

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

Duplica repetidamente o número na frente de a :. Portanto, os dois primeiros estágios multiplicam o valor da hora por 60.

\d+
$*

Converta cada número em unário.

T`1`0`-.+

Se houver um sinal de menos na entrada, esse estágio de transliteração transforma todos os 1s depois dele em 0s. Estamos basicamente usando 0como um -1dígito unário aqui.

^
1440$*

Insira 1440 1s (ou seja, um dia inteiro). Isso é para garantir que o tempo não fique negativo.

+`10|\D

Isso remove repetidamente todos os não dígitos (ou seja, o espaço, o UTC, o +ou -, assim como todos os ,inseridos) e a 10combinação, cancelando, assim, os dígitos positivos e negativos. Basicamente, subtrai o segundo número do primeiro se for negativo ou o adiciona de outra forma.

1{1440}

Remove 1440 1s, se possível (basicamente usando o módulo de resultado 1440 para ajustá-lo em uma única 24 horas).

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

Decomponha o número em horas e minutos, correspondendo o maior número possível de blocos de 60 dígitos (contando os blocos $#1) seguido pelos dígitos restantes (cujo comprimento é contado $.2).

\b\d\b
0$&

Se houver algum dígito no resultado, adicione um zero.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.