Meu despertador
Sou americano e meu despertador (digital) também. Para definir o alarme, ele inicia no momento em que estava anteriormente. Pressionar o botão da hora aumenta uma hora e pressionar o botão dos minutos aumenta um minuto. Pressionar os dois botões ao mesmo tempo o redefine para meia-noite (12:00) e conta como dois botões pressionados.
Quando as horas excedem o limite (12), ele é redefinido para 1 e alterna a luz AM / PM. Quando os minutos excedem o limite (59), eles são redefinidos para 0, sem afetar as horas.
A tarefa
Sua tarefa é, dada a hora de início e a hora prevista, produzir o número ideal de pressionamentos de botões necessários para definir meu alarme para a hora prevista.
Você pode receber informações no formato que melhor lhe convier. Os únicos dados que seu programa precisa são horas e minutos, para ambas as entradas. Isso significa que você, por exemplo, pode levar dados em milissegundos desde a época e extrair as horas e os minutos, mas você não pode codificar nada para o ano, mês, segundo, etc. Observe que enquanto você pode, por exemplo, inserir usando "horário militar" (ou horário regular para a maior parte do mundo), mas isso não muda o funcionamento do meu relógio.
Exemplos
1:15 pm -> 2:30 am
Você pode pressionar os dois botões para redefinir para 12:00 e depois aumentar para 2:30, o que seria 2+2+30 = 34
pressionamento de botão. Você também pode aumentar para 2h30, o que seria 13+15 = 28
pressionar o botão. Portanto, sua saída é 28
.
3:58 am -> 4:02 am
Você pode redefinir e incrementar, o que seria 2+4+2 = 8
pressionar o botão. Você também pode incrementar, o que seria 1+4 = 5
pressionar o botão. Portanto, sua saída é 5
.
10:55 pm -> 1:00 am
Você pode redefinir e incrementar, o que seria 2+1 = 3
pressionar o botão. Você também pode incrementar, o que seria 3+5=8
pressionar o botão. Portanto, sua saída é 3
.
1:00 am -> 1:59 pm
Você poderia redefinir e incrementar, mas seriam mais três impressoras do que apenas incrementar. Portanto, sua saída é 12+59 =
71
.
Casos de teste
Current Target = Output
1:15pm 2:30am = 28
3:58am 4:02am = 5
10:55pm 1:00am = 3
1:00am 1:59pm = 71
12:00am 12:00am = 0
6:51pm 12:00am = 2
2:01pm 11:00pm = 25
2:01pm 11:01pm = 9
12:59am 12:01am = 2
11:50am 12:00pm = 11
fonte
Respostas:
Casca , 16 bytes
Experimente online!
Recebe argumentos como duas listas [horas, minutos], para as horas de início e término, no formato 24h.
Estou muito feliz com o quanto consegui jogar golfe, acho interessante como os argumentos são gerenciados nessa composição de funções.
A função que calcula quantas teclas são necessárias se a redefinição não for permitida é a seguinte:
A parte interessante é que, como o restante dessa solução pode funcionar apenas com uma única lista como argumento, essa é aplicada parcialmente ao primeiro argumento de todo o programa, "comendo" e deixando apenas o segundo argumento visível para si e para o o resto do programa.
Em seguida, calculamos quantas teclas são necessárias se redefinirmos o horário para 0:00
Como dito anteriormente, isso opera apenas no segundo argumento (o tempo final) e calcula
hours+minutes+2
, apenas de uma maneira mais eficiente.Finalmente,
§▼
é a parte que passa o segundo argumento para ambas as funções e retorna o menor dos dois resultados.fonte
JavaScript (ES6),
7356545250 bytesUsa o formato de 24 horas. Recebe a entrada como 4 números inteiros, representando as horas e minutos de cada vez.
Tente
Digite os horários no formato de 24 horas, com o
:
separador.Explicação
(A ser atualizado em breve.)
Anonymous função tendo os números inteiros como argumentos através de parâmetros
g
,l
,h
&m
, ondeg
&l
são, respectivamente, as horas e minutos do tempo corrente eh
&m
são as horas e minutos do tempo de destino.Primeiro, calculamos quantos pressionamentos de botão são necessários se apenas redefinirmos o relógio, que é simplesmente 2 (para redefinir) mais a hora e o minuto alvo.
Em seguida, calculamos quantos pressionamentos de botão são necessários para atingir a hora desejada. Fazemos isso subtraindo a hora atual da hora prevista. No entanto, se a hora atual for menor que a meta, isso nos dará um número negativo, portanto, retificaremos isso adicionando 24 multiplicado verificando se
h<g
(que retorna um booleano, mas é implicitamente convertido em número inteiro1
, se verdadeiro ou0
falso pelo operações matemáticas.Usamos uma fórmula semelhante para calcular o número de prensas para ir do minuto atual ao minuto alvo e adicionamos isso às prensas da hora.
Finalmente, obtemos o mínimo dos 2 números para nos dar o resultado.
fonte
(h-g+24)%24+(m-l+60)%60
?Pitão , 29 bytes
Obviamente, esse desafio não beneficia os idiomas do golfe, por isso é tão longo. Por outro lado, isso é aprimorado pelo fato de Pyth ser baseado em Python, para que possamos abusar de seu módulo negativo.
Suíte de teste. Os números em Pyth não suportam zeros à esquerda.
fonte
Geléia , 19 bytes
Experimente online!
Entrada como 4 números inteiros (hora final, minuto final, hora inicial, minuto inicial)
fonte
C # (.NET Core) , 56 bytes
Experimente online!
Muito parecido com a resposta Javascript. Bools em C # não se convertem facilmente em números, então, ao invés de
[diff]+24*(H<h)
eu, o([diff]+24)%24
que efetivamente faz a mesma coisa.fonte
2+h+m
de -2 bytes.(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
System.Math.Min
?Haskell, 41 bytes
Bem direto. Recebe entrada como quatro argumentos usando o tempo de 24 horas: hora final, minuto final, hora inicial, minuto inicial.
fonte
Python 3 , 43 bytes
Experimente online!
Entrada como 4 números inteiros (hora de início, minuto de início, hora final, minuto final)
fonte
2 01 11 00
? Na sua resposta, como você determina se é a horaAM
ouPM
se não considera isso como entrada?13
essa entrada usando o TIO, que está correto (redefinir + 11 <9 + 59).%
sempre retornar um número positivo em Python?%
.1%24
=1
,1%-24
=-23
. É muito útil para esta pergunta.Java 8,
5450 bytesPorto da resposta C # de @KamilDrakari (depois de jogar
26 bytes).Explicação:
Experimente aqui.
fonte
Perl 5 , 71 +2 (-ap) = 73 bytes
Experimente online!
Recebe entrada no formato de 24 horas (hora militar), separado por espaços, primeira hora de início e segunda hora de término: HH MM hh mm
fonte
Retina , 106 bytes
Experimente online! O link inclui casos de teste. Recebe a entrada como o tempo atual e o desejado em 24 horas, com um espaço separando os dois tempos. Explicação:
Converta para unário.
Isso faz duas coisas; adiciona 24 horas e 60 minutos às horas e minutos desejados e também adiciona 2 à soma das horas e minutos originais desejados, ou seja, o número de botões pressionados para definir usando uma redefinição.
Subtraia as horas atuais das horas desejadas e subtraia as 24 que adicionamos, se pudermos.
Da mesma forma para os minutos. Isso também adiciona os dois resultados.
Se o número de prensas a serem definidas usando o horário atual for maior que o número de prensas a serem definidas usando uma redefinição, exclua-o.
Converta o primeiro número restante de volta em decimal.
fonte