Que horas são, camarada?

18

Sinceramente, não acredito que essa ainda não seja uma pergunta sobre o Code Golf, mas ...

Imprima a hora local (com am ou pm) como uma sequência no console, precedida por "It's".

Exemplo:

Run code....

Resultado:

It's 12:32p.m.

O menor código vence.

Código de distância!

Entre os melhores

Daniel
fonte
1
Qual é o formato de saída? Isso importa?
Mbomb007
1
Não, quero dizer, deveria ser yyyy-MM-dd hh:mm:ss UTCou esse formato de data não importa?
mbomb007
8
Eu realmente queria colocar uma resposta impressa It's beer o'clock, mas resisti.
MickyT
4
Podemos usar 12:32 PMou 12:32PM? Em vez de 12:32p.m.?
Stewie Griffin
3
São 02:32 ou 2:32 se for menor que 10:00?
Stewie Griffin

Respostas:

18

Bash, 39 33 bytes

date "+It's %I:%M%P."|sed s/m/.m/

Desperdiçou um monte de caracteres porque a especificação requer a.m.ou p.m.enquanto dateproduz amou pm. Obrigado a @DigitalTrauma por salvar 6 bytes!

Isso pode não ser muito portátil. Funciona no Ubuntu 15.04.

Uma solução que usa essencialmente o mesmo método em Ruby , que surpreendentemente tem exatamente o mesmo comprimento :

Ruby, 39 bytes

$><<`date "+It's %I:%M%P"`[0..-3]+'.m.'
Maçaneta da porta
fonte
%Pme dá maiúsculas AM ou PM. Estou no mac, se isso faz diferença.
flodel
O @flodel funciona em minha máquina ™. No Ubuntu 15.04, %Pfornece letras minúsculas e %pletras maiúsculas (o que é um pouco ... não intuitivo).
Maçaneta
GNU date(no Linux et al.) E * BSD date(onde OSX é uma variante BSD) têm opções e comportamentos muito diferentes quando você se aventura fora do conjunto de recursos especificado pelo POSIX. Talvez essa resposta deva mencionar especificamente o Bash no Linux. (Isso vale para sedmuito, mas esta invocação particular é firmemente dentro do conjunto de recursos seguro e portátil.)
tripleee
Na minha máquina (zsh ou bash no Linux), ele imprime "São 04:17". quando são 16:17. Não "sou" ou "pm"
aditsu 11/09/15
echo -e "It's $(date +%I:%M%P)\b.m."- em vez de sedusar backspace. Não parece uma resposta separada para mim. Também não tenho am / pm, mas acho que é por causa da localidade.
Aragaer # 11/15
13

AppleScript, 198

Porque AppleScript. Porque porque não:

set AppleScript's text item delimiters to {":"," "}
set d to (current date)'s time string's every text item
"It's "&d's item 1&":"&d's item 2&string id ((d's item 4's first character's id)+32)&".m."

Isso foi doloroso.

Trauma Digital
fonte
18
AppleScript é o novo Java.
Maçaneta
8

PHP, 35 33 bytes

Usando a ferramenta errada para o trabalho!

It's <?=trim(date('h:ia'),m)?>.m.

Ele simplesmente remove o mfinal de amou pmpara permitir adicionar os pontos. A data chega como 00:00am, e com trimela se torna 00:00a.


Resposta antiga (somente PHP 5.4+):

It's <?=date('h:i'),date(a)[0]?>.m.

Isso funciona porque você pode des-referenciar um valor retornado de uma função. Isso não é possível no PHP5.3 ou mais antigo.

Ismael Miguel
fonte
Ah, esperto! Você venceu a minha resposta php
DankMemes
@DankMemes Demorei um bom tempo. E muitas experiências.
Ismael Miguel
Você usou uma string literal sem aspas. É bom usar aqueles sem o @operador e assumir que as pessoas o executam error_reporting(0)?
DankMemes
@DankMemes Você pode assumir indiretamente que o relatório de erros está desativado. Aqui está uma boa leitura: meta.codegolf.stackexchange.com/a/1655/14732
Ismael Miguel
5

Visual Basic 6 / VBA, 42. 41 bytes

MsgBox"It's "&Format(Now,"h:mma/p")&".m."

Usando MsgBox, como o VB6 não possui um console (a menos que você intercepte o link, o link como executável do console, use alguns hacks da API do Windows e faça outras coisas desonestas )).

Escova de dente
fonte
3
Por que você não substitui mpor .m.? isto é, Debug.Print Replace(Format(Now,"hh:mm am/pm"),"m",".m.")
CompuChip
Agradável @toothbrush, eu meio que esperava que este seja uma solução de um byte em CJam;)
CompuChip
4

R, 68 , 59 62 60 55

cat("It's",sub("m",".m",format(Sys.time(),"%I:%M%P.")))

(Graças a @ Alex.A. E @flodel pelos comentários) Leva a hora atual do sistema ( Sys.time()), formata-a corretamente usando a %I:%M%Pcombinação, adiciona um ponto no final e substitui mpor .m..

David Arenburg
fonte
4

Julia, 74 54 43 bytes

print(strftime("It's %I:%M%P\b.m.",time()))

Você pode experimentá-lo online !

A time()função retorna a hora atual. Quando passado para strftimeo formato %I:%M%P, isso resulta em HH:MMam/pmonde as horas são por um relógio de 12 horas. Fazemos o backup de um personagem com \bpara remover o m, deixando um rastro aou p, em seguida, aderimos .m.ao final.

Economizou 31 bytes graças a Glen O!

Alex A.
fonte
Posso sugerir isso? print("It's ",strftime("%r%P",time())[[1:5,12]],".m.")- usa %Ppara adicionar minúsculas am / pm, para evitar a comparação e o comando split.
Glen O
Sem problemas em relação à ajuda. E não se desanime - você está bem. Eu apenas gosto de tentar espremer cada último byte do código. Nesse caso, imaginei que tentar ignorar o comando split e a instrução condicional seria benéfico e depois fui examinar as funções que você usava. Eu provavelmente não teria encontrado strftime mim mesmo (eu tentei extrair o tempo diretamente de time())
Glen O
1
@GlenO Se você gosta de espremer cada último byte de código, o PPCG é certamente o lugar certo para você!
Alex A.
Aliás, eu encontrei uma maneira de espremer mais alguns bytes:print(strftime("It's %I:%M%P",time())[1:11],".m.")
Glen O
Na verdade, ainda melhor:print(strftime("It's %I:%M%P\b.m.",time()))
Glen O
3

Haskell, 135 bytes

import Data.Time.Format
import Data.Time.LocalTime
main=getZonedTime>>=putStr.(++".m.").init.formatTime defaultTimeLocale"It's %I:%M%P"

Eu achei muito mais divertido main, com cinco bytes a mais:

getZonedTime>>=putStr.formatTime(TimeLocale[][]("a","p")""""""""[])"It's %I:%M%P.m."

Ou 66 bytes no Unix:

import System.Cmd;main=system"date \"+It's %I:%M%P.\"|sed s/m/.m/"
Lynn
fonte
3

Pitão, 38 36 bytes

s["It's "|%J.d6K12K\:.d7?gJK\p\a".m.

Guardado 2 bytes graças a @Jakube!

kirbyfan64sos
fonte
@ Sp3000 No intérprete online ou localmente?
Kirbyfan64sos
@ Sp3000 Acho que conheço o problema. Está dando a hora da localização do servidor Pyth e não estou lidando com a meia-noite corretamente. Espere ...
kirbyfan64sos
@ Sp3000 Fixed !!!
Kirbyfan64sos
Você está quase vencendo minha resposta PHP e a resposta Bash da Maçaneta da porta!
Ismael Miguel
3

MATLAB, 59 bytes

disp(sprintf('It''s%s\b.m.',lower(datestr(now,'HH:MMam'))))

São 5:38 da tarde.

Se for permitido ter um espaço em branco entre horário e am / pm, pode ser tão baixo quanto 52 bytes :

disp(sprintf('It''s%s\b.m.',lower(datestr(now,16))))

São 17:39

slvrbld
fonte
Eu acho que a saída deve ser05:38p.m.
Ismael Miguel
De acordo com o comentário do OP, o zero inicial não importa.
slvrbld
Você está certo. Aqui, tenho o meu voto!
Ismael Miguel
Agradável! Não sabia que eu poderia usar \bassim ... Você precisa de um espaço extra entre.
Stewie Griffin
3

Perl 5.10+, 58 62 bytes

localtime=~/(..)(:..)/;say"It's ",$1%12||12,$2,$1>11?p:a,".m."

Deve ser executado com o -M5.010sinalizador de linha de comando para obter say.

Não contei alguns casos extremos na minha solução original (ou seja, 00:** e 12:**); corrigido a um custo de 4 bytes adicionais.

Como funciona

No contexto escalar, localtimeretorna uma string como esta:

Sat Sep 12 03:13:22 2015

O campo de minutos já está preenchido com zero, o que economiza alguns bytes (no contexto da lista, localtime retorna números em vez de cadeias, portanto, você mesmo deve preenchê-los).

Aqui está não destruído:

localtime=~/(..)(:..)/;  # Store hour in $1 and minutes in $2
say"It's ",              # Print "It's " followed by...
   $1%12||12,            # hour in 12-hour format
   $2,                   # minutes
   $1>11?p:a,            # "p" if hour > 11, otherwise "a"
   ".m."'                # ".m."

Perl 5.14+, 57 bytes

(Apenas por diversão, pois estende um pouco as regras.)

say"It's ",(strftime"%l:%M%P",localtime)=~s/m/.m./r

51 bytes + 6 bytes para -MPOSIX. Também deve ser executado com o -M5.010sinalizador de linha de comando para obter say.

Esta solução depende da sua localidade, portanto, não funcionará em todos os sistemas. Ele também usa o módulo POSIX, que pode estar ampliando a definição de "embutido", mesmo que seja um módulo principal.

Perl 5.14+ é necessário para o rmodificador não destrutivo para o operador de substituição. Uma solução equivalente que funciona no 5.10+ é:

$_=strftime"%l:%M%P",localtime;chop;say"It's $_.m."

Isso também é 57 bytes (51 bytes + 6 bytes para -MPOSIX).

ThisSuitIsBlackNot
fonte
3

Perl 5, 74 bytes

Uma pequena demonstração de como as variáveis ​​são avaliadas da direita para a esquerda.

($s,$m,$h)=localtime;printf"It's %d:%02d%s.m.",$h<13?$h:$h%12,$m,$h<12?a:p

Usando POSIX: 80 bytes

use POSIX;$_=strftime"It's %I:%Mx.m.",@_=localtime;$x=$_[1]<13?a:p;s/x/$x/;print

Usando POSIX com dependência de locale de tempo e comutadores: 54 bytes (48 + 6)

$_=strftime"It's %I:%M%P",localtime;s/m/.m./;say

Teste

$ export LC_TIME="en_DK.UTF-8"
$ perl -MPOSIX -M5.01 whatsthetimechap.pl
It's 3:09p.m.
LukStorms
fonte
1
Você pode salvar alguns bytes em suas soluções POSIX usando, em -MPOSIXvez de use POSIX;, descartando os parênteses em sua chamada strftimee substituindo printpor say( -M5.010é gratuito ). O que reduz sua última solução para 54 bytes!
ThisSuitIsBlackNot
Obrigado. Eu usei o seu conselho para a solução POSIX mais curta.
LukStorms
1
Você ainda tem que contar -MPOSIX(6 bytes), mas você pode salvar 2 bytes, largando os parênteses: $_=strftime"It's %I:%M%P",localtime;. Isso totaliza 54 bytes, o que ainda é melhor do que minha solução POSIX de 57 bytes. Bem feito!
carregar a caixa de mensagens, experimente recarregar
Heh, obrigado novamente por resgatar alguns bytes.
LukStorms
3

CJam, 40 bytes

"It's "et3=CmdCe|\'p'a?':et4=s2Ue[@".m."

Experimente on-line no intérprete CJam .

Como funciona

"It's " e# Push that string.
et3=    e# Select the fourth element of the date/time array (hours).
Cmd     e# Push quotient and remainder of the hour divided by 12.
Ce|     e# Logical OR with 12 to map 0 to 12.
\'p'a?  e# Select 'p' if the quotient is 1 and 'a' if it is 0.
':      e# Push that character.
et4=    e# Select the fifth element of the date/time array (minutes).
s2Ue[   e# Cast to string and left-pad with zeroes to a length of 2.
@".m."  e# Rotate 'a' or 'p' on top of the stack and push ".m.".
Dennis
fonte
3

Mathematica 49 90 92 90 84 bytes

-6 bytes graças a user202729

A solução é simples, mas um pouco prolixo, no Mathematica.

(d=DateString)@{"It's ","Hour12",":","Minute"}<>(d@"AMPM"/."AM"->"a.m."/."PM"->"p.m‌ .")
DavidC
fonte
(Embora este post seja bastante antigo) StringReplacepode ser eliminado, salve 6 bytes. (d=DateString)@{"It's ","Hour12",":","Minute"}<>d@"AMPM"/."AM"->"a.m."/."PM"->"p.m."
user202729
2

T-SQL (2012+), 67 65 bytes

O SQL Server 2012 finalmente nos deu uma função de formatação razoável para datas. Eu ainda tinha que mexer com o AM / PM para obter o formato certo.

PRINT 'It''s '+LOWER(STUFF(FORMAT(GETDATE(),'hh:mmtt.'),7,0,'.'))

Nas versões anteriores, seria necessário algo como isto (93 bytes)

PRINT'It''s'+LOWER(STUFF(STUFF(RIGHT(CONVERT(VARCHAR,GETDATE(),109),15),6,7,''),8,0,'.'))+'.'
MickyT
fonte
2

PHP, 49 bytes

Se fosse am/pmem vez de a.m./p.m....

It's <?=@preg_replace(~Фž’¢Ð,~ÛÏÑ,date(~˜Å–ž));

Eu usei muitos bytes desagradáveis ​​para economizar um pouco de comprimento, então aqui está o hex:

00000000: 49 74 27 73 20 3C 3F 3D - 40 70 72 65 67 5F 72 65 |It's <?=@preg_re|
00000010: 70 6C 61 63 65 28 7E D0 - A4 9E 92 8F A2 D0 2C 7E |place(~       ,~|
00000020: DB CF D1 2C 64 61 74 65 - 28 7E 98 C5 96 9E 29 29 |   ,date(~    ))|
00000030: 3B                      -                         |;|
00000031;

Versão legível:

It's <?=preg_replace("/[amp]/", "$0.", date("g:ia"));
DankMemes
fonte
2

C, 103 94 bytes

int main(){time_t r;char b[80];time(&r);strftime(b,80,"It's %I:%M %p",localtime(&r));puts(b);}

Ungolfed

int main()
{
  time_t r;
  char b[80];  
  time(&r);
  strftime(b,80,"It's %I:%M %p",localtime(&r));
  puts(b);
}
Zongor
fonte
2

PHP, 41 bytes

It's <?=strtr(date('g:ia'),['m'=>'.m.']);

Primeira vez que joguei isso. Não tenho certeza se devo atualizar / editar a resposta PHP anterior (49 bytes) ou apenas adicionar minha própria ...

fisharebest
fonte
Você sempre deve adicionar o seu próprio. Você só comenta a resposta de alguém se vê algo que pode economizar alguns bytes. Mas fora isso, boa resposta!
Ismael Miguel
A propósito, você pode escrever [m=>'.m.'], o que economiza 2 bytes. (Os avisos podem ser ignorados, por isso, não se preocupe com eles.)
Ismael Miguel
2

SQL (PostgreSQL), 42 41 bytes

Outra variante SQL, porém esta está em uma consulta.

select to_char(now(),'"It''s" HH:MIa.m.')

Como nota, pm ou am trabalha para obter a parte am / pm. As opções de formatação no PostgreSQL são realmente bastante flexíveis. Obrigado a @manatwork pela dica de mover oit's string de formato.

SQLFiddle

MickyT
fonte
Então você precisa ajustar am / pm manualmente?
David Arenburg
@DavidArenburg, não, isso está certo com qualquer um ... mas eu tive que dar uma olhada, porque não parecia certo. Se você adicionar + time '12:00'após o now()no SQLFiddle, ele deve alterar o valor am / pm.
MickyT
1 caractere mais curto:select to_char(now(),'"It''s" HH:MIa.m.')
manatwork
@ manatwork, muito bom obrigado. Eu não teria pensado em tentar isso.
MickyT
2

CJam, 43 bytes

Ter que preencher os números com zeros torna isso maior do que eu gostaria. No final, a formatação de strings foi a maneira mais curta.

4Z]etf=~Cmd@@'p'a?]"It's %02d:%02d%c.m."\e%

Experimente online .

Explicação

   et                                       e# Push local time
4Z]  f=                                     e# Get [minutes hours]
       ~Cmd                                 e# Unwrap array, div+mod hours by 12
           @@'p'a?                          e# Select 'p' or 'a' based on remainder
                  ]"It's %02d:%02d%c.m."\e% e# Print
Andrea Biondo
fonte
1
Isso falha para os 12's. Em vez de 12:37sair 00:37.
Zach Gates
2

Javascript, 103 bytes

Javascript executado a partir do console.

d="It's "+new Date().toLocaleTimeString();l=d.length;d.slice(0,l-6)+d.slice(-2,l-1).toLowerCase()+'.m.'

C #, 63 bytes

C # executado a partir da janela imediata.

?"It's "+System.DateTime.Now.ToString("h:MMt").ToLower()+".m.";
DaveMorganTexas
fonte
Também funciona como F #;)
Stachu
Você não precisa calcular d.length, basta escrever -ne ele calculará a partir do final, apenas um FYI. d="It's "+new Date().toLocaleTimeString();d.slice(0,-6)+d.slice(-2,-1).toLowerCase()+'.m.'90 bytes. E você pode salvar um byte movendo a "It's "string. E alguns bytes de um pequeno atalho de string lá. d=new Date().toLocaleTimeString();"It's "+d.slice(0,5)+d[9].toLowerCase()+'.m.'79 bytes.
Janeiro
E se a resposta precisar ser independente da localidade (como alguns já postaram), basta usar toLocaleTimeString("en-US")86 bytes.
Jan
2

Bash, 44 caracteres

Pure Bash, apenas shell builtins, sem *** utils.

printf -vt "It's %(%I:%M%P)T"
echo ${t%m}.m.

Exemplo de execução:

bash-4.3$ printf -vt "It's %(%I:%M%P)T";echo ${t%m}.m.
It's 01:04p.m.
homem a trabalhar
fonte
2

Powershell, 49 bytes

"It's {0:hh:mm}$("ap"[($d=date).hour/23]).m."-f$d

(date).hour/23parece funcionar como um índice para, "ap"porque arredonda 0para horas inferiores a 12 e 1para 12 e acima.

Danko Durbić
fonte
Deve ser capaz de golfe fora alguns caracteres por em vez do tratamento de "p" / "a" como se transformou em cadeia de uma carbonizar-matriz implícito - 51 bytes -"It's $(date -f hh:mm)$("pa"[(date).hour-lt12]).m."
AdmBorkBork
Suas últimas "{0:hh:mm}$("ap"[($d=date).hour/23]).m."-f$dfalham It's no início. Se você colocar isso na frente, são os mesmos 49 bytes que"It's $((date -f hh:mm)+"ap"[(date).hour/23]).m."
#
Foi mal. Eu consertei isso. De qualquer forma, esta versão é mais "correta", uma vez que só faz uma única chamada paradate
Danko Durbic
Pelo que vale, eu tropecei nos itens a seguir enquanto pesquisava outra coisa. Aparentemente, os [datetime]elencos são sempre nos EUA . Isso significa que algo como isso "It's $(("{0:h:mmt}"-f[datetime](date)).ToLower()).m."é possível ... que, concedido, tem 54 bytes e mais que a sua solução atual, mas ainda é uma peculiaridade interessante do idioma.
AdmBorkBork 23/09
@ TimmyD Interessante, mas parece que está transmitindo apenas para o DateTime nos EUA, sem formatação.
Danko Durbić
2

Depende da localidade

Para ambientes de navegador que possuem o código de idioma definido como en-CA ou qualquer código de idioma que produza um tempo de 12 horas por padrão:

CoffeeScript, 81 bytes

alert "It's #{(x=(new Date).toLocaleTimeString().toLowerCase())[..4]} #{x[9]}.m."

JavaScript (ES5), 90 bytes

alert("It's "+(x=(new Date).toLocaleTimeString().toLowerCase()).slice(0,5)+' '+x[9]+".m.")

Independente da localidade

CoffeeScript, 113 96 bytes

alert "It's #{(h=(d=new Date).getHours())%12}:#{('0'+d.getMinutes())[-2..]} #{'ap'[+(h>11)]}.m."

Anterior:

Este funciona em todos os ambientes do navegador, independentemente da localidade. Requer o Chrome 24+, Firefox 29+, IE 11+, Opera 15+ ou quaisquer derivados deles. Não funciona no Safari. Veja Intl.DateTimeFormat.

alert "It's #{new Intl.DateTimeFormat('en',{hour:f='2-digit',minute:f}).format(new Date).toLowerCase()[..-2]}.m."
rink.attendant.6
fonte
A resposta javascript me deu:It's 2:59: m.m.
Mwr247
@ Mwr247 Em que localidade está o seu navegador?
usar o seguinte código
@ rinkattendant6 Minha localidade éen-US
Mwr247
2

Swift - 124 102 bytes

import Cocoa
var f=NSDateFormatter()
f.dateFormat="hh:mma"
print("It's \(f.stringFromDate(NSDate()))")
Błażej
fonte
2

C, 154 bytes

#include <time.h>
#define l localtime(&r)
main(){time_t r=time(0);printf("It's %02i:%02i%c.m.",(l->tm_hour+11)%12+1,l->tm_min,(l->tm_hour>=12)?'p':'a');}

Em contraste com a outra resposta C, esta usa o formato correto "am" / "pm". O outro pôster foi omitido #include <time.h>- se o seu compilador permitir, reduziremos para 136 bytes. Qual deles devemos contar?

mindriot
fonte
Você está certo, na verdade tudo o que recebi foi um aviso - confundi-o com um erro ao tentar passar sem ele time.h. Edição.
mindriot
1

Moonscript - 56 bytes

print "It's "..(os.date'%I:%M%p'\gsub 'M','.M.')\lower!

Infelizmente, a biblioteca padrão Lua implementa apenas% p para AM / PM maiúsculo, então eu tenho que chamar o método mais baixo.

Ryan Russell
fonte
1

SpecBAS - 64 bytes

PRINT "It's ";LOW$(REPLACE$(TIME$(TIME,"h:mm p$"),"M",".M."))

A função incorporada p$da hora retorna AM ou PM; portanto, isso deve ser formatado com REPLACE$para alterá-la, para ter um ponto final antes / depois dessa letra.

Depois, a saída de tempo teve que ser convertida para minúscula.

Brian
fonte
1

MATLAB, 66 bytes

['It''s' lower(datestr(now,'HH:MMam'))];disp([ans(1:end-1),'.m.'])

Exibe:

It's 2:48p.m.
Stewie Griffin
fonte
1

Python 2, 75 67 66 bytes

import time;print"It's %s.m."%time.strftime("%I:%M%p")[:6].lower()

versão antiga, 75 bytes

import time
t=time.strftime("%I:%M%p")
print"It's",t[:5]+t[5].lower()+".m."

versão antiga, 75 bytes

import time
print"It's",time.strftime("%I:%M%p").lower().replace("m",".m.")
Máx.
fonte
@AlexA. Não está funcionando no Python 2 time.strftime, pelo menos no Windows, fornece "ValueError: String de formato inválida"
Max
@AlexA Python 2.7.10 (padrão, 23 de maio de 2015, 09:40:32) [MSC v.1500 32 bits (Intel)] no win32 Digite "help", "copyright", "credits" ou "license" para obter mais informações em formação. >>> hora da importação; imprima "É% sm"% time.strftime ("% I:% M% p") [: 6] .lower () são 01:30 pm`.
Max
1

Python 3, 117 87 79 bytes

from datetime import*
print(datetime.now().strftime("It's %I:%M%P")[:-1]+".m.")

Isso obtém as horas e os minutos de um relógio de 12 horas usando o formato %I:%M, mais amou pmusando %P. Em seguida, selecionamos tudo, exceto o último, me acrescentamos .m..

Economizei alguns bytes graças a Ruth Franklin!

Alex A.
fonte
1
Como você está usando apenas datetimeuma vez, é 6 bytes mais curto para usarfrom datetime import*; h=datetime.now() ...
Ruth Franklin
@RuthFranklin Obrigado pela sugestão! Eu também encontrei algumas outras maneiras de reduzi-lo.
Alex A.