Która jest godzina?


18

Szczerze mówiąc, nie mogę uwierzyć, że nie jest to jeszcze pytanie w Code Golf, ale ...

Wydrukuj czas lokalny (z am lub pm) jako ciąg znaków na konsoli, poprzedzony „It's”.

Przykład:

Run code....

Wynik:

It's 12:32p.m.

Najkrótszy kod wygrywa.

Kod precz!

Tabela liderów


1
Jaki jest format wyjściowy? Czy to ma znaczenie?
mbomb007,

1
Nie, to znaczy, czy powinien być, yyyy-MM-dd hh:mm:ss UTCczy ten format daty nie ma znaczenia?
mbomb007,

8
Naprawdę chciałem znaleźć odpowiedź, która jest drukowana It's beer o'clock, ale się opierałem.
MickyT,

4
Czy możemy użyć 12:32 PMlub 12:32PM? Zamiast 12:32p.m.?
Stewie Griffin,

3
Czy to 02:32 czy 2:32, jeśli jest mniej niż 10:00?
Stewie Griffin,

Odpowiedzi:


18

Bash, 39 33 bajtów

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

Zmarnowałem kilka znaków, ponieważ specyfikacja wymaga a.m.lub p.m.podczas datewyjścia amlub pm. Dzięki @DigitalTrauma za oszczędność 6 bajtów!

To może nie być bardzo przenośne. Działa na Ubuntu 15.04.

Rozwiązanie, które używa zasadniczo tej samej metody w Ruby , która jest zaskakująco dokładnie tej samej długości :

Rubin, 39 bajtów

$><<`date "+It's %I:%M%P"`[0..-3]+'.m.'

%Pdaje mi wielkie litery AM lub PM. Jestem na komputerze Mac, jeśli to robi różnicę.
flodel

@flodel działa na mojej maszynie ™. Na Ubuntu 15.04 %Pdaje małe litery i %pdaje wielkie litery (co jest trochę ... nieintuicyjne).
Klamka

GNU date(w Linuksie i in.) I * BSD date(gdzie OSX jest jednym z wariantów BSD) mają bardzo różne opcje i zachowania, gdy zapuszczasz się poza zestaw funkcji określony przez POSIX. Być może więc ta odpowiedź powinna konkretnie wspomnieć o Bash na Linuksie. (To sedsamo dotyczy; ale ta konkretna inwokacja należy do bezpiecznego i przenośnego zestawu funkcji).
tripleee

Na mojej maszynie (zsh lub bash w systemie Linux) wyświetla „To 04:17”. kiedy jest godzina 16:17. Bez „am” lub „pm”
aditsu

echo -e "It's $(date +%I:%M%P)\b.m."- zamiast sedużywa backspace. Nie wygląda mi to na osobną odpowiedź. Również nie mam żadnych am / pm, ale myślę, że to z powodu lokalizacji.
aragaer

13

AppleScript, 198

Ponieważ AppleScript. Bo czemu nie:

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."

To było bolesne.


18
AppleScript to nowa Java.
Klamka

8

PHP, 35 33 bajtów

Używanie niewłaściwego narzędzia do pracy!

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

Po prostu usuwa mkońcówkę amlub pm, aby umożliwić dodawanie kropek. Data przychodzi jako 00:00ami wraz z trimnią staje się 00:00a.


Stara odpowiedź (tylko PHP 5.4+):

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

Działa to, ponieważ można odwoływać się do wartości zwracanej z funkcji. Nie jest to możliwe w PHP 5.3 lub starszym.


Ach, sprytnie! Pokonałeś moją odpowiedź php
DankMemes,

@DankMemes Zajęło mi to sporo czasu. I dużo eksperymentów.
Ismael Miguel,

Użyłeś literału ciąg bez cudzysłowów. Czy można używać tych bez @operatora i zakładać, że ludzie będą go używać error_reporting(0)?
DankMemes,

@DankMemes Możesz pośrednio założyć, że raportowanie błędów jest wyłączone. Oto dobra lektura: meta.codegolf.stackexchange.com/a/1655/14732
Ismael Miguel

5

Visual Basic 6 / VBA, 42 41 bajtów

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

Używanie MsgBox, ponieważ VB6 nie ma konsoli (chyba że przechwycisz linkowanie, link jako plik wykonywalny konsoli, użyj hacków Windows API i zrobisz inne podejrzane rzeczy).


3
Dlaczego nie można po prostu zastąpić mprzez .m.? tj. Debug.Print Replace(Format(Now,"hh:mm am/pm"),"m",".m.")
CompuChip,

Nice @ Toothbrush, spodziewałem się, że będzie to rozwiązanie jednobajtowe w CJam;)
CompuChip

4

R, 68 , 59 62 60 55

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

(Dzięki @ Alex.A. I @flodel za komentarze) wyraża aktualny czas systemowy ( Sys.time()), formaty to poprawnie używając %I:%M%Pkombinacji dodaje kropkę na końcu, i zastępuje msię .m..


4

Julia, 74 54 43 bajty

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

Możesz spróbować online !

time()Zwraca aktualny czas. Po przejściu do strftimeformatu %I:%M%Ppowoduje to HH:MMam/pm, że godziny przypadają na 12-godzinny zegar. Wykonujemy kopię zapasową jednej postaci, \baby usunąć m, pozostawiając ślad alub p, a następnie hals .m.na końcu.

Zaoszczędź 31 bajtów dzięki Glen O!


Czy mogę to zasugerować? print("It's ",strftime("%r%P",time())[[1:5,12]],".m.")- używa, %Paby dodać małe litery am / pm, aby uniknąć porównania i polecenia podziału.
Glen O

Brak problemów dotyczących pomocy. I nie gadaj się - masz się dobrze. Po prostu czerpię przyjemność z próby wyciśnięcia każdego ostatniego bajtu z kodu. W tym przypadku właśnie doszedłem do wniosku, że próba ominięcia polecenia split i instrukcji warunkowej byłaby korzystna, a następnie przejrzałem używane funkcje. Prawdopodobnie sam nie znalazłbym strftime (próbowałbym wydobyć czas bezpośrednio z time())
Glen O

1
@GlenO Jeśli czerpiesz przyjemność z wyciskania każdego ostatniego bajta kodu, PPCG jest z pewnością właściwym miejscem dla Ciebie!
Alex A.

Nawiasem mówiąc, znalazłem sposób na wyciśnięcie jeszcze kilku bajtów:print(strftime("It's %I:%M%P",time())[1:11],".m.")
Glen O

Właściwie jeszcze lepiej:print(strftime("It's %I:%M%P\b.m.",time()))
Glen O

3

Haskell, 135 bajtów

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

Znalazłem o wiele bardziej zabawne main, to pięć bajtów dłużej:

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

Lub 66 bajtów w Uniksie:

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

3

Pyth, 38 36 bajtów

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

Zaoszczędź 2 bajty dzięki @Jakube!


@ Sp3000 W tłumaczu online lub lokalnie?
kirbyfan64sos,

@ Sp3000 Myślę, że znam problem. Podaje czas lokalizacji serwera Pyth i nie obsługuję poprawnie północy. Poczekaj ...
kirbyfan64sos,

@ Sp3000 Naprawiono !!!
kirbyfan64sos

Prawie bijesz moją odpowiedź PHP i odpowiedź Bash Doorknob!
Ismael Miguel,

3

MATLAB, 59 bajtów

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

Jest 17:38.

Jeśli dozwolone jest umieszczenie spacji między czasem a godziną przedpołudniową / przed południem, może wynosić nawet 52 bajty :

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

Jest 17:39


Myślę, że wynik musi być05:38p.m.
Ismael Miguel

Zgodnie z komentarzem OP, wiodące zero nie ma znaczenia.
slvrbld

Masz rację. Proszę, zabierz głos!
Ismael Miguel,

Ładny! Nie wiedziałem, że mogę tak użyć \b... Potrzebujesz dodatkowej przestrzeni btw.
Stewie Griffin,

3

Perl 5.10+, 58 62 bajtów

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

Aby uruchomić, należy uruchomić -M5.010flagę wiersza polecenia say.

W moim oryginalnym rozwiązaniu nie uwzględniłem kilku przypadkowych przypadków (mianowicie 00:**i 12:**); naprawiony kosztem 4 dodatkowych bajtów.

Jak to działa

W kontekście skalarnym localtimezwraca ciąg taki jak ten:

Sat Sep 12 03:13:22 2015

Pole minut jest już uzupełnione zerami, co oszczędza niektóre bajty (w kontekście listy localtimezwraca liczby zamiast ciągów, więc należy je uzupełnić samodzielnie).

Tutaj nie jest golfem:

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 bajtów

(Dla zabawy, ponieważ nieco rozciąga zasady).

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

51 bajtów + 6 bajtów dla -MPOSIX. Należy również uruchomić z -M5.010flagą wiersza poleceń, aby uzyskać say.

To rozwiązanie zależy od ustawień regionalnych, więc nie będzie działać na wszystkich systemach. Wykorzystuje również moduł POSIX, który może rozciągać definicję „wbudowanego”, nawet jeśli jest to moduł podstawowy.

Perl 5.14+ jest wymagany dla nieniszczącego rmodyfikatora operatora podstawienia. Równoważne rozwiązanie działające w wersji 5.10+ to:

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

Jest to również 57 bajtów (51 bajtów + 6 bajtów na -MPOSIX).


3

Perl 5, 74 bajtów

Mała prezentacja tego, jak zmienne są oceniane od prawej do lewej.

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

Przy użyciu POSIX: 80 bajtów

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

Korzystanie z POSIX w zależności od ustawień regionalnych i przełączników: 54 bajtów (48 + 6)

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

Test

$ export LC_TIME="en_DK.UTF-8"
$ perl -MPOSIX -M5.01 whatsthetimechap.pl
It's 3:09p.m.

1
Można zaoszczędzić kilka bajtów na swoich rozwiązań POSIX stosując -MPOSIXzamiast use POSIX;, upuszczając parens w wywołaniu strftimei wymianie printz say( -M5.010jest bezpłatny ). Co sprowadza twoje ostatnie rozwiązanie do 54 bajtów!
ThisSuitIsBlackNot

Dzięki. Skorzystałem z twojej porady, aby znaleźć najkrótsze rozwiązanie POSIX.
LukStorms,

1
Nadal trzeba liczyć -MPOSIX(6 bajtów), ale można zapisać 2 bajty przez upuszczenie nawiasy: $_=strftime"It's %I:%M%P",localtime;. To daje w sumie 54 bajty, co wciąż jest lepsze niż moje 57-bajtowe rozwiązanie POSIX. Dobra robota!
ThisSuitIsBlackNot

Heh, jeszcze raz dziękuję za uratowanie kilku bajtów.
LukStorms,

3

CJam, 40 bajtów

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

"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.".

3

Mathematica 49 90 92 90 84 bajtów

-6 bajtów dzięki user202729

Rozwiązanie w Mathematica jest proste, ale nieco niewygodne.

(d=DateString)@{"It's ","Hour12",":","Minute"}<>(d@"AMPM"/."AM"->"a.m."/."PM"->"p.m‌ .")

(Chociaż ten post jest dość stary) StringReplacemożna wyeliminować, oszczędzając 6 bajtów. (d=DateString)@{"It's ","Hour12",":","Minute"}<>d@"AMPM"/."AM"->"a.m."/."PM"->"p.m."
user202729,

2

T-SQL (2012+), 67 65 bajtów

SQL Server 2012 w końcu dał nam rozsądną funkcję formatowania dat. Nadal jednak musiałem omijać AM / PM, aby uzyskać właściwy format.

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

W poprzednich wersjach potrzebowałby czegoś takiego (93 bajty)

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

2

PHP, 49 bajtów

Gdyby to było am/pmzamiast a.m./p.m....

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

Użyłem wielu nieprzyjemnych bajtów, aby zaoszczędzić trochę długości, więc oto 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;

Wersja do odczytu:

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

2

C, 103 94 bajty

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

Bez golfa

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

2

PHP, 41 bajtów

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

Pierwszy raz w to grałem. Nie jestem pewien, czy mam zaktualizować / edytować poprzednią odpowiedź PHP (49 bajtów), czy po prostu dodać własną ...


Należy zawsze dodać własne. Komentujesz czyjąś odpowiedź tylko wtedy, gdy widzisz coś, co może zaoszczędzić kilka bajtów. Ale poza tym fajna odpowiedź!
Ismael Miguel,

Nawiasem mówiąc, możesz pisać [m=>'.m.'], co oszczędza 2 bajty. (Ostrzeżenia można zignorować, więc nie przejmuj się nimi).
Ismael Miguel

2

SQL (PostgreSQL), 42 41 bajtów

Kolejny wariant SQL, jednak ten jest w zapytaniu.

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

As a note either p.m. or a.m. works to get the am/pm part. The formatting options in PostgreSQL are really quite flexible. Thanks to @manatwork for the tip to move the it's into the format string.

SQLFiddle


So you need to adjust am/pm it manually?
David Arenburg

@DavidArenburg, no it gets it right with either ... but I had to check it out, because it didn't seem right. If you add + time '12:00' after the now() in SQLFiddle it should change the am/pm.
MickyT

1 character shorter: select to_char(now(),'"It''s" HH:MIa.m.')
manatwork

@manatwork, very nice thanks. I wouldn't have thought of trying that.
MickyT

2

CJam, 43 bytes

Having to pad the numbers with zeroes makes this larger than I'd like. In the end, string formatting was the shortest way.

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

Try it online.

Explanation

   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

1
This fails for both the 12's. Instead of 12:37 it outputs 00:37.
Zach Gates

2

Javascript, 103 bytes

Javascript executed from the 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# executed from the immediate window.

?"It's "+System.DateTime.Now.ToString("h:MMt").ToLower()+".m.";

Also runs as F# ;)
Stachu

You don't need to calculate d.length, you could just write -n and it will calculate from the end, just an FYI. d="It's "+new Date().toLocaleTimeString();d.slice(0,-6)+d.slice(-2,-1).toLowerCase()+'.m.' 90 bytes. And you can save one byte by moving the "It's " string. And a few bytes from a little string shortcut in there. d=new Date().toLocaleTimeString();"It's "+d.slice(0,5)+d[9].toLowerCase()+'.m.' 79 bytes.
Jan

And if the answer needs to be locale-independent (as some have posted), just use toLocaleTimeString("en-US") 86 bytes.
Jan

2

Bash, 44 characters

Pure Bash, just shell builtins, no ***utils.

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

Sample run:

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

2

Powershell, 49 bytes

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

(date).hour/23 seems to work as an index for "ap" because it rounds to 0 for hours less than 12 and 1 for 12 and above.


Should be able to golf off a few characters by instead treating the "p"/"a" as string turned into an implicit char-array -- 51 bytes -- "It's $(date -f hh:mm)$("pa"[(date).hour-lt12]).m."
AdmBorkBork

Your latest "{0:hh:mm}$("ap"[($d=date).hour/23]).m."-f$d misses the It's at the beginning. If you tack that onto the front, it's the same 49 bytes as "It's $((date -f hh:mm)+"ap"[(date).hour/23]).m."
AdmBorkBork

My bad. I've fixed it. Anyway, this version is more "correct", as it only makes a single call to date
Danko Durbić

For what it's worth, I stumbled across the following while researching something else. Apparently [datetime] casts are always en-US. That means something like this "It's $(("{0:h:mmt}"-f[datetime](date)).ToLower()).m." is possible ... which, granted, is 54 bytes and longer than your current solution, but still an interesting quirk of the language.
AdmBorkBork

@TimmyD Interesting, but it seems it's only casting to DateTime that's en-US, not formatting.
Danko Durbić

2

Locale-dependent

For browser environments that have the locale set to en-CA or any locale that outputs a 12-hour time by default:

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.")

Locale-independent

CoffeeScript, 113 96 bytes

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

Previous:

This one works in all browser environments regardless of locale. Requires Chrome 24+, Firefox 29+, IE 11+, Opera 15+ or any derivatives of such. Does not work in Safari. See Intl.DateTimeFormat.

alert "It's #{new Intl.DateTimeFormat('en',{hour:f='2-digit',minute:f}).format(new Date).toLowerCase()[..-2]}.m."

The javascript answer gave me: It's 2:59: m.m.
Mwr247

@Mwr247 Which locale is your browser in?
rink.attendant.6

@rinkattendant6 My locale is en-US
Mwr247

2

Swift - 124 102 bytes

import Cocoa
var f=NSDateFormatter()
f.dateFormat="hh:mma"
print("It's \(f.stringFromDate(NSDate()))")

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');}

In contrast to the other C answer, this one uses the correct "a.m."/"p.m." format. The other poster omitted #include <time.h> – if your compiler allows this, we get down to 136 bytes. Which one should we count?


You're right, in fact all I got was a warning – I got it confused with an error from trying to do without time.h. Editing.
mindriot

1

Moonscript - 56 bytes

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

Unfortunately the Lua standard library only implements %p for uppercase AM/PM, so I have to call the method lower.


1

SpecBAS - 64 bytes

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

The built-in p$ of the time function returns AM or PM, so this then has to be formatted with REPLACE$ to change it so it has a full stop before/after that letter.

Then the time output had to be converted to lowercase.


1

MATLAB, 66 bytes

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

Displays:

It's 2:48p.m.

1

Python 2, 75 67 66 bytes

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

old version, 75 bytes

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

old version, 75 bytes

import time
print"It's",time.strftime("%I:%M%p").lower().replace("m",".m.")

@AlexA. Not working in Python 2 time.strftime at least under windows gives "ValueError: Invalid format string"
Max

@AlexA Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import time;print"It's %s.m."%time.strftime("%I:%M%p")[:6].lower() It's 01:30p.m.`
Max

1

Python 3, 117 87 79 bytes

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

This gets the hours and minutes from a 12-hour clock using the format %I:%M, plus am or pm using %P. We then select everything but the last m and append .m..

Saved a few bytes thanks to Ruth Franklin!


1
As you're only using datetime once, it's 6 bytes shorter to use from datetime import*; h=datetime.now() ...
Ruth Franklin

@RuthFranklin Thanks for the suggestion! I also found a few other ways to shorten it.
Alex A.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.