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


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!


@ 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


Я думаю, что выходной должен быть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).


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

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

(Хотя этот пост довольно старый) 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,'.'))+'.'

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

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

2

PHP, 41 байт

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

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


Вы должны всегда добавлять свои собственные. Вы только комментируете чей-то ответ, если видите что-то, что может сэкономить ему несколько байтов. Но кроме этого, хороший ответ!
Исмаэль Мигель

Кстати, вы можете написать [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


Таким образом, вам нужно настроить 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.";

Также работает как 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.

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

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

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 байтов. Кого мы должны считать?


Вы правы, на самом деле все, что я получил, было предупреждением - меня перепутали с ошибкой от попыток обойтись без 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

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 Спасибо за предложение! Я также нашел несколько других способов сократить его.
Алекс А.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.