Основываясь на этом ТАК вопрос .
Задача довольно проста: с учетом периода даты в формате YYYYMM
выведите его в формате MMMYY
.
Правила:
- На входе будет число или строка длиной ровно 6 символов, состоящая только из цифр.
- Последние две цифры будут между
01
и12
. - Вывод должен быть в форме
MMMYY
, гдеMMM
представляет трехбуквенный код в верхнем регистре для месяца (ниже) иYY
представляет две последние цифрыYYYY
части ввода.
Список месяцев с соответствующим кодом:
MM MMM
01 JAN
02 FEB
03 MAR
04 APR
05 MAY
06 JUN
07 JUL
08 AUG
09 SEP
10 OCT
11 NOV
12 DEC
Примеры:
Input Output
201604 APR16
200001 JAN00
000112 DEC01
123405 MAY34
Ответы:
MATL,
181413 байтВходные данные предоставляются в виде строки (заключены в одинарные кавычки).
Эта версия работает только в MATL на MATLAB, поскольку MATLAB может автоматически анализировать
datestr('2016 04')
.объяснение
Вот 18-байтовая версия, которая работает на Octave (и, следовательно, онлайн-переводчик)
Попробуйте онлайн
Модифицированная версия для всех тестовых случаев
объяснение
источник
Python 3, 70 байт
При этом используется встроенный
strftime
иstrptime
функции.Для еще одного байта, вот версия, которая анализирует строку вручную:
Это интересным образом кодирует названия месяцев (спасибо Генри Гомерсолу за сохранение байта).
источник
lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4]
.lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Баш + coreutils, 18
Требуется 64-битная версия
date
для данных тестовых случаев, которая распознает даты ранее 14 декабря 1901 года .источник
PowerShell v2 +,
4946 байтСпасибо @Joey за сохранение 3 байта!
Принимает ввод
$args[0]
как явную строку (например,'201604'
) через ввод командной строки. Используетstring.Insert()
функцию для помещения a-
в соответствующее пространство, и эта результирующая строка формирует входные данные дляGet-Date
командлета с-U
параметром format, определяющим трехмесячное сокращение плюс год из двух цифр. Мы инкапсулируем это в скобках и добавляем.ToUpper()
к заглавной строке. Эта строка остается в конвейере, и печать неявна.Также, как указано, это зависит от локали. Вот информация о локали, которую я использую, где это работает правильно.
источник
MMMyy
, так как это простой аргумент для командлета. Вы также можете просто использовать-UFormat %b%y
, то есть-u %b%y
вместо этого, что еще короче. Примечание: это решение является чувствительным к локали (которое мне лично не нравится), но, по общему признанию, было бы немного дольше учитывать это.-UFormat
вместо. Спасибо! Я также не знал о цитатах вокругMMMyy
- это хорошо знать на будущее.Retina ,
7170 байтСпасибо Sp3000 за сохранение 1 байта.
Количество байтов предполагает кодировку ISO 8859-1. Конечный перевод строки значителен.
Попробуйте онлайн!
объяснение
Взяв
201604
в качестве примера:Это поменяет местами последние две цифры года с месяцем, а также расширит месяц в унарном формате с использованием перевода строки и добавит список месяцев в обратном порядке, чтобы мы получили:
Где
¶
представляют перевод строки (0x0A).Теперь мы неоднократно удаляем три символа без перевода строки, за которыми следует перевод строки. То есть мы съели список месяцев с конца для каждого перевода строки, представляющего месяц:
Вот почему мы добавили это
XXX
: начиная с месяцев, начиная с месяца1
, мы всегда удаляем как минимум три символа, даже для января.Наконец, мы удаляем все до 6-го символа с конца. Другими словами, мы оставляем только последние пять символов.
источник
CJam,
5046 байтовПопробуйте онлайн. Спасибо Martin Ender за сжатие строки для сохранения нескольких байтов.
объяснение
источник
Баш,
3928 байтСпасибо Digital Trauma !
источник
Java 7, 137 символов (161 байт)
Предположим, что название каждого месяца (JAN, FEB и т. Д.) Представляет собой число в базе 36 и закодируйте его в соответствующий символ Unicode. Затем получить соответствующий символ из строки, закодировать его снова в базе 36 и после этого некоторые простые строки манипуляций.
Слегка разгульный
Вы можете увидеть это работает здесь: https://ideone.com/IKlnPY
источник
Python, 83 байта
источник
Котлин, 100 байт
Довольно простое использование Java SimpleDateFormat
источник
SimpleDateFormat
(то естьimport java.text.*;
)?MATLAB / Octave, 42 байта
Создает анонимную функцию с именем
ans
, которая вызывается со строкой , представляющей дату:ans('201604')
.Демо онлайн
Это решение использует
datenum
для преобразования входной даты в серийный номер даты, а затемdatestr
с предопределенной выходной спецификациейmmmyy
(12
) для получения строкового представления в требуемом формате. Наконец, мы используем егоupper
для изменения,MMMYY
поскольку верхний регистр не является выходным параметром.источник
05AB1E,
514241 байтобъяснение
Попробуйте онлайн
9 байтов сохранено благодаря сжатию строк, предоставлено @Adnan
источник
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B
вместо того, чтобы"JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
экономить 9 байтов.JavaScript,
87848079 байтЧтобы получить месяц, получает дату (которая образована из «ГГГГММ», преобразованной в «ГГГГ-ММ») и извлекает символы с 5 по 8, которые являются точно первыми тремя буквами месяца. Но это стоит дорого, чтобы преобразовать его в верхний регистр.
Демо-версия:
источник
APR16
MAR16
APR16
, но третий контрольный пример показывает толькоDEC
для меня.Юлия,
575653 байтаЭто анонимная функция, которая принимает строку и возвращает строку. Чтобы вызвать его, назначьте его переменной.
Сначала мы создаем
DateTime
объект, используя конструктор типа и строку формата. Обратите внимание, что синглm
в строке формата будет содержать как одно-, так и двузначные месяцы, хотя первый случай здесь не имеет значения. Поскольку дни не указаны, подразумевается первое число месяца.Затем мы можем отформатировать значение в виде строки, используя
Dates.format
функцию изBase.Dates
подмодуля. Строкаuyy
получает трехбуквенное название месяца и двухзначный год, но результат в случае заголовка, например, 16 апреля вместо желаемого APR16, поэтому нам это нужноuppercase
.Попробуйте онлайн! (включает все тестовые случаи)
источник
C
147145112 байтовОнлайн демо
Спасибо, Угорен !
источник
#include
, определитеm
как параметр -main(m)
,%.3s
формат сохраняет нулевое завершение."%4s%2d"
на"%4s%d"
.main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}
намного корочеJavaScript ES6,
7766 байтБлагодаря @ Bálint сэкономлено 11 байт!
Получить дату, извлекая строку, возвращаемую
Date
классом. затем заглавными буквами и добавляет год.Версия ES5:
источник
(Date(0,a[4]- -a[5])+"").substr(4,3)
a[4]- -a[5]
. Что было не так сa[4]+a[5]-1
?new Date(0,a[4]+a[5]-1)+""
=>new Date(0,a[4]+a[5]-1)+0
C #,
9487 байтСохранено 7 байт с использованием синтаксиса C # 6.
Попробуйте онлайн
источник
C(string s)=>...
Japt,
3534 байтаСсылка.
Использует ту же технику, что и мой ответ JavaScript .
источник
Java 8,
154113 байтовОбъяснение:
Попробуйте онлайн.
источник
java.text.SimpleDateFormat
.import java.text.*;
это 19 байтов, и два разаjava.text.
перед обоимиSimpleDateFormat
по 20 байтов. Таким образом, он будет увеличиваться на 1 байт вместо его уменьшения..*;
код для неопрятного кода, но на этот раз я, кажется, пренебрегал им. У меня есть опции сохранения, которые автоматически преобразуют его в чистый импорт, так как я использую Java в своей работе, и я просто забыл изменить его наimport java.text.*;
..Oracle SQL, 49 байт
Данные должны быть вставлены в таблицу под названием
T
колонкойN
типаVARCHAR2(6)
,CHAR(6)
или, только если все эти годы являются> 1000,NUMBER
Использование:
источник
begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print n
и вам нужно 42 дополнительных символа для одного ввода (VARIABLE n varchar2;BEGIN:n:='201605';END;
) вместо 31 (insert into t values('000112');
), если у вас есть более короткие пути, пожалуйста, сообщите мне.Microsoft SQL Server, 57 байт
Upper
Функция необходима как формат не производит заглавные месяцев , как можно было бы ожидать с МММ шаблоном формата.Использование:
источник
Pyth, 45 байт
Попробуйте онлайн!
Объяснение:
Упакованная строка содержит
"JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
. ДваJAN
с тем, чтобы я мог индексировать его псевдо-один индексированный.РЕДАКТИРОВАТЬ: Исправлена ошибка, которая мешала TIO
источник
R 65 байт
Попробуйте онлайн!
Принимает ввод в виде строки, использует константу
month.abb
. Использует модуль иsubstr
для извлечения соответствующих значений.источник
:
чтобы преобразовать вinteger
!el
- на 1 байт меньше.J, 70 байт
использование
объяснение
источник
Pyth, 39 байт
HexDump:
Тестирование.
источник
JQ, 35 символов
(34 символа кода + 1 символ командной строки.)
(Только что попробовал, работает ли
^
трюк, использованный Digital Trauma в его ответе на Bash, также и в jq. Работает. Теперь вы знаете, кто вдохновил наиболее важный символ этого ответа. (Альтернатива - использоватьascii_upcase
функцию.))Пробный прогон (опция
-R
используется только в этом примере для прохождения всех тестовых случаев.)Он-лайн тест: (Передача -R через URL не поддерживается - поэтому ввод передается как строковый литерал JSON. Передача
-r
через URL не поддерживается - проверьте Raw Output самостоятельно.)источник
Фактор,
8278 байтEshplained:
источник
PHP, 78 байт
«Год 2038 проблема» может возникать на некоторых компьютерах, так как здесь . Но не в других, как здесь .
источник
Swift 2.2, 149 байт
Попытка получить это короче, чем Kotlin ... Жаль,
NSDateFormatter
что не имеет инициализатора, который устанавливает егоdateFormat
.NSDateFormatter
также не имеетdateFormat
значения по умолчанию , что вызывает дополнительные потери.Swift 3, 136 байт
Благодаря удалению
NS
префикса в некоторых классах, я смог сделать ответ Swift 3 немного короче. Все же не короче, чем Котлин, хотя ...Тестовая функция и случаи:
источник
R
154150114112 байтПринимает шестизначный ввод в «b», отделяет первые четыре цифры от последних двух цифр, сокращает двухзначный месяц и делает его прописным, а также объединяет его с 3-й и 4-й цифрами.
Golfed:
Ungolfed:
РЕДАКТИРОВАТЬ: заменены двуязычные имена с переменными; исправил меня глупость -2 байта, превратив функцию анонимно (спасибо, кот).
источник
a=
анонимную функциюa=
? Как то так:(function(m) {a=3;m*a})(10)
function(b){h=substr;i=sprintf;o="%06d";cat(toupper(month.abb[as.numeric(h(i(o,b),5,6))]),h(i(o,b),3,4),sep="")}
это функциональный объект сам по себе.RStudio with R 3.2.3 (2015-12-10)
я получаюError in i(o, b) : invalid format '%06d'; use format %s for character objects
R version 3.1.1 (2014-07-10)
и работает нормально. Как это работает здесь, я должен получить новую версию и изменить код? Также спасибо за подсказку анонимной функции!