Surpreendentemente, essa tarefa simples parece não existir já, então ...
Sua tarefa é escrever um programa que tenha como entrada um tempo de 12 horas e o converta em "horário militar" ou formato de 24 horas.
A entrada estará no formato:
HH:MM am/pm
Embora pequenas variações sejam permitidas:
O espaço que separa am / pm do restante do tempo é opcional.
A última parte pode ser "am" / "pm" ou "a" / "p".
Qualquer capitalização é boa.
A saída será a hora inserida, transformada em formato de 24 horas. Pode ser um número ou uma string.
Para entrada e saída:
0s em primeiro lugar são opcionais. 0s nos últimos 3 lugares são obrigatórios.
o delimitador que separa horas e minutos pode ser um ":", "" (um espaço) ou nada.
Outras notas:
A meia-noite pode ser expressa como 0000 ou 2400.
A meia-noite será considerada "am", enquanto o meio-dia será considerado "pm".
Seu programa pode ser uma função ou um programa completo e deve retornar o resultado ou enviá-lo para o stdout. O espaço em branco à direita está ok.
Exemplos (você não precisa dar suporte a todos os formatos):
12:00am -> 0000
1200 pm -> 1200
1234Am -> 00:34
134a -> 134
01:34PM -> 13 34
1234pm -> 1234
Isso é código de golfe, então o menor número de bytes vence. Como isso é tão trivial para resolver usando um built-in, seria bom ver algum código que resolve isso manualmente (mas o uso de built-ins é bom).
Apenas para esclarecer, você não precisa oferecer suporte a todos os formatos possíveis. Suportar apenas uma única entrada e um único formato de saída (de sua escolha) é bom. Gostaria, no entanto, de limitar o formato conforme descrito acima (que já é bastante gratuito). {1134,'pm'}
, por exemplo, seria inaceitável.
01:54pm
funcionaria, mas1:54pm
não?Respostas:
V ,
2117 bytesObrigado @DJMcMayhem por 4 bytes!
Experimente online! Isso pega o formato
HH:MMx
ondex
é uma
oup
e o retorna no formatoHH:MM
Hexdump:
Explicação:
fonte
[1-12]
correta? Nesse caso, acho que você poderia fazer emó^12/0
vez decw^R=^R"%12
çp/12^A
que é equivalente:g/p/norm 12<C-a>
no vimMATL , 4 bytes
Experimente online!
Explicação
Função incorporada: conversão de cadeia de datas com detecção automática do formato de entrada e com o formato de saída
15
, o que corresponde a'HH:MM'
. Isso é equivalente à resposta Octave de @ StewieGriffin .fonte
Oitava,
2117 bytesGuardado 4 bytes graças a Luis Mendo. Eu poderia especificar o formato número 15 em vez de
'HHMM'
.Explicação:
Esta é uma função anônima tomando uma corda
c
como entrada no formato:'11:34 AM'
.datestr
reconhece o formato automaticamente como um dos formatos de data padrão e o exibe no número de formato especificado 15, que éHH:MM
.Como o formato de saída especificado não possui
AM
ou oPM
Octave o converte automaticamente para o que você chama de horário militar.Experimente online.
Uma versão que não usa
datestr
usando 35 bytesExplicação:
Toma uma sequência de entrada
c
no formato1134am
.Ou, uma abordagem diferente para 37 bytes:
fonte
PowerShell ,
232019 bytesExperimente online!
(Se você estiver no Windows, poderá omitir the
get-
, para descer até 19 bytes. No TIO, aparentemente, é necessário oGet-Date
nome completo .)Recebe a entrada como uma sequência de caracteres
$args[0]
, usa-a como entrada doGet-Date
cmdlet, que a analisa em umdatetime
objeto .NET . Isso é passado com o-f
parâmetro ormat deHHmm
para convertê-lo em horário militar (a capitalHH
especifica o horário de 24 horas). A saída está implícita.O mecanismo de análise é bastante robusto, portanto entradas adicionais como
12am
ou12:00am
são permitidas também. Brinque com a entrada no TIO e veja o que mais funciona.( Economizou 3 bytes graças a @admalledd ... salvou outro byte graças a @briantist )
fonte
$args[0]
e-f
, assim como remover as aspas simples em torno do str formato:date $args[0]-f HHmm
. Pelo menos isso funciona no meu powershell ...Get-Date
com-f
alguém me lembrou que você não precisa das aspas. E boa decisão com a remoção do espaço também, já que o analisador trata isso]
como o final de um token. Obrigado!Python 2, 44 bytes
Formato de entrada:,
01:23am
opcionalm
e espaços após minutosFormato de saída:
123
fonte
Pitão,
2120 bytesRecebe a entrada do formulário
01 23a
como "01:23". 0 inicial é opcional.A saída é do formato
123
, com o 0 inicial omitido.No pseudocódigo:
Experimente online!
fonte
PHP,
3532 bytesformato de entrada: não diferencia maiúsculas de minúsculas, requer dois pontos e o
m
formato de saídahhmm
. usa built-ins:recebe entrada do primeiro argumento da linha de comando.
PHP, 45 bytes, sem built-ins
formato de entrada em
(h)h:mm a(m)
minúsculas, formato de saída(h)hmm
.fonte
JavaScript (ES6), 40 bytes
A entrada deve ser formatada como:
12:32 am
fonte
GNU Coreutils (
1816 bytes)De um script de shell:
Não aceita espaço em branco na entrada
Nesse ponto, você também pode usar $ 1 e ignorar argumentos adicionais.
Original
Para permitir espaços em branco na entrada,
fonte
C #, 46 bytes
As seqüências de caracteres são obtidas na entrada como
12:00 AM
Fazer a mesma coisa, mas a substring na saída da chamada padrão para
ToString
(Assumindo uma cultura deen-GB
) é de 3 bytes mais para 49 bytes:fonte
date
, 0 + 8 = 8 bytesSobre o assunto de usar a ferramenta certa para o trabalho…
Recebe entrada como um argumento de linha de comando. Corra com
+%H%M -d
(penalidade de 8 bytes). Não há nenhum programa real aqui; todo o trabalho é realizado pelos argumentos da linha de comando. (Esta é uma demonstração muito boa do porquê há uma penalidade nos argumentos da linha de comando!)Exemplo:
fonte
Java 7,
138106105104 bytesExperimente online!
A entrada é delimitada por dois pontos e tem um espaço entre o horário e o horário da manhã. A saída não é delimitada por dois pontos.
-1 byte graças a Kevin Cruijssen
fonte
HHmm
paraHmm
.Japonês , 14 bytes
Experimente online!
Isso funciona apenas no Chrome. Aqui está uma versão que funciona em todos os navegadores:
Agradecemos novamente à ETHproductions pela ajuda!
fonte
Perl,
452837bytes2837 bytes(c / o @Dada)
(Código de 36 bytes, 1 byte para a
-p
opção do compilador )Aceita
0145pm
formatos de tipo, com am / pm ou a / p. Zeros à esquerda nas entradas necessárias.Teste:
Minha resposta original
(também gentilmente revisado)
(Código de 39 bytes, 1 byte para a
-p
opção do compilador .)Aceita apenas o formato 0145p ou 0145a, e nenhum outro, e requer que o
perl -p
modo funcione.teste:
fonte
-p
é necessário apenas ) se você alterar as aspas simples para aspas duplas.s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1
(37 bytes). E, a propósito, sua primeira solução pode ser aprimorada um pouco:s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e
(40 bytes)Commodore 64 BASIC, 301 bytes antes da execução, 321 bytes usados uma vez executados
Para inserir isso em um Commodore 64 real, você precisará usar abreviações de palavras-chave BASIC, como LE [shift] F para
LEFT$
, M [shift] I paraMID$
etc ... ou você pode tentar o CBM PRG STUDIO.A
TI$
variável no Commodore BASIC apresenta a hora no formato de 24 horas como HHMMSS quando impressa. A eliminação do espaço após o número da linha não salva nenhuma memória, pois o Commodore BASIC adiciona o espaço automaticamente de qualquer maneira quando você lista o programa após inseri-lo.Ao converter um número em uma string com
STR$
, o Commodore BASIC adicionará no espaço (portanto, se vocêPRINT A
vir um espaço antes que o número seja mostrado), removi o espaço de abertura na conversão de número para string com oRIGHT$
comando Você pode salvar alguns bytes alterando a linha zero para:portanto, você precisará declarar seu tempo de conversão antes de executar o programa, da seguinte maneira:
A qualquer momento, você poderá ver a hora atual com:
fonte
Java, 171 bytes
O formato de entrada é
HH:MM a/p
e o formato de saída éHHMM
. Abusar do fato de que a função principal possui uma matriz de seqüências de caracteres para dividir a entrada em 3 seções: hora, minuto e indicador a / p.Exemplo de entrada e saída:
Versão não destruída:
fonte
enum
usado para segurar omain
. Bom :)REXX, 33 bytes
Usar:
Isso pode ser reduzido por alguns bytes se não for usado dois pontos como delimitador.
fonte
C (clang) , 94 bytes
Experimente online!
Estou aqui para aprender, então qualquer dica sobre como otimizar o código é bem-vinda.
@ Johan du Toit Obrigado, por salvar alguns bytes!
fonte
printf("%02d:%02d", (a=='p' ? 12 : 0) + (h %12), m);
C,
8772 bytesGuardado 15 bytes graças a @Johan du Toit
Ligar
f()
com uma sequência mutável como argumento, a entrada é a saída.O formato é
HH:MMa/p
ondea/p
é minúsculoa
ou minúsculop
. Não é permitido espaço entre o tempo e o especificador de meridiano.Experimente em ideone .
fonte
i;f(char*p){i=atoi(p)%12+(p[5]^97?12:0);*p=i/10+48;p[1]=i%10+48;p[5]=0;}
(p[5]!=97)*12;
vez de(p[5]^97?12:0);
tcl, 45
47Agora usando um built-in:
Testável em http://rextester.com/TSRXI8802, onde existe um script que o executa das 01:00 às 1259.
fonte
SmileBASIC, 67 bytes
Entrada:
HH:MMa/p
Saída:
HH MM
fonte
R, 68 bytes
Lê a entrada do stdin e supõe-se que esteja em um dos seguintes formatos:
12:00 AM
12:00 am
12:00AM
12:00am
e a saída está no formato:
[1] "00:00"
Na maioria dos casos, a
strptime()
saída está no formato:"2017-01-06 12:00:00 CET"
onde a data é a data local. Como tal, precisamos usarsubstr()
para retornar apenas a hora, no entanto, se a entrada for meia-noite (por exemplo12:00am
), a saída é apenas"2017-01-06 CET"
a razão para aif
coisa no final (deve haver alguma solução mais inteligente).fonte
lubridate
, mas o nome do pacote é muito longo (entre outros problemas).C,
159152 bytesFormato de entrada:
07:30am
fonte
Pyke, 15 bytes
Experimente aqui!
fonte
Mathematica, 33 bytes
Função anônima. Pega uma string como entrada e retorna uma string como saída. Funciona com a maioria dos formatos, inclusive
hh:mm AM/PM
.fonte
JavaScript, 67 bytes
A entrada é como no exemplo
fonte
12:00 am
ou12:00 pm
Haskell, 61 caracteres
Versão curta:
Formato de entrada:
HHMM(a/p)
onde(a/p)
é 'a' ou 'p' sem parênteses.Formato de saída:
(hs, MM)
- uma tupla contendo as horas como um inteiro e MM ainda como uma sequência.Exemplo:
Versão mais longa (com nomes mais úteis e uma substituição
hs
):fonte
Lisp comum (
151122 bytes)OK, CL não deve ser "conciso", mas estou surpreso que não seja o mais detalhado para este.
Aqui está a versão de 122 bytes, que requer entrada em posição fixa.
0145pm
ou145p
são aceitáveis (com o espaço à esquerda na primeira posição do caractere).PPRINT:
Melhor, mas maior
Usando apenas o
Common-Lisp
pacote. Aceita (apenas) a entrada na forma de horas inteiras (com ou sem avanço0
),:
minutos literais de dois dígitos e rastreamento opcionalam
oupm
(somente em minúsculas). Permite espaços em branco ao redor do tempo e em torno do AM / PM, mas não diretamente após o:
.Teste:
pprint
a definição da função:Desfocado:
fonte
Retina ,
6160 bytesA entrada é fornecida sem dois pontos, separação obrigatória
0
e uso apenasa
ou emp
vez deam
oupm
, por exemplo,0134a
é 01:34. Saídas em tempo militar reto, usando 0000 como meia-noite. (Eu poderia salvar alguns bytes se me permitisse converter, por exemplo, 12h30 em2430
, mas duvido que seja aceitável).Experimente online!
Explicação
Os dois casos iniciais tratam das "12" horas, uma vez que am / pm é revertido para 12:
Se o horário estiver entre meia-noite (12h) e 1h, altere-o para 00 em vez de 12 e remova o
a
.Se o tempo estiver entre meio-dia (12h) e 13h, remova op para obter o horário de 24 horas.
Para qualquer outra hora:
Se for a hora, basta remover o
a
para obter o tempo de 24 horas.Se a hora for pm, remova o
p
. Converta o componente da hora em unário, adicione 12 e converta novamente em decimal. Deixe os minutos inalterados.fonte
Lote, 40 bytes
Recebe entrada como três argumentos. Assume que o segundo argumento tem zero à esquerda, quando necessário, o terceiro argumento é
a
oup
. Funciona tratando o terceiro argumento como um nome de variável indireta, adicionando-o ao número de horas; o número de minutos não é afetado, apenas a saída direta. Se misturar diferentes formatos estiver correto, o último espaço poderá ser excluído para salvar um byte.(De maneira irritante, essa pergunta não apareceu na página de perguntas quando a carregei originalmente, e só a encontrei porque estava procurando outra pergunta.)
fonte