Удивительно, но эта простая задача, кажется, еще не существует, так что ...
Ваша задача - написать программу, которая использует в качестве входных данных 12-часовое время и преобразует его в «военное время» или 24-часовой формат времени.
Вход будет в форме:
HH:MM am/pm
Хотя допускаются небольшие вариации:
Пробел, отделяющий am / pm от остального времени, не является обязательным.
Последняя часть может быть "am" / "pm" или "a" / "p".
Любая капитализация в порядке.
На выходе будет введено время, преобразованное в 24-часовой формат. Это может быть число или строка.
Для ввода и вывода:
0 в первую очередь необязательны. 0 в последних 3 местах являются обязательными.
разделитель между часами и минутами может быть «:», «» (пробел) или ничего.
Другие заметки:
Полночь может быть выражена как 0000 или 2400.
Полночь будет считаться «утра», а полдень будет считаться «вечера».
Ваша программа может быть функцией или полной программой и должна либо возвращать результат, либо выводить его на стандартный вывод. Конечный пробел в порядке.
Примеры (вы не обязаны поддерживать каждый формат):
12:00am -> 0000
1200 pm -> 1200
1234Am -> 00:34
134a -> 134
01:34PM -> 13 34
1234pm -> 1234
Это код гольф, поэтому выигрывает наименьшее количество байтов. Поскольку это так тривиально, чтобы решить с помощью встроенного, было бы неплохо увидеть некоторый код, который решает это вручную (но использование встроенных модулей хорошо).
Просто чтобы уточнить, вы не обязаны поддерживать все возможные форматы. Хорошо поддерживать только один вход и один выходной формат (на ваш выбор). Однако я хотел бы ограничить формат, как описано выше (который уже довольно бесплатный). {1134,'pm'}
, например, было бы неприемлемо.
01:54pm
будет работать, но1:54pm
не будет?Ответы:
V ,
2117 байтСпасибо @DJMcMayhem за 4 байта!
Попробуйте онлайн! Это берет формат
HH:MMx
гдеx
либоa
илиp
, и возвращает его в форматеHH:MM
HexDump:
Объяснение:
источник
[1-12]
порядке? В этом случае, я думаю, вы могли бы сделатьó^12/0
вместоcw^R=^R"%12
çp/12^A
что эквивалентно:g/p/norm 12<C-a>
в vimMATL , 4 байта
Попробуйте онлайн!
объяснение
Встроенная функция: преобразование строки даты с автоматическим определением формата ввода и с форматом вывода
15
, который соответствует'HH:MM'
. Это эквивалентно октавскому ответу @ StewieGriffin .источник
Октава,
2117 байтСохранено 4 байта благодаря Луису Мендо. Я мог бы указать формат № 15 вместо
'HHMM'
.Объяснение:
Это анонимная функция принимает строку в
c
качестве входных данных в формате:'11:34 AM'
.datestr
автоматически распознает формат как один из стандартных форматов даты и выводит его в указанном формате с номером 15, то естьHH:MM
.Поскольку указанный формат вывода не имеет
AM
илиPM
Octave автоматически преобразует его в то, что вы называете военным временем.Попробуйте онлайн.
Версия, не
datestr
использующая 35 байтОбъяснение:
Принимает входную строку
c
в формате1134am
.Или другой подход для 37 байтов:
источник
PowerShell ,
232019 байтПопробуйте онлайн!
(Если вы работаете в Windows, вы можете опустить
get-
, чтобы уменьшить до 19 байт. В TIO, очевидно, требуется полноеGet-Date
имя.)Принимает входные данные в виде строки
$args[0]
, использует их в качестве входных данных дляGet-Date
командлета, который анализирует его вdatetime
объект .NET . Это прошло с-f
параметром ormat,HHmm
чтобы преобразовать его в военное время (прописнаяHH
указывает 24-часовое время). Вывод неявный.Механизм разбора довольно надежный, поэтому дополнительные входы, такие как
12am
или12:00am
разрешены. Поиграйте с входом на TIO и посмотрите, что еще работает.( Сохранено 3 байта благодаря @admalledd ... сохранено еще один байт благодаря @briantist )
источник
$args[0]
и-f
, а также удалить одинарные кавычки ул формата:date $args[0]-f HHmm
. По крайней мере, это работает на моемGet-Date
с-f
кем-то, кто-то напоминал мне, что вам не нужны цитаты. И хороший вызов с удалением пробела тоже, так как синтаксический анализатор рассматривает]
как конец токена. Благодарность!Python 2, 44 байта
Формат ввода:,
01:23am
необязательныйm
и пробелы после минутФормат вывода:
123
источник
Pyth,
2120 байтПринимает ввод формы
01 23a
как «01:23 утра». Начальный 0 не является обязательным.Вывод имеет вид
123
, с начальным 0 опущен.В псевдокоде:
Попробуйте онлайн!
источник
PHP,
3532 байтаФормат ввода: без учета регистра, требует двоеточия и
m
, формат выводаhhmm
. использует встроенные модули:принимает входные данные из первого аргумента командной строки.
PHP, 45 байт, без встроенных модулей
формат ввода
(h)h:mm a(m)
строчные, формат вывода(h)hmm
.источник
JavaScript (ES6), 40 байт
Ввод должен быть отформатирован так:
12:32 am
источник
GNU Coreutils (
1816 байт)Из сценария оболочки:
Не принимает пробелы во входных данных
В этот момент можно также использовать $ 1 и игнорировать дополнительные аргументы.
оригинал
Чтобы разрешить пробелы в вводе,
источник
C #, 46 байт
Строки принимаются во входных данных, как
12:00 AM
Выполнение того же действия, но подстановка выходных данных из вызова по умолчанию
ToString
(при условии использования культурыen-GB
), на 3 байта длиннее для 49 байтов:источник
date
, 0 + 8 = 8 байтНа предмет использования правильного инструмента для работы…
Принимает ввод в качестве аргумента командной строки. Выполнить с
+%H%M -d
(штраф 8 байт). Здесь нет настоящей программы; вся работа выполняется аргументами командной строки. (Это довольно хорошая демонстрация почему существует штраф за аргументы командной строки!)Пример:
источник
Java 7,
138106105104 байтаПопробуйте онлайн!
Входные данные разделены двоеточием и имеют пробел между временем и часами / часами. Выходные данные не разделены двоеточием.
-1 байт благодаря Кевину Круйссену
источник
HHmm
наHmm
.Japt , 14 байт
Попробуйте онлайн!
Это работает только на Chrome. Вот версия, которая работает во всех браузерах:
Еще раз спасибо ETHproductions за помощь!
источник
Perl,
452837байт2837 байт(з / о @ Дада)
(36 байт кода, 1 байт для
-p
переключения компилятора )Принимает
0145pm
форматы типа, с am / pm или a / p. Требуются начальные нули на входах.Тест:
Мой оригинальный ответ
(также аккуратно пересмотрено)
(39-байтовый код, 1 байт для
-p
переключения компилятора .)Принимает только форму, такую как 0145p или 0145a, и никакую другую, и требует
perl -p
режима для работы.тест:
источник
-p
требуется только ), если вы измените одинарные кавычки для двойных кавычек.s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1
(37 байт). И, между прочим, ваше первое решение может быть немного проигнорировано:s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e
(40 байт)Commodore 64 BASIC, 301 байт перед запуском, 321 байт используется после запуска
Для того, чтобы ввести это на реальном Commodore 64, вам нужно будет использовать сокращенные ключевые слова BASIC, такие как LE [shift] F для
LEFT$
, M [shift] I для иMID$
т. Д ... или вы можете попробовать CBM PRG STUDIO.TI$
Переменной в Commodore BASIC представляет время в 24 - часовом формате , как HHMMSS при печати. Удаление пробела после номера строки не экономит память, так как Commodore BASIC все равно автоматически добавляет пробел, когда вы перечисляете программу после ее ввода.При преобразовании числа в строку с помощью
STR$
Commodore BASIC добавит пробел (поэтому, если выPRINT A
увидите пробел до того, как число будет показано), я удалил пробел в преобразовании числа в строку с помощьюRIGHT$
команды. Вы можете сохранить несколько байтов, изменив нулевую строку до:поэтому перед запуском программы вам нужно будет указать время конвертации:
В любой момент после этого вы можете увидеть текущее время с помощью:
источник
Java, 171 байт
Формат ввода
HH:MM a/p
и выходной форматHHMM
. Злоупотребление тем фактом, что основная функция имеет массив строк для разделения ввода на 3 секции: часы, минуты и индикатор a / p.Пример ввода и вывода:
Безголовая версия:
источник
enum
чтобы держатьmain
. Приятно :)REXX, 33 байта
Использование:
Это может быть сокращено на несколько байтов, если двоеточие в качестве разделителя не используется.
источник
C (лязг) , 94 байта
Попробуйте онлайн!
Я здесь, чтобы учиться, поэтому любые советы о том, как я могу оптимизировать код, приветствуются.
@ Johan du Toit Спасибо за сохранение нескольких байтов!
источник
printf("%02d:%02d", (a=='p' ? 12 : 0) + (h %12), m);
C,
8772 байтаСохранено 15 байтов благодаря @Johan du Toit
Вызов
f()
с изменяемой строкой в качестве аргумента, входные данные являются выходными.Формат:
HH:MMa/p
гдеa/p
нижнийa
или нижний регистрp
. Пробел между временем и спецификатором меридиана не допускается.Попробуйте это на Ideone .
источник
i;f(char*p){i=atoi(p)%12+(p[5]^97?12:0);*p=i/10+48;p[1]=i%10+48;p[5]=0;}
(p[5]!=97)*12;
вместо(p[5]^97?12:0);
tcl, 45
47Теперь с помощью встроенного:
Тестируется на http://rextester.com/TSRXI8802, где есть скрипт, который запускает его с 01:00 до 1259.
источник
SmileBASIC, 67 байт
Входные данные:
HH:MMa/p
Выход:
HH MM
источник
R, 68 байт
Читает ввод из stdin, и предполагается, что он имеет один из следующих форматов:
12:00 AM
12:00 am
12:00AM
12:00am
и вывод в формате:
[1] "00:00"
В большинстве случаев
strptime()
вывод в формате:"2017-01-06 12:00:00 CET"
где дата является локальной датой. Как таковой, мы должны использоватьsubstr()
его только для возврата времени, однако, если ввод - полночь (например,12:00am
выход - только то,"2017-01-06 CET"
что является причиной дляif
вещи в конце (должен быть какой-то более умный обходной путь).источник
lubridate
, но название пакета слишком длинное (среди других проблем).C
159152 байтаФормат ввода:
07:30am
источник
Пайк, 15 байт
Попробуй это здесь!
источник
Mathematica, 33 байта
Анонимная функция. Принимает строку в качестве ввода и возвращает строку в качестве вывода. Работает с большинством форматов, в том числе
hh:mm AM/PM
.источник
JavaScript, 67 байт
Ввод как в примере
источник
12:00 am
или12:00 pm
Хаскель, 61 персонаж
Укороченная версия:
Формат ввода:
HHMM(a/p)
где(a/p)
'a' или 'p' без круглых скобок.Выходной формат:
(hs, MM)
- кортеж, содержащий часы в виде целого числа и MM в виде строки.Пример:
Более длинная версия (с более полезными именами и одной заменой
hs
):источник
Common Lisp (
151122 байт)Хорошо, CL не должен быть «кратким», но я просто удивлен, что он не самый многословный для этого.
Вот 122-байтовая версия, которая требует ввода в фиксированной позиции.
0145pm
или145p
являются приемлемыми (с пробелом в первой позиции символа).PPRINT:
Лучше, но больше
Используя только
Common-Lisp
пакет. Принимает (только) ввод в виде целочисленных часов (с или без начального0
), литерала:
, двухзначных минут и дополнительного трейлингаam
илиpm
(только в нижнем регистре). Разрешает пробелы во времени и вокруг AM / PM, но не сразу после:
.Тест:
pprint
определение функции:Де-затемненный:
источник
Сетчатка ,
6160 байтВходные данные даны без разделительного двоеточия, обязательного начала
0
и использования толькоa
илиp
вместоam
илиpm
, например0134a
, 01:34. Выводит по прямому военному времени, используя 0000 как полночь. (Я мог бы сохранить несколько байтов, если мне разрешено конвертировать, например, в 12:30 в2430
, но я сомневаюсь, что это приемлемо).Попробуйте онлайн!
объяснение
Первые два случая имеют дело с «12» часами, так как am / pm меняется на 12:
Если время между полуночью (12:00) и 1:00, измените ее на 00 вместо 12 и удалите
a
.Если время между 12:00 и 13:00, уберите p, чтобы просто получить 24-часовое время.
За любой другой час:
Если время утра, просто удалите,
a
чтобы получить 24 часа.Если время вечера, удалите
p
. Преобразовать компонент часа в унарный, добавить 12 и преобразовать обратно в десятичную. Оставьте минуты без изменений.источник
Пакет, 40 байт
Принимает ввод как три аргумента. Предполагается, что второй аргумент имеет ведущий ноль в случае необходимости, третий аргумент либо либо,
a
либоp
. Работает, обрабатывая третий аргумент как имя косвенной переменной, добавляя его к числу часов; количество минут не изменяется, поэтому выводится напрямую. Если смешивание разных форматов в порядке, то последний пробел может быть удален для сохранения байта.(Скорее досадно, этот вопрос не появлялся на странице вопросов, когда я первоначально загружал его, и я наткнулся на него только потому, что искал другой вопрос.)
источник