Folhas de ponto
Em um local de trabalho, você geralmente precisa preencher folhas de ponto. Esta tarefa é escrever código para ajudar nisso.
Entrada
Duas vezes em um relógio de 12 horas ligeiramente fora do padrão, significando o início e o fim do dia separados por um espaço. Um terceiro número representa o número de minutos necessários para o almoço. Por exemplo
9:14 5:12 30
Isso significa que você começou a trabalhar às 9h14, terminou o trabalho às 17h12 e levou 30 minutos para o almoço.
Você pode assumir que
- Qualquer horário na primeira coluna é das 00:00 (meia-noite) até às 13:00, mas não inclui, e qualquer horário na segunda coluna é 13:00 no mínimo, até 23:59.
- O intervalo para o almoço não é mais do que o dia útil!
O formato de entrada deve ser como nos exemplos fornecidos.
Tarefa
Seu código deve ler um arquivo (ou entrada padrão) desses triplos e, para cada um, gerar quanto tempo você trabalhou. Esta saída deve indicar o número de horas. Para o exemplo acima, isso é:
7hr e 58min menos 30 minutos, que é 7hr 28min.
Resultado
Sua saída deve especificar o número (inteiro) de horas e minutos e não deve listar mais de 59 minutos. Ou seja, você não pode emitir 2 horas e 123 minutos. Além disso, seu código pode ser produzido em qualquer formato de leitura facilmente humano que seja conveniente para você.
Exemplos
10:00 1:00 30 --> 2hr 30min
12:59 1:00 0 --> 0hr 1min
00:00 11:59 0 --> 23hr 59min
10:00 2:03 123 --> 2hr 0min
:
horários delimitados no relógio de 12 horas) adiciona algo a esse desafio.Respostas:
MATL , 28 bytes
Experimente online!
fonte
"XXhr YYmin"
?Retina 0.8.2 , 83 bytes
Experimente online! O link inclui casos de teste. Explicação:
Converta a entrada para unário.
Adicione 12 horas ao tempo de parada.
Multiplique as horas por 60 e adicione aos minutos.
Subtraia a hora de início e a pausa do tempo de parada.
Divmod por 60. (Economize 5 bytes para um formato de saída mais chato.)
fonte
Perl 5- pl,
807471 bytesExperimente online!
fonte
Python 3, 161 bytes
Eu sei que isso nem será o menor, mas ele será lido em um arquivo:
Estou sentindo a ironia de pausar meu quadro de horários para fazer isso ...
Python 2.7, 133 bytes
Obrigado pelas sugestões nos comentários! Mudar para o python 2.7 economiza mais alguns bytes porque o padrão é a divisão inteira:
A mesma abordagem com python3 é de 135 bytes por causa da instrução print e por padrão na divisão float:
fonte
i=int
no início e alterando a terceira linha param=-i(l[0])*60+i(l[1][:2])+(i(l[1][3:])*60+720+i(l[2][:2])-i(l[2][2:]))
map(int,l[:-1].split(':'))
e soltar as várias conversões para int, recolher tudo em uma linha, substituindo o recuo por;
etc. para economizar alguns bytes. Além disso, você pode visitar Dicas para jogar golfe em Python, para mais truques interessantes que outros usuários descobriram durante a vida de golfistas :).print(m,m%60)
seria suficiente. (Observe também o uso dem%60
no lugar dem-(m//60*60)
)C, 105 bytes
Completamente simples. Experimente online aqui .
Ungolfed:
fonte
a,b,c,d;f(e)
vez dea,b,c,d,e;f()
e em;printf("%d:%d ",a/60,a%60))a=(12+c-a)*60+d-b-e;}
vez de;)a=(12+c-a)*60+d-b-e,printf("%d:%d ",a/60,a%60);
Wolfram Language
125 119111 bytes8 bytes salvos graças ao usuário 202729
Exemplo
Abreviações não são usadas aqui, para facilitar o acompanhamento da lógica.
Interpreter["Time"][#2 <> "pm"]
interpreta como uma hora o segundo parâmetro seguido por "pm", ou seja, neste caso, "16:12", retornando umTimeObject
correspondente a 16:12.-Interpreter["Time"][# <> "am"])[[1]] - #3/60]
.#3
é o terceiro parâmetro, ou seja, 20min. O sinal de menos subtrai o intervalo da hora do almoço do final do horário do turno. Ele retorna o horário de fim de turno ajustado, ou seja, o final do turno que seria aplicado se a pessoa não tivesse feito uma pausa para o almoço.Interpreter["Time"][#]
interpreta como um horário o primeiro parâmetro, neste caso, "9:00", retornando umTimeObject
correspondente às 9:00.Subtraindo o início do turno do rendimento ajustado no final do turno
t
, o intervalo de tempo expresso em horas.IntegerPart[t]
retorna o número de horas completas trabalhadas.IntegerPart[60 Mod[t,1]], "min"}]
retorna os minutos adicionais trabalhados.fonte
Mod[x, 1]
usado.Floor
ser usado paraIntegerPart
?-6hr 52min
para os valores de amostra que usei. Eu preciso analisar isso para entender por que um valor negativo por horas (e aparentemente minutos) foi produzido.JavaScript,
83 bytes76 bytesAcabei de me livrar da função interna da solução abaixo (O que eu estava pensando?). Alterou o formato de saída também.
Experimente online!
ANTIGO: JavaScript,
112 bytes111 bytes110 bytesExplicação:
Dentro da função principal, começamos definindo outra que nos ajudará a calcular os minutos de um tempo determinado, adicionando 12 horas ao parâmetro horas se o terceiro parâmetro for verdadeiro:
Em seguida,
dividimos a sequência porcombinamos os números dentro da sequência, resultando em uma matriz de todos os números da sequência.' '
ou':'
Em seguida, calculamos a diferença de horário final e de início e de subtrair a hora do almoço usando a função definida anteriormente (convertendo as strings em números quando necessário).
Finalmente, produzimos a sequência de resultados: horas são a parte inteira de
r/60
e minutosr%60
.Experimente online!
fonte
map
:a=>a.map(...)
. Ele adicionará 5 bytes à minha resposta. Mas ainda estou aguardando a resposta do OP (ou de alguém) ao meu comentário.Python 2 , 100 bytes
Experimente online!
Programa completo que lê várias linhas de um arquivo de texto, conforme indicado pelo OP. Uma função que apenas analisa uma única linha salvaria uma adição em todos os 10 bytes.
fonte
Java 10,
194191 bytesA E / S é dolorosa em Java. Termina de forma anormal quando não há próxima linha de entrada para ler. Experimente online aqui .
Ungolfed:
fonte
Vermelho , 35 bytes
Experimente online!
Nota: A saída está no formato
hh:mm:ss
fonte
R , 97 bytes
Experimente online!
Para cada linha retorna
"hours minutes"
fonte
data.frame
para salvar alguns bytes - não funcionando até agora . Mas esta mudança simples faz :)