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:56
e 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:00
de UTC+24:00
inclusã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.
26:02
e08:74
não apareceria? O mesmo para as compensações UTC?2:25
)1:5
seria válida em vez de1:05
? Eu acho que apenas as horas não devem ser preenchidas. Além disso, seu exemplo24:56
não deve ser esse,00:56
já que você declarou um intervalo até24:00
e expressa similar no cenário da meia-noite e meia?Respostas:
APL (Dyalog APL) , 45 bytes
Expressão
Toma duas strings como argumento correto.
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 de2⊃
o segundo elemento de':'⎕VFI
o, 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.
fonte
C, 109 bytes
Invoque da seguinte maneira:
fonte
UTC-03:30
?JavaScript (ES6), 101 bytes
Seria 121 bytes se eu preenchesse as horas.
fonte
Python 2, 129 bytes
Ligar como
T("02:45", "UTC-05:33")
fonte
;
.Python 2, 84 bytes
Todos os casos de teste estão em ideone
O formato de saída é separado por espaço, sem zeros à esquerda.
fonte
Java 201 bytes
Chamado como T ("12:00", "UTC + 02: 40")
Sem o domínio da lógica,
Qualquer ajuda para obtê-lo abaixo de 200 seria apreciada!
fonte
Integer i=1;
e substituir todos os outrosInteger
pori
, assim que você temi.valueOf
em vez deInteger.valueOf
.14:27
vez de15:27
.java.util.function.Function v=Integer::valueOf
. Não tenho certeza se isso realmente economizaria muito.Ruby, 95 bytes
Uso
Entradas (exemplo)
fonte
Javascript (ES6),
9392 bytesCasos de teste
fonte
Java
156150149147142 bytesCasos de teste e não destruídos
Aparas de madeira
a/H*60+b/H*60
->(a/H+b/H)*60
(T/H+Z/H)*60+1440
->(T/H+Z/H+24)*60
.z.replace(":","").substring(3)
->z.replaceAll("[UTC:]","")
fonte
C #
214205183 BytesVersão de 205 bytes
Ungolfed
Original 214:
fonte
CJam , 40 bytes
Experimente online! (Como uma suíte de teste.)
Explicação
fonte
Retina , 100 bytes
Experimente online!
Explicação
Substitui cada um
:
por 59 e uma vírgula como separador.Duplica repetidamente o número na frente de a
:
. Portanto, os dois primeiros estágios multiplicam o valor da hora por 60.Converta cada número em unário.
Se houver um sinal de menos na entrada, esse estágio de transliteração transforma todos os
1
s depois dele em0
s. Estamos basicamente usando0
como um-1
dígito unário aqui.Insira 1440
1
s (ou seja, um dia inteiro). Isso é para garantir que o tempo não fique negativo.Isso remove repetidamente todos os não dígitos (ou seja, o espaço, o
UTC
, o+
ou-
, assim como todos os,
inseridos) e a10
combinaçã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.Remove 1440
1
s, se possível (basicamente usando o módulo de resultado 1440 para ajustá-lo em uma única 24 horas).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
).Se houver algum dígito no resultado, adicione um zero.
fonte