Конвертировать YYYYMM в MMMYY


54

Основываясь на этом ТАК вопрос .

Задача довольно проста: с учетом периода даты в формате 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

5
Этот вопрос очень хорошо сбалансирован. И библиотеки ручного разбора, и библиотеки дат заканчиваются примерно одинаково, по крайней мере, в Python.
bkul

10
Вчера я увидел «Конвертировать YYYYMM в MMMYY» на HNQ рядом с логотипом SO. Теперь я вижу то же название рядом с логотипом PCG. Я был очень смущен :)
кошка

Ответы:


20

MATL, 18 14 13 байт

4e!Z{Zc12XOXk

Входные данные предоставляются в виде строки (заключены в одинарные кавычки).

Эта версия работает только в MATL на MATLAB, поскольку MATLAB может автоматически анализировать datestr('2016 04').

объяснение

        % Implicitly grab input as a string
4e!     % Reshape input to be 2 x 4 (puts the year in row 1 and month in row 2)
Z{      % Place each row in a separate cell
Zc      % Join them together using a space to create 'yyyy mm' format
12      % Number literal, pre-defined datestring of 'mmmyy'
XO      % Convert from serial date number to string using this format
Xk      % Convert to uppercase
        % Implicitly display

Вот 18-байтовая версия, которая работает на Octave (и, следовательно, онлайн-переводчик)

'yyyymm'2$YO12XOXk

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

Модифицированная версия для всех тестовых случаев

объяснение

            % Implicitly grab input as a string
'yyyymm'    % Push the format string as a string literal
2$YO        % Convert to a serial date number
12          % Number literal, pre-defined datestring of 'mmmyy'
XO          % Convert from serial date number to string using this format
Xk          % Convert to uppercase
            % Implicitly display

3
Я не понимаю, как это можно победить, так что ... gg
Аднан

20

Python 3, 70 байт

from time import*
lambda s:strftime("%b%y",strptime(s,"%Y%m")).upper()

При этом используется встроенный strftimeи strptimeфункции.

Для еще одного байта, вот версия, которая анализирует строку вручную:

lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]

Это интересным образом кодирует названия месяцев (спасибо Генри Гомерсолу за сохранение байта).


11
Этот ручной анализ сумасшедший.
Морган Трепп

@MorganThrapp Я получил идею из этого ответа .
bkul

1
Ваша инструкция версия может быть сделано в 69 байт в Python 2 , если взять число в качестве входных данных: lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4].
xnor

1
Хотя это теряет байт:lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Генри Гомерсалл

1
@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae - «время импорта» сэкономит вам 6 символов, но обойдется вам в 10 («время», в два раза) »
TLW


18

PowerShell v2 +, 49 46 байт

(date $args[0].insert(4,'-')-U %b%y).ToUpper()

Спасибо @Joey за сохранение 3 байта!

Принимает ввод $args[0]как явную строку (например, '201604') через ввод командной строки. Использует string.Insert()функцию для помещения a -в соответствующее пространство, и эта результирующая строка формирует входные данные для Get-Dateкомандлета с -Uпараметром format, определяющим трехмесячное сокращение плюс год из двух цифр. Мы инкапсулируем это в скобках и добавляем .ToUpper()к заглавной строке. Эта строка остается в конвейере, и печать неявна.

Также, как указано, это зависит от локали. Вот информация о локали, которую я использую, где это работает правильно.

PS C:\Tools\Scripts\golfing> get-culture

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)

Вам не нужно заключать в кавычки MMMyy, так как это простой аргумент для командлета. Вы также можете просто использовать -UFormat %b%y, то есть -u %b%yвместо этого, что еще короче. Примечание: это решение является чувствительным к локали (которое мне лично не нравится), но, по общему признанию, было бы немного дольше учитывать это.
Джои

Отличный звонок -UFormatвместо. Спасибо! Я также не знал о цитатах вокруг MMMyy- это хорошо знать на будущее.
AdmBorkBork

8

Retina , 71 70 байт

Спасибо Sp3000 за сохранение 1 байта.

Количество байтов предполагает кодировку ISO 8859-1. Конечный перевод строки значителен.

(..)(..)$
DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX$2$*¶$1
+`...¶

R-6`.

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

объяснение

Взяв 201604в качестве примера:

(..)(..)$
DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX$2$*¶$1

Это поменяет местами последние две цифры года с месяцем, а также расширит месяц в унарном формате с использованием перевода строки и добавит список месяцев в обратном порядке, чтобы мы получили:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

Где представляют перевод строки (0x0A).

+`...¶

Теперь мы неоднократно удаляем три символа без перевода строки, за которыми следует перевод строки. То есть мы съели список месяцев с конца для каждого перевода строки, представляющего месяц:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16
20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJAN¶¶¶16
20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEB¶¶16
20DECNOVOCTSEPAUGJULJUNMAYAPRMAR¶16
20DECNOVOCTSEPAUGJULJUNMAYAPR16

Вот почему мы добавили это XXX: начиная с месяцев, начиная с месяца 1, мы всегда удаляем как минимум три символа, даже для января.

R-6`.

Наконец, мы удаляем все до 6-го символа с конца. Другими словами, мы оставляем только последние пять символов.


Это чертовски умно.
AdmBorkBork

7

CJam, 50 46 байтов

q2/1>~i("4H~0ë~³!ò²×¶7Ö"256b25b'Af+3/=\

Попробуйте онлайн. Спасибо Martin Ender за сжатие строки для сохранения нескольких байтов.

объяснение

q2/  e# Get input and divide it into groups of 2, like ["20" "16" "04"]
1>~  e# Discard the first item and dump the remaining array to the stack
i(   e# Convert the top value (month) to an integer and decrement it, because
     e# arrays are zero-indexed
"..."256b25b e# Convert this string from base-256 to base-25
'Af+ e# "Add" a capital A to each number to get the letters
3/   e# Divide into groups of 3 to make an array of month names
=\   e# Get the requested month and swap the elements to put the year on
     e# top, so it is printed last


6

Java 7, 137 символов (161 байт)

String d(String i){return Integer.toString("憯䷳烣㘿烪摿摽㛨近筍矯䏔".charAt(Integer.parseInt(i.substring(4))-1),36).toUpperCase()+i.substring(2,4);}

Предположим, что название каждого месяца (JAN, FEB и т. Д.) Представляет собой число в базе 36 и закодируйте его в соответствующий символ Unicode. Затем получить соответствующий символ из строки, закодировать его снова в базе 36 и после этого некоторые простые строки манипуляций.

Слегка разгульный

String d(String input){
return 
  Integer.toString("憯䷳烣㘿烪摿摽㛨近筍矯䏔" // encoded month names
  .charAt(Integer.parseInt(input.substring(4))-1),36) // get a symbol from encoded names at position input[4:], decode it to base 36 value
  .toUpperCase()+input.substring(2,4); // get it to upper case and add year
}

Вы можете увидеть это работает здесь: https://ideone.com/IKlnPY


5

Python, 83 байта

from datetime import*
lambda x:datetime.strptime(x,'%Y%m').strftime('%b%y').upper()

Я только что опубликовал ответ, почти идентичный вашему. Я не видел твоего, потому что потребовалось время, чтобы написать ответ. Если вы хотите, чтобы я удалил мой, я сделаю это, или вы можете использовать мой, чтобы убрать лишние байты.
bkul

1
Хорошо, ты побил меня на 13 байтов, я уступлю. Мне тоже нравится твой ручной ответ.
атласолог

5

Котлин, 100 байт

fun f(d:String)=SimpleDateFormat("MMMyy").format(SimpleDateFormat("yyyyMM").parse(d)).toUpperCase()

Довольно простое использование Java SimpleDateFormat


1
Хм, я не знаю Kotlin, но так как он происходит от Java, разве вы не должны включить импорт SimpleDateFormat(то есть import java.text.*;)?
Кевин Круйссен

Поскольку задача требует вывода, я бы предположил, что печать является частью вашей функции.
JohnWells

5

MATLAB / Octave, 42 байта

@(x)upper(datestr(datenum(x,'yyyymm'),12))

Создает анонимную функцию с именем ans, которая вызывается со строкой , представляющей дату: ans('201604').

Демо онлайн

Это решение использует datenumдля преобразования входной даты в серийный номер даты, а затем datestrс предопределенной выходной спецификацией mmmyy( 12) для получения строкового представления в требуемом формате. Наконец, мы используем его upperдля изменения, MMMYYпоскольку верхний регистр не является выходным параметром.


1
Ух ты, боже, как бить всех остальных на языке, не относящемся к гольфу!
Даунгаут

5

05AB1E, 51 42 41 байт

2ô¦`ï<•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B3ôsèsJ

объяснение

                                           # implicit input, 123405
2ô                                         # split input into pieces of 2, ['12','34','05']
  ¦`                                       # push last 2 elements to stack, '05', '34'
    ï<                                     # convert month to its int index, 4
      •r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B        # get compressed string containing 3-letter months, 
                                             JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC
                                   3ô      # split into pieces of 3
                                             ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
                                     sè    # get month at index retrieved earlier, MAY
                                       sJ  # join with 2-digit year and implicitly print, MAY34

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

9 байтов сохранено благодаря сжатию строк, предоставлено @Adnan


1
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35Bвместо того, чтобы "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"экономить 9 байтов.
Аднан

5

JavaScript, 87 84 80 79 байт

x=>(new Date(x.replace(/.{4}/,'$&-'))+'').slice(4,7).toUpperCase()+x.slice(2,4)

Чтобы получить месяц, получает дату (которая образована из «ГГГГММ», преобразованной в «ГГГГ-ММ») и извлекает символы с 5 по 8, которые являются точно первыми тремя буквами месяца. Но это стоит дорого, чтобы преобразовать его в верхний регистр.

Демо-версия:

function s(x) {
  return (new Date(x.replace(/.{4}/, '$&-')) + '').slice(4,7)
         .toUpperCase() + x.slice(2, 4)
}

console.log(s('201604'));
console.log(s('200001'));
console.log(s('000112'));
console.log(s('123405'));


Сначала должно бытьAPR16
Downgoat

@ Upgoat А что у тебя появляется?
Никаэль

1
Я получаюMAR16
Downgoat

@ Да, это странно, почему так может быть? Потому что я понимаю это .
Никаэль

Для меня это действительно показывает APR16, но третий контрольный пример показывает только DECдля меня.
Аднан

4

Юлия, 57 56 53 байта

s->uppercase(Dates.format(DateTime(s,"yyyym"),"uyy"))

Это анонимная функция, которая принимает строку и возвращает строку. Чтобы вызвать его, назначьте его переменной.

Сначала мы создаем DateTimeобъект, используя конструктор типа и строку формата. Обратите внимание, что сингл mв строке формата будет содержать как одно-, так и двузначные месяцы, хотя первый случай здесь не имеет значения. Поскольку дни не указаны, подразумевается первое число месяца.

Затем мы можем отформатировать значение в виде строки, используя Dates.formatфункцию из Base.Datesподмодуля. Строка uyyполучает трехбуквенное название месяца и двухзначный год, но результат в случае заголовка, например, 16 апреля вместо желаемого APR16, поэтому нам это нужно uppercase.

Попробуйте онлайн! (включает все тестовые случаи)


4

C 147 145 112 байтов

main(m){char a[99]="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";scanf("%4s%d",a+50,&m);printf("%.3s%s",a+--m*3,a+52);}

Онлайн демо

Спасибо, Угорен !


2
Некоторые дешевые трюки - удалите #include, определите mкак параметр - main(m),
ugoren

2
Кроме того, %.3sформат сохраняет нулевое завершение.
Угорен

Спасибо @ugoren! Я также изменился "%4s%2d"на "%4s%d".
Марко

main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}намного короче
l4m2

4

JavaScript ES6, 77 66 байт

Благодаря @ Bálint сэкономлено 11 байт!

a=>(new Date(0,a[4]+a[5]-1)+"").slice(4,7).toUpperCase()+a[2]+a[3]

Получить дату, извлекая строку, возвращаемую Dateклассом. затем заглавными буквами и добавляет год.

Версия ES5:

var a = prompt("Enter YYYYMM: ");
result = (new Date(0,a[4]+a[5]-1)+"").slice(4,7).toUpperCase()+a[2]+a[3]
alert(result);


Я сделал один из 66 байтов с той же техникой atob, но я не могу скопировать его
Балинт

@ Bálint Я думал, что у меня тоже есть 66 байтов, но наш счетчик байтов оказался неправильным из-за плохого копирования копий;)
Downgoat

Вы можете получить название месяца с(Date(0,a[4]- -a[5])+"").substr(4,3)
Балинт

1
Я не понимаю этого a[4]- -a[5]. Что было не так с a[4]+a[5]-1?
Нил

1
new Date(0,a[4]+a[5]-1)+""=>new Date(0,a[4]+a[5]-1)+0
l4m2

3

C #, 94 87 байт

string C(string s)=>System.DateTime.Parse(s.Insert(4,"-")).ToString("MMMyy").ToUpper();

Сохранено 7 байт с использованием синтаксиса C # 6.

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


Вы можете оставить информацию о типе возврата для лямбд, то естьC(string s)=>...
кошка


3

Java 8, 154 113 байтов

import java.text.*;s->new SimpleDateFormat("MMMyy").format(new SimpleDateFormat("yyyyMM").parse(s)).toUpperCase()

Объяснение:

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

import java.text.*;                 // Required import for SimpleDateFormat
s->                                 // Method with String as both parameter and return-type
  new SimpleDateFormat("MMMyy")     //  Create a formatter with format "MMMyy"
   .format(                         //  Format the following:
     new SimpleDateFormat("yyyyMM") //   Create another formatter with format "yyyyMM"
     .parse(s))                     //   Parse the input with this format
  .toUpperCase()                    //  Convert everything to Uppercase and return

Я думаю, что вы можете сократить его, если вы удалите импорт и вместо этого непосредственно обратитесь к нему с помощью java.text.SimpleDateFormat.
Frozn

2
@Frozn На самом деле, import java.text.*;это 19 байтов, и два раза java.text.перед обоими SimpleDateFormatпо 20 байтов. Таким образом, он будет увеличиваться на 1 байт вместо его уменьшения.
Кевин Круйссен

Ах да, ты прав. Я всегда смотрю на некольфированную версию и думаю, что она равна гольфовой. Извините :)
Frozn

@Frozn Ах, тоже немного плохо. Обычно я все еще использую .*;код для неопрятного кода, но на этот раз я, кажется, пренебрегал им. У меня есть опции сохранения, которые автоматически преобразуют его в чистый импорт, так как я использую Java в своей работе, и я просто забыл изменить его на import java.text.*;..
Кевин Круйссен

2

Oracle SQL, 49 байт

select to_char(to_date(n,'yyyymm'),'MONyy')from t

Данные должны быть вставлены в таблицу под названием Tколонкой Nтипа VARCHAR2(6), CHAR(6)или, только если все эти годы являются> 1000, NUMBER

Использование:

drop table t;
create table t (n VARCHAR2(6));
insert into t values ('201604');
insert into t values ('200001');
insert into t values ('000112');
insert into t values ('123405');    

select to_char(to_date(n,'yyyymm'),'MONyy')from t;

Можно ли будет использовать PRINT вместо SELECT и не ссылаться на таблицу, используя вместо нее переменную в качестве входных данных? Объявление входной переменной и присвоение значения не влияет на количество байтов
t-clausen.dk

Разрешено ли принимать данные из таблицы? Информация codegolf тег не говорит о том, что нет.
pajonk

@ t-clausen.dk самый короткий путь с использованием print - 58 символов: 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');), если у вас есть более короткие пути, пожалуйста, сообщите мне.
Джакомо Гарабелло

@pajonk в этом ответе никто не расскажет мне ничего об использовании таблиц
Джакомо Гарабелло

1
@pajonk в соответствии с этим , вы можете использовать таблицы для ввода
t-clausen.dk

2

Microsoft SQL Server, 57 байт

SELECT UPPER(FORMAT(CAST('201601'+'01' AS DATE),'MMMyy'))

UpperФункция необходима как формат не производит заглавные месяцев , как можно было бы ожидать с МММ шаблоном формата.

Использование:

drop table t;
create table t (n VARCHAR(6));
insert into t values ('201604');
insert into t values ('200001');
insert into t values ('000112');
insert into t values ('123405');    

SELECT UPPER(FORMAT(CAST(n+'01' AS DATE),'MMMyy')) FROM t

Только что видел ваш ответ, он очень похож на мой, не замечал его до сих пор, удалил мой ответ
t-clausen.dk

Разрешено ли принимать данные из таблицы? Информация codegolf тег не говорит о том, что нет.
pajonk

@pajonk ответ здесь не использует ввод из таблицы, ответ - верхняя строка, а входная переменная жестко закодирована. Обратите внимание, что вы можете использовать таблицы в качестве входных переменных, как я упоминал ранее. В нижней части приведен пример преобразования нескольких значений. TSQL не имеет ни STDIN, ни входных операторов. Единственный способ добавления данных - использование переменных или таблиц. Все мои ответы используют для ввода
t-clausen.dk

Хорошо, спасибо за разъяснения.
pajonk

2

Pyth, 45 байт

+:."AYw2ûDÈëKH§È¼DYÉx\E±oË"J*3sgz5+3J:z2 4

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

Объяснение:

+:."AYw2ûDÈëKH§È¼DYÉx\E±oË"J*3sgz5+3J:z2 4
                                z           Take the input
                               g 5          Slice inclusively from index 5 to the end
                              s             Parse as an int
                            *3              Multiply by 3
                           J                Store in variable J, this also returns J
 :                                          Take a slice
  ."AYw2ûDÈëKH§È¼DYÉx\E±oË"                 Of this packed string
                           J*3sgz5          From the J we defined before
                                  +3J       To J+3
+                                           To this string, append
                                     :z     A slice of the index
                                       2 4  From [2,4).

Упакованная строка содержит "JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC". Два JANс тем, чтобы я мог индексировать его псевдо-один индексированный.

РЕДАКТИРОВАТЬ: Исправлена ​​ошибка, которая мешала TIO


2

R 65 байт

function(A)paste0(toupper(month.abb[el(A:1)%%100]),substr(A,3,4))

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

Принимает ввод в виде строки, использует константу month.abb. Использует модуль и substrдля извлечения соответствующих значений.


умное использование, :чтобы преобразовать в integer!
Джузеппе

@ Giuseppe Не моя идея :) Я взял это отсюда . Я, вероятно, могу применить его к ряду моих существующих ответов!
JayCe

@Giuseppe Я только что нашел более короткий взлом, используя el- на 1 байт меньше.
JayCe

1

J, 70 байт

4(}.((,~(_3]\'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'){~1-~".)~2&}.){.)]

использование

   f =: 4(}.((,~(_3]\'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'){~1-~".)~2&}.){.)]
   f '201604'
APR16
   f '200001'
JAN00
   f '000112'
DEC01
   f '123405'
MAY34

объяснение

4(}.((,~(_3]\'...'){~1-~".)~2&}.){.)] Input: s
                                    ] Identity function, gets the value s
4                                     The constant 4
                                 {.   Take the first 4 chars from s
                            2&}.      Drop the first 2 (Take the last 2) to get the year
  }.                                  Drop the first 4 chars from s to get the month
                        ".            Parse the month substring as a number
                     1-~              Subtract 1 from it
             '...'                    List of MMM month names
         _3]\                         Split the list into nonoverlapping sublists of size 3
      ,~                              Join the MMM month name with the year and return


1

JQ, 35 символов

(34 символа кода + 1 символ командной строки.)

(Только что попробовал, работает ли ^трюк, использованный Digital Trauma в его ответе на Bash, также и в jq. Работает. Теперь вы знаете, кто вдохновил наиболее важный символ этого ответа. (Альтернатива - использовать ascii_upcaseфункцию.))

strptime("%Y%m")|strftime("%^b%y")

Пробный прогон (опция -Rиспользуется только в этом примере для прохождения всех тестовых случаев.)

bash-4.3$ jq -Rr 'strptime("%Y%m")|strftime("%^b%y")' <<END
201604
200001
000112
123405
END
APR16
JAN00
DEC01
MAY34

Он-лайн тест: (Передача -R через URL не поддерживается - поэтому ввод передается как строковый литерал JSON. Передача -rчерез URL не поддерживается - проверьте Raw Output самостоятельно.)


1

Фактор, 82 78 байт

[ [ 2 tail* 10 base> month-abbreviation ] [ 4 head 2 tail ] bi append >upper ]

Eshplained:

[                    ! new anonymouse function block (quotation)
  [                  ! new quotation 
    2 tail*          ! "201604" -> "04"
    10 base>         ! "04"     -> 4
    month-abbreviation ! 4 -> "Apr"
  ]                  ! end quotation
  [                  ! new quotation
    4 head           ! "201604" -> "2016"
    2 tail           ! "2016"   -> "16" 
  ]                  ! end quotation
  bi                 ! bifurcate two quotations to TOS
  append             ! "Apr" "16" -> "Apr16"
  >upper             ! "Apr16"    -> "APR16"
]                    ! end quotation

1

PHP, 78 байт

<?=fscanf(STDIN,"%4d%d",$y,$m)?strtoupper(date("My",mktime(0,0,0,$m,1,$y))):0;

«Год 2038 проблема» может возникать на некоторых компьютерах, так как здесь . Но не в других, как здесь .


@ Titus, пожалуйста, не пытайтесь редактировать посты других людей, если есть проблемы, и вставьте свои собственные решения; вместо этого, пожалуйста, прокомментируйте ответ ИЛИ создайте новый ответ самостоятельно.
Чернила стоимости

1

Swift 2.2, 149 байт

let f = NSDateFormatter(),g = NSDateFormatter();f.dateFormat = "yyyyMM";g.dateFormat = "MMMyy"
g.stringFromDate(f.dateFromString(i)!).uppercaseString

Попытка получить это короче, чем Kotlin ... Жаль, NSDateFormatterчто не имеет инициализатора, который устанавливает его dateFormat. NSDateFormatterтакже не имеет dateFormatзначения по умолчанию , что вызывает дополнительные потери.

Swift 3, 136 байт

let f = DateFormatter(),g = DateFormatter();f.dateFormat = "yyyyMM";g.dateFormat = "MMMyy"
g.string(from: f.date(from: i)!).uppercased()

Благодаря удалению NSпрефикса в некоторых классах, я смог сделать ответ Swift 3 немного короче. Все же не короче, чем Котлин, хотя ...

Тестовая функция и случаи:

import Foundation
import XCTest

func dateConverter(i: String) -> String? {
    let f = DateFormatter(),g = DateFormatter();f.dateFormat = "yyyyMM";g.dateFormat = "MMMyy"

    if let date = f.date(from: i) {
        return g.string(from: date).uppercased()
    }

    return nil
}

XCTAssert(dateConverter(i: "201604") == "APR16")
XCTAssert(dateConverter(i: "200001") == "JAN00")
XCTAssert(dateConverter(i: "000112") == "DEC01")
XCTAssert(dateConverter(i: "123405") == "MAY34")

1

R 154 150 114 112 байт

Принимает шестизначный ввод в «b», отделяет первые четыре цифры от последних двух цифр, сокращает двухзначный месяц и делает его прописным, а также объединяет его с 3-й и 4-й цифрами.

Golfed:

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="")}

Ungolfed:

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="")
}

РЕДАКТИРОВАТЬ: заменены двуязычные имена с переменными; исправил меня глупость -2 байта, превратив функцию анонимно (спасибо, кот).


Хороший ответ! Вы можете оставить a=анонимную функцию
кошка

@cat Я не слишком знаком с анонимными функциями, но разве мне не нужно добавлять скобки в начале и конце функции, если я удалил a=? Как то так: (function(m) {a=3;m*a})(10)
мягкая подушка

1
Нет, 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
кошка

@cat чертовски новые версии все портят! Я на RStudio работает R version 3.1.1 (2014-07-10)и работает нормально. Как это работает здесь, я должен получить новую версию и изменить код? Также спасибо за подсказку анонимной функции!
мягкая подушка
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.