Час, хлопче?


18

Я, чесно кажучи, не можу повірити, що це ще не питання щодо Code Golf, але ....

Роздрукуйте місцевий час (з ранку чи вечора) як рядок до консолі, перед яким "Це".

Приклад:

Run code....

Вихід:

It's 12:32p.m.

Найкоротший код виграє.

Код геть!

Таблиця лідерів


1
Який вихідний формат? Це важливо?
mbomb007

1
Ні, я маю на увазі, чи має бути, yyyy-MM-dd hh:mm:ss UTCчи не має значення формат дати?
mbomb007

8
Мені дуже хотілося викласти відповідь, яка друкує It's beer o'clock, але я протистояла.
MickyT

4
Чи можемо ми використовувати 12:32 PMабо 12:32PM? Замість 12:32p.m.?
Стюі Гріффін

3
Це 02:32 чи 2:32, якщо це менше 10:00?
Стюі Гріффін

Відповіді:


18

Баш, 39 33 байт

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

Витратили купу символів, оскільки специфікація вимагає a.m.або p.m.поки dateвиводить amабо pm. Дякуємо @DigitalTrauma за економію 6 байт!

Це може бути не дуже портативно. Він працює на Ubuntu 15.04.

Рішення, яке використовує по суті той самий метод у Ruby , який напрочуд точно такої ж довжини :

Рубін, 39 байт

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

%Pдає мені великі регіони AM або PM. Я на mac, якщо це має значення.
флодель

@flodel працює на моїй машині ™. У Ubuntu 15.04 %Pнадає малі літери та %pнадає великі регістри (що трохи ... неінтуїтивно).
Дверна ручка

GNU date(на Linux та ін.) Та * BSD date(де OSX - один варіант BSD) мають надзвичайно різні варіанти та поведінку, коли ви заходите за межі набору функцій, визначених POSIX. Тому, можливо, ця відповідь повинна спеціально згадувати Bash в Linux. (Це sedтеж стосується , але саме ця виклик міцно входить у безпечний та портативний набір функцій.)
tripleee

На моїй машині (zsh або bash на Linux) він друкує "Це 04:17". коли час 16:17. Ні «я», ні «вечора»
aditsu

echo -e "It's $(date +%I:%M%P)\b.m."- замість sedвикористовує зворотну простір. Це не схоже на окрему відповідь для мене. Крім того, у мене немає жодної ам / вечора, але я думаю, що це через локаль.
aragaer

13

AppleScript, 198

Тому що AppleScript. Тому що ні:

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

Це було боляче.


18
AppleScript - це нова Java.
Дверна ручка

8

PHP, 35 33 байт

Використання неправильного інструменту для роботи!

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

Він просто видаляє mв кінці amабо pm, щоб додати крапки. Дата настає як з 00:00am, так і зtrim нею стає 00:00a.


Стара відповідь (лише для PHP 5.4+):

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

Це працює, тому що ви можете скасувати посилання на значення, повернене з функції. Це неможливо в PHP5.3 або старіших версіях.


Ах, розумний! Ви перемогли мою відповідь на php
DankMemes

@DankMemes Це зайняло у мене досить багато часу. І багато експериментує.
Ісмаїл Мігель

Ви використовували рядковий літерал без лапок. Чи добре використовувати ті, що не мають @оператора, і припускати, що люди будуть керувати ним error_reporting(0)?
DankMemes

@DankMemes Можна опосередковано припустити, що повідомлення про помилки вимкнено. Ось добре читайте: meta.codegolf.stackexchange.com/a/1655/14732
Ісмаїл Мігель

5

Visual Basic 6 / VBA, 42 41 байт

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

Використовуючи MsgBox, оскільки VB6 не має консолі (якщо ви не перехоплюєте посилання, посилаєтесь як виконуваний консоль, використовуйте деякі хаки для Windows API та виконайте деякі інші хитрі речі).


3
Чому б вам не просто замінити mна .m.? тобто Debug.Print Replace(Format(Now,"hh:mm am/pm"),"m",".m.")
CompuChip

Приємно @toothbrush, я начебто очікував, що це буде однобайтове рішення в CJam;)
CompuChip

4

R, 68 , 59 62 60 55

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

(Спасибі @ Alex.A. І @flodel для коментарів) приймає поточний системний час ( Sys.time()), форматує його правильно , використовуючи %I:%M%Pкомбінацію, додає точку в кінці, і замінює mз .m..


4

Юлія, 74 54 43 байт

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

Ви можете спробувати онлайн !

time()Функція повертає поточний час. Якщо перейти до strftimeформату %I:%M%P, це призводить до того HH:MMam/pm, де години перебувають на 12-годинний годинник. Ми створюємо резервну копію одного символу, \bщоб видалити m, залишаючи кінець aабо p, а потім торкнутись .m.до кінця.

Збережено 31 байт завдяки Glen O!


Чи можу я це запропонувати? print("It's ",strftime("%r%P",time())[[1:5,12]],".m.")- використовує %Pдля додавання маленьких am / pm, щоб уникнути порівняння та розділення команди.
Glen O

Немає проблем щодо допомоги. І не кажіть себе - у вас все добре. Я просто отримую насолоду від спроб видавити з коду кожен останній байт. У цьому випадку я просто зрозумів, що спроба обійти розділену команду та умовне твердження буде корисною, а потім перейшов до розглянутих вами функцій. Я, мабуть, не знайшов би себе стриллінг (я б намагався витягнути час безпосередньо з time())
Glen O

1
@GlenO Якщо ви отримуєте задоволення від видавлювання кожного останнього байту з коду, PPCG, безумовно, є правильним місцем для вас!
Олексій А.

Між іншим, я знайшов спосіб видавити ще кілька байт:print(strftime("It's %I:%M%P",time())[1:11],".m.")
Glen O

Насправді, ще краще:print(strftime("It's %I:%M%P\b.m.",time()))
Glen O

3

Haskell, 135 байт

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

Я знайшов набагато кумедніше, mainщо на п’ять байт довше:

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

Або 66 байт в Unix:

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

3

Pyth, 38 36 байт

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

Збережено 2 байти завдяки @Jakube!


@ Sp3000 На веб-перекладачі чи локально?
kirbyfan64sos

@ Sp3000 Я думаю, що я знаю проблему. Це дає час розташування сервера Pyth, і я не обробляю опівночі правильно. Тримайся ...
kirbyfan64sos

@ Sp3000 Виправлено !!!
kirbyfan64sos

Ви майже б'єте мою відповідь PHP та відповідь Bash Doorknob!
Ісмаїл Мігель

3

MATLAB, 59 байт

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

Час о 05:38.

Якщо дозволено мати пробіл між часом та am / pm, то він може становити 52 байти :

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

Це 17:39 вечора


Я думаю, вихід повинен бути05:38p.m.
Ісмаель Мігель

Відповідно до коментаря ОП, провідний нуль не має значення.
slvrbld

Ти маєш рацію. Ось, піднесіть мою пропозицію!
Ісмаїл Мігель

Приємно! Я не знав, що я можу так використати \b... Вам потрібен додатковий простір BTW.
Стюі Гріффін

3

Perl 5,10+, 58 62 байт

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

Потрібно запустити -M5.010прапор командного рядка, щоб отримати say.

У своєму оригінальному рішенні (а саме, 00:**і 12:**) я не брав до уваги пару крайових випадків ; фіксується вартістю 4 додаткових байтів.

Як це працює

У скалярному контексті localtimeповертає такий рядок:

Sat Sep 12 03:13:22 2015

Поле хвилин уже заповнене нулем, що зберігає деякі байти (у контексті списку localtimeповертає числа замість рядків, тому вам доведеться самостійно прокладати їх).

Ось це невольф:

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 байт

(Просто для розваги, оскільки вона трохи розтягує правила.)

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

51 байт + 6 байт для -MPOSIX. Також потрібно запустити -M5.010прапор командного рядка, щоб отримати say.

Це рішення залежить від вашої мови, тому працюватиме не у всіх системах. Він також використовує модуль POSIX, який, можливо, розтягує визначення "вбудованого", навіть якщо це основний модуль.

Perl 5.14+ необхідний для неруйнівного rмодифікатора для оператора заміни. Еквівалентне рішення, яке працює на версії 5.10 і більше:

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

Це також 57 байт (51 байт + 6 байт за -MPOSIX).


3

Perl 5, 74 байти

Невелика демонстрація того, як оцінюються змінні справа наліво.

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

Використання POSIX: 80 байт

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

Використання POSIX із залежністю від локальної залежності та перемикачами: 54 байти (48 + 6)

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

Тест

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

1
Ви можете зберегти кілька байтів у своїх рішеннях POSIX, використовуючи -MPOSIXзамість цього use POSIX;, відмовляючись від паролів у вашому дзвінку strftimeта замінивши printна say( -M5.010безкоштовно ). Це зводить ваше останнє рішення до 54 байт!
ThisSuitIsBlackNot

Спасибі. Я використав вашу пораду для найкоротшого рішення POSIX.
LukStorms

1
Ви все ще повинні розраховувати -MPOSIX(6 байт), але ви можете зберегти 2 байти, знижуючи дужки: $_=strftime"It's %I:%M%P",localtime;. Це дає 54 байти загалом, що все-таки краще, ніж моє 57-байтне рішення POSIX. Молодці!
ThisSuitIsBlackNot

Heh, thanks again for rescuing a few bytes.
LukStorms

3

CJam, 40 bytes

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

Try it online in the CJam interpreter.

How it works

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

-6 bytes thanks to user202729

The solution is straightforward, but a bit wordy, in Mathematica.

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

(Although this post is quite old) StringReplace can be eliminated, save 6 bytes. (d=DateString)@{"It's ","Hour12",":","Minute"}<>d@"AMPM"/."AM"->"a.m."/."PM"->"p.m."
user202729

2

T-SQL (2012+), 67 65 bytes

SQL Server 2012 finally gave us a reasonable formatting function for dates. I still had to muck around with the AM/PM to get the format right though.

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

In previous versions it would have needed something like this (93 bytes)

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

2

PHP, 49 bytes

If only it were am/pm instead of a.m./p.m....

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

I used a lot of nasty bytes to save a bit of length so here's the 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;

Readable version:

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

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

2

PHP, 41 bytes

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

First time I've played this. Not sure if I'm supposed to update/edit the previous PHP answer (49 bytes) or just add my own...


You should always add your own. You only comment on someone's answer if you see something that can save them a few bytes. But other than that, nice answer!
Ismael Miguel

By the way, you can write [m=>'.m.'], which saves 2 bytes. (Warnings can be ignored, so, don't worry about them.)
Ismael Miguel

2

SQL (PostgreSQL), 42 41 bytes

Another SQL variant, however this one is in a query.

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

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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.