Перетворіть YYYYMM в MMMYY


54

Спираючись на це питання SO .

Виклик досить простий: заданий період дати у форматі 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
Вчора я побачив на "HNQ" біля логотипу SO "Перетворення YYYYMM в MMMYY". Тепер я бачу ту саму назву біля логотипу 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функції.

На ще 1 байт, ось версія, яка аналізує рядок вручну:

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

Це цікаво кодує назви місяців (дякую Генрі Гомерсалу за збереження байта).


11
Цей ручний розбір божевільний.
Морган Трапп

@MorganThrapp Я отримав ідею з цієї відповіді .
бкуль

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()функцію для введення -у відповідне простір, і такий рядок утворює вхід до Get-Dateкомандлету з -Uпараметром формату, що визначає тримісячну скорочення та двозначний рік. Ми інкапсулюємо це в паренах і застосуємо a, .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

Сітківка , 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`.

Нарешті, ми видаляємо все до шести символів з кінця. Іншими словами, ми зберігаємо лише останні п’ять символів.


Це досить хитро розумно.
AdmBorkBork

7

CJam, 50 46 байт

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

Спробуйте в Інтернеті. Дякую Мартіну Ендеру за стиснення рядка, щоб зберегти кілька байт.

Пояснення

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

Пітон, 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
Хм, я не знаю Котліна, але оскільки він походить від 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
Пуховий матч

@Upgoat А що для тебе з’являється?
nicael

1
Я отримуюMAR16
Пуховик

@Upgoat Хм, це дивно, чому це може бути саме так? Тому що я це отримую .
nicael

Для мене це показує APR16, але третій тестовий випадок показує лише DECдля мене.
Аднан

4

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

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

Це анонімна функція, яка приймає рядок і повертає рядок. Щоб викликати його, призначте його змінній.

Спочатку ми будуємо DateTimeоб’єкт за допомогою конструктора типу та рядка формату. Зауважте, що сингл mу рядку формату отримає як одно-, так і двоцифрові місяці, хоча перший випадок тут не має значення. Оскільки дні не вказані, передбачається перший місяць.

Потім ми можемо відформатувати значення у вигляді рядка, використовуючи Dates.formatфункцію з Base.Datesпідмодуля. Рядок uyyотримує трибуквенну назву місяця та двоцифровий рік, але результат є у випадку заголовка, наприклад, Apr16 замість потрібного 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);}

Демонстрація в Інтернеті

Спасибі ugoren !


2
Деякі дешеві хитрощі - видаліть #include, визначте mяк параметр - main(m),
ugoren

2
Також %.3sформат зберігає нульове припинення.
ugoren

Дякую @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 байт

Збережено 11 байт завдяки @ Bálint!

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 байт із тією ж методикою атобу, але не можу це скопіювати
Bálint

@ Bálint Я думав, що я отримав 66 байт, але перетворюється наш байт-лічильник був неправильним через неправильне вставлення копії;)
Downgoat

Ім'я місяця ви можете отримати(Date(0,a[4]- -a[5])+"").substr(4,3)
Bálint

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 Ах, теж трохи погано. Зазвичай я все-таки використовую .*;для коду, який не використовується для гольфу, але цього разу, здається, я його нехтував. У мене є варіанти збереження, яке автоматично перетворює його на чистий імпорт, оскільки я використовую Java на своїй роботі, і я просто забув змінити її на import java.text.*;..
Kevin Cruijssen

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

Чи дозволяється брати дані з таблиці? Інформація про тег кодогольфа говорить про те, що ні.
pajonk

@ t-clausen.dk найкоротший спосіб використання друку - 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

Чи дозволяється брати дані з таблиці? Інформація про тег кодогольфа говорить про те, що ні.
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". Два JANs - це так, що я можу індексувати його псевдоіндексом.

EDIT: Виправлена ​​помилка, яка зіпсувала 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 символом.)

(Просто намагався ^трюк використовується цифровий Травма в його Баш відповідь працює в 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

On-line тест: (Передача -R через URL-адресу не підтримується - значить, вхід передається як лінійний рядок JSON. Передача -rURL-адреси не підтримується - перевірте Raw Output самостійно.)


1

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

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

Пояснено:

[                    ! 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

Швидкий 2.2, 149 байт

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

Намагаючись зробити це коротшим, ніж Котлін ... Прикро NSDateFormatter, не існує ініціалізатора, який би встановив його dateFormat. NSDateFormatterтакож не має dateFormatзначення за замовчуванням , спричиняючи додаткові втрати.

Швидкий 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-ю цифрами.

Гольф:

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

Безголівки:

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

EDITS: замінено двоскладові імена змінними; зафіксував мене дурним. -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 Darn нові версії псують все! Я на RStudio працює, R version 3.1.1 (2014-07-10)і це працює чудово. Як це працює тут, чи потрібно отримати нову версію та змінити код? Також дякую за анонімну пораду функції!
м’яка подушка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.