Сколько времени, парень?

18

Я, честно говоря, не могу поверить, что это еще не вопрос о Code Golf, но ....

Вывести местное время (с am или pm) в виде строки на консоль, перед которой стоит «It's».

Пример:

Run code....

Выход:

It's 12:32p.m.

Самый короткий код выигрывает.

Код прочь!

Leaderboard

Даниил
источник
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
@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использования Backspace. Не похоже на отдельный ответ для меня. Кроме того, у меня нет am / pm, но я думаю, что это из-за локали.
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

Р, 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, чтобы избежать сравнения и команды split.
Глен О
Нет проблем в отношении помощи. И не отговаривайся - у тебя все хорошо. Я просто получаю удовольствие от попытки выжать каждый последний байт из кода. В этом случае я просто подумал, что попытка обойти команду split и условное выражение было бы полезно, а затем перешел к функциям, которые вы использовали. Я бы, наверное, сам не нашел время (я бы попытался извлечь время прямо из него time())
Глен О
1
@GlenO Если вы получаете удовольствие от сжатия каждого последнего байта кода, PPCG, безусловно, является подходящим местом для вас!
Алекс А.
Между прочим, я нашел способ выжать еще несколько байтов:print(strftime("It's %I:%M%P",time())[1:11],".m.")
Глен О
На самом деле, даже лучше:print(strftime("It's %I:%M%P\b.m.",time()))
Глен 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!

kirbyfan64sos
источник
@ 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'))))

Сейчас 5:38 вечера.

Если разрешено иметь пробел между временем и часами / часами, тогда это может быть всего 52 байта :

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

Сейчас 5:39

slvrbld
источник
Я думаю, что выходной должен быть05:38p.m.
Исмаэль Мигель
Согласно комментарию ОП, ведущий ноль не имеет значения.
slvrbld
Ты прав. Вот, возьми мой голос!
Исмаэль Мигель
Ницца! Не знал, что я мог бы использовать \bэто так ... Вам нужно дополнительное пространство между прочим.
Стьюи Гриффин
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).

ThisSuitIsBlackNot
источник
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.
LukStorms
источник
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
Хех, еще раз спасибо за спасение нескольких байтов.
LukStorms
3

CJam, 40 байтов

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

Попробуйте онлайн в интерпретаторе CJam .

Как это устроено

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

-6 байт благодаря пользователю 202729

Решение простое, но немного многословное, в Mathematica.

(d=DateString)@{"It's ","Hour12",":","Minute"}<>(d@"AMPM"/."AM"->"a.m."/."PM"->"p.m‌ .")
DavidC
источник
(Хотя этот пост довольно старый) StringReplaceможно удалить, сохраняя 6 байт. (d=DateString)@{"It's ","Hour12",":","Minute"}<>d@"AMPM"/."AM"->"a.m."/."PM"->"p.m."
user202729
2

T-SQL (2012+), 67 65 байт

SQL Server 2012 наконец-то дал нам разумную функцию форматирования дат. Мне все еще приходилось возиться с AM / PM, чтобы получить правильный формат.

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

В предыдущих версиях нужно было что-то вроде этого (93 байта)

PRINT'It''s'+LOWER(STUFF(STUFF(RIGHT(CONVERT(VARCHAR,GETDATE(),109),15),6,7,''),8,0,'.'))+'.'
MickyT
источник
2

PHP, 49 байт

Если бы только это было am/pmвместо a.m./p.m....

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

Я использовал много неприятных байтов, чтобы сэкономить немного длины, поэтому вот гекс:

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;

Читаемая версия:

It's <?=preg_replace("/[amp]/", "$0.", date("g:ia"));
DankMemes
источник
2

C 103 94 байта

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
источник
2

PHP, 41 байт

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

Впервые я играл в это. Не уверен, если я должен обновить / отредактировать предыдущий ответ PHP (49 байт) или просто добавить свой собственный ...

fisharebest
источник
Вы должны всегда добавлять свои собственные. Вы только комментируете чей-то ответ, если видите что-то, что может сэкономить ему несколько байтов. Но кроме этого, хороший ответ!
Исмаэль Мигель
Кстати, вы можете написать [m=>'.m.'], что экономит 2 байта. (Предупреждения можно игнорировать, поэтому не беспокойтесь о них.)
Исмаэль Мигель
2

SQL (PostgreSQL), 42 41 байт

Другой вариант SQL, но этот в запросе.

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

Как примечание, или pm или am работает, чтобы получить часть am / pm. Параметры форматирования в PostgreSQL действительно довольно гибкие. Спасибо @manatwork за подсказку по перемещению it'sв строку формата.

SQLFiddle

MickyT
источник
Таким образом, вам нужно настроить AM / PM это вручную?
Дэвид Аренбург
@ Давид Аренбург, нет, он тоже все делает правильно ... но я должен был проверить это, потому что это не казалось правильным. Если вы добавите + time '12:00'после now()SQLFiddle, он должен изменить am / pm.
MickyT
На 1 символ короче:select to_char(now(),'"It''s" HH:MIa.m.')
manatwork
@ Manatwork, очень приятно, спасибо. Я бы не подумал попробовать это.
MickyT
2

CJam, 43 байта

Необходимость дополнить числа нулями делает это больше, чем хотелось бы. В конце концов, форматирование строк было самым коротким способом.

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

Попробуйте онлайн .

объяснение

   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
Это терпит неудачу для обоих 12-х. Вместо 12:37этого выводит 00:37.
Зак Гейтс
2

Javascript, 103 байта

Javascript выполняется из консоли.

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

C #, 63 байта

C # выполняется из непосредственного окна.

?"It's "+System.DateTime.Now.ToString("h:MMt").ToLower()+".m.";
DaveMorganTexas
источник
Также работает как F #;)
Stachu
Вам не нужно рассчитывать d.length, вы можете просто написать, -nи он будет рассчитывать с конца, просто к вашему сведению. d="It's "+new Date().toLocaleTimeString();d.slice(0,-6)+d.slice(-2,-1).toLowerCase()+'.m.'90 байтов. И вы можете сохранить один байт, перемещая "It's "строку. И несколько байтов от маленького ярлыка строки там. d=new Date().toLocaleTimeString();"It's "+d.slice(0,5)+d[9].toLowerCase()+'.m.'79 байтов.
января
И если ответ должен быть независимым от локали (как некоторые опубликовали), просто используйте toLocaleTimeString("en-US")86 байтов.
января
2

Баш, 44 персонажа

Чистый Bash, просто встроенные оболочки, никаких *** утилит.

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

Образец прогона:

bash-4.3$ printf -vt "It's %(%I:%M%P)T";echo ${t%m}.m.
It's 01:04p.m.
manatwork
источник
2

Powershell, 49 байт

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

(date).hour/23кажется, работает как индекс для, "ap"потому что он округляется до 0часов меньше 12 и 1для 12 и выше.

Данко Дурбич
источник
Должно быть в состоянии отыграть несколько символов, вместо этого трактуя «p» / «a» как строку, превращенную в неявный массив символов - 51 байт -"It's $(date -f hh:mm)$("pa"[(date).hour-lt12]).m."
AdmBorkBork
Ваш последний "{0:hh:mm}$("ap"[($d=date).hour/23]).m."-f$dпропускает It's в начале. Если вы добавите это к передней части, это те же 49 байтов, что и"It's $((date -f hh:mm)+"ap"[(date).hour/23]).m."
AdmBorkBork
Виноват. Я исправил это. Во всяком случае, эта версия более «правильная», так как она делает только один вызовdate
Данко Дурбич
Что бы это ни стоило, я наткнулся на следующее, исследуя что-то еще. По-видимому[datetime] актеры всегда в США . Это означает, что что-то вроде этого "It's $(("{0:h:mmt}"-f[datetime](date)).ToLower()).m."возможно ... что, конечно, на 54 байта и длиннее, чем ваше текущее решение, но все же интересная особенность языка.
AdmBorkBork
@TimmyD Интересно, но кажется, что это только приведение к DateTime , это en-US, а не форматирование.
Данко Дурбич,
2

Локальнозависимый

Для сред браузера, для которых установлен языковой стандарт en-CAили любой языковой стандарт с 12-часовым временем по умолчанию:

CoffeeScript, 81 байт

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

JavaScript (ES5), 90 байт

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

Locale-независимый

CoffeeScript, 113 96 байт

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

Предыдущая:

Этот работает во всех браузерах независимо от локали. Требуется Chrome 24+, Firefox 29+, IE 11+, Opera 15+ или любые их производные. Не работает в Safari. ВидетьIntl.DateTimeFormat .

alert "It's #{new Intl.DateTimeFormat('en',{hour:f='2-digit',minute:f}).format(new Date).toLowerCase()[..-2]}.m."
rink.attendant.6
источник
Javascript ответ дал мне:It's 2:59: m.m.
Mwr247
@ Mwr247 В какой локали ваш браузер?
rink.attendant.6
@ rinkattendant6 Моя локальen-US
Mwr247,
2

Swift - 124 102 байта

import Cocoa
var f=NSDateFormatter()
f.dateFormat="hh:mma"
print("It's \(f.stringFromDate(NSDate()))")
Błażej
источник
2

C 154 байта

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

В отличие от другого ответа C, этот использует правильный формат «am» / «pm». Другой постер пропущен #include <time.h>- если ваш компилятор позволяет это, мы получаем 136 байтов. Кого мы должны считать?

mindriot
источник
Вы правы, на самом деле все, что я получил, было предупреждением - меня перепутали с ошибкой от попыток обойтись без time.h. Редактирование.
Миндриот
1

Moonscript - 56 байт

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

К сожалению, стандартная библиотека Lua реализует только% p для прописных букв AM / PM, поэтому я должен вызывать метод более низкий.

Райан Рассел
источник
1

SpecBAS - 64 байта

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

Встроенная p$функция времени возвращает AM или PM, поэтому ее необходимо отформатировать, REPLACE$чтобы изменить, чтобы она имела полную остановку до / после этой буквы.

Затем вывод времени пришлось преобразовать в строчные.

Брайан
источник
1

MATLAB, 66 байт

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

Вывод:

It's 2:48p.m.
Стьюи Гриффин
источник
1

Python 2, 75 67 66 байт

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

старая версия, 75 байт

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

старая версия, 75 байт

import time
print"It's",time.strftime("%I:%M%p").lower().replace("m",".m.")
Максимум
источник
@AlexA. Не работает в Python 2 time.strftime по крайней мере под окнами дает «ValueError: Неверная строка формата»
Макс
@AlexA Python 2.7.10 (по умолчанию, 23 мая 2015 г., 09:40:32) [MSC v.1500 32 бит (Intel)] на win32 Введите «помощь», «авторское право», «кредиты» или «лицензия» для получения дополнительной информации. Информация. >>> время импорта; выведите «It's% sm»% time.strftime («% I:% M% p») [: 6] .lower () Сейчас 01:30 вечера.
Макс.
1

Python 3, 117 87 79 байтов

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

Это получает часы и минуты от 12-часовых часов, используя формат %I:%M, плюс amили pmиспользуя %P. Затем мы выбираем все, кроме последнегоm и добавляем .m..

Сохранено несколько байтов благодаря Рут Франклин!

Алекс А.
источник
1
Поскольку вы используете только datetimeодин раз, он на 6 байт корочеfrom datetime import*; h=datetime.now() ...
Рут Франклин
@RuthFranklin Спасибо за предложение! Я также нашел несколько других способов сократить его.
Алекс А.