Konwertuj RRRRMM na MMMRR

54

Na podstawie tego SO pytania .

Wyzwanie jest raczej proste: biorąc pod uwagę okres w formacie, YYYYMMwypisz go w formacie MMMYY.

Zasady:

  • Wejście będzie liczbą lub łańcuchem o długości dokładnie 6 znaków, składającym się wyłącznie z cyfr.
  • Ostatnie dwie cyfry będą pomiędzy 01i 12.
  • Dane wyjściowe muszą być w postaci MMMYY, w której MMMreprezentują trzyliterowy kod wielkiej litery dla miesiąca (poniżej) i YYreprezentują dwie ostatnie cyfry YYYYczęści danych wejściowych.

Lista miesięcy z odpowiednim kodem:

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

Przykłady:

Input     Output
201604    APR16
200001    JAN00
000112    DEC01
123405    MAY34
pajonk
źródło
5
To pytanie jest bardzo dobrze wyważone. Zarówno ręczne parsowanie, jak i biblioteki dat są w przybliżeniu takie same, przynajmniej w Pythonie.
bkul
10
Wczoraj widziałem „Konwertuj RRRRMM na MMMRR” na HNQ obok logo SO. Teraz widzę ten sam tytuł obok logo PCG. Byłem bardzo zdezorientowany :)
kot

Odpowiedzi:

20

MATL, 18 14 13 bajtów

4e!Z{Zc12XOXk

Dane wejściowe są dostarczane jako ciąg znaków (ujęte w pojedyncze cudzysłowy).

Ta wersja działa tylko w MATLAB na MATLAB, ponieważ MATLAB jest w stanie automatycznie parsować datestr('2016 04').

Wyjaśnienie

        % 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

Oto 18-bajtowa wersja, która działa na Octave (a zatem na interpreter online)

'yyyymm'2$YO12XOXk

Wypróbuj online

Zmodyfikowana wersja dla wszystkich przypadków testowych

Wyjaśnienie

            % 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
Suever
źródło
3
Nie rozumiem, jak można to pokonać, więc .. gg
Adnan
20

Python 3, 70 bajtów

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

Ten wykorzystuje wbudowany in strftimei strptimefunkcje.

Aby uzyskać 1 bajt więcej, oto wersja, która ręcznie analizuje ciąg:

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

W ciekawy sposób koduje to nazwy miesięcy (dzięki Henry Gomersall za uratowanie bajtu).

bkul
źródło
11
To ręczne analizowanie jest szalone.
Morgan Thrapp
@MorganThrapp Mam pomysł z tej odpowiedzi .
bkul
1
Twoja instrukcja wersję można zrobić w 69 bajtów w Pythonie 2, jeśli wziąć numer jako wejście: lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4].
xnor
1
Chociaż traci to bajt:lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Henry Gomersall
1
@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae - „czas importu” pozwoliłby zaoszczędzić 6 znaków, ale kosztowałby 10 („czas”, dwa razy)
TLW
18

PowerShell v2 +, 49 46 bajtów

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

Dzięki @Joey za zapisanie 3 bajtów!

Pobiera dane wejściowe $args[0]jako jawny ciąg znaków (np. '201604') Za pośrednictwem wiersza poleceń. Używa string.Insert()funkcji do umieszczenia znaku a -w odpowiednim miejscu, a wynikowy ciąg znaków wprowadza dane wejściowe do polecenia Get-Datecmdlet z -Uparametrem format określającym trzymiesięczny skrót plus dwucyfrowy rok. Hermetyzujemy to w parens i dodajemy do a, .ToUpper()aby ciąg wyjściowy był pisany wielką literą. Ten ciąg jest pozostawiony w potoku, a drukowanie jest niejawne.

Jak już wspomniano, jest to zależne od ustawień regionalnych. Oto informacje o ustawieniach regionalnych, których używam tam, gdzie to działa poprawnie.

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

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)
AdmBorkBork
źródło
Nie musisz cytować MMMyy, ponieważ jest to prosty argument polecenia cmdlet. Możesz także użyć -UFormat %b%y, czyli -u %b%yzamiast tego, co jest jeszcze krótsze. Uwaga dodatkowa: To rozwiązanie jest wrażliwe na ustawienia regionalne (co osobiście mi się nie podoba), ale trzeba by to nieco dłużej wyjaśnić.
Joey,
-UFormatZamiast tego doskonałe połączenie . Dzięki! Nie wiedziałem też o cytatach wokół MMMyy- dobrze wiedzieć na przyszłość.
AdmBorkBork
8

Siatkówka , 71 70 bajtów

Dzięki Sp3000 za oszczędność 1 bajtu.

Liczba bajtów zakłada kodowanie ISO 8859-1. Końcowe podawanie linii jest znaczące.

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

R-6`.

Wypróbuj online!

Wyjaśnienie

Biorąc 201604jako przykład:

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

To zamienia dwie ostatnie cyfry roku z miesiącem, jednocześnie rozszerzając miesiąc w unary przy użyciu linii i przygotowując listę miesięcy w odwrotnej kolejności, aby uzyskać:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

Gdzie reprezentują kanały (0x0A).

+`...¶

Teraz kilkakrotnie usuwamy trzy znaki nieciągłe, a następnie dosuwane. Oznacza to, że zjadamy listę miesięcy od końca dla każdego kanału reprezentującego miesiąc:

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

Dlatego właśnie to umieściliśmy XXX: ponieważ miesiące zaczynają się liczyć 1, zawsze usuwamy co najmniej trzy znaki, nawet w styczniu.

R-6`.

Na koniec usuwamy wszystko do szóstej postaci od końca. Innymi słowy, zachowujemy tylko ostatnie pięć znaków.

Martin Ender
źródło
To całkiem mądre.
AdmBorkBork
7

CJam, 50 46 bajtów

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

Wypróbuj online. Podziękowania dla Martina Endera za skompresowanie ciągu w celu zaoszczędzenia kilku bajtów.

Wyjaśnienie

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
NinjaBearMonkey
źródło
6

Java 7, 137 znaków (161 bajtów)

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

Rozważmy, że nazwa każdego miesiąca (JAN, FEB itp.) Jest liczbą w bazie 36 i koduje ją do odpowiedniego symbolu Unicode. Następnie pobierz odpowiedni symbol z łańcucha i zakoduj go ponownie w bazie 36, a następnie kilka prostych operacji na łańcuchu.

Nieznacznie nie golfista:

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
}

Możesz zobaczyć, jak działa tutaj: https://ideone.com/IKlnPY

Cliffroot
źródło
5

Python, 83 bajty

from datetime import*
lambda x:datetime.strptime(x,'%Y%m').strftime('%b%y').upper()
atlasolog
źródło
Właśnie zamieściłem odpowiedź prawie identyczną z twoją. Nie widziałem twojego, ponieważ napisanie odpowiedzi zajęło trochę czasu. Jeśli chcesz, żebym usunął mój, zrobię to, lub możesz użyć mojego, aby usunąć dodatkowe bajty.
bkul
1
W porządku, pobiłeś mnie o 13 bajtów, przyznaję. Podoba mi się również Twoja ręczna odpowiedź.
atlasolog
5

Kotlin, 100 bajtów

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

Dość proste użycie Java SimpleDateFormat

Rames
źródło
1
Hmm, nie znam Kotlina, ale skoro pochodzi on z Javy, czy nie powinieneś dołączyć importu SimpleDateFormat(tj. import java.text.*;)?
Kevin Cruijssen
Ponieważ wyzwanie wymaga danych wyjściowych, zakładam, że wydruk jest wymagany jako część twojej funkcji.
JohnWells,
5

MATLAB / oktawa, 42 bajty

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

Tworzy anonimowa funkcja o nazwie ans, która jest wywoływana z ciągiem reprezentującym datę: ans('201604').

Demo online

To rozwiązanie wykorzystuje datenumdo konwersji daty wejściowej na numer daty seryjnej, a następnie datestrze wstępnie zdefiniowaną specyfikacją wyjściową mmmyy( 12) w celu uzyskania reprezentacji ciągu w wymaganym formacie. Na koniec używamy, upperaby to zmienić, MMMYYponieważ duży miesiąc nie jest opcją wyjściową.

Suever
źródło
1
Wow, gj na bicie wszystkich w języku innym niż golf!
Downgoat
5

05AB1E, 51 42 41 bajtów

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

Wyjaśnienie

                                           # 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

Wypróbuj online

9 bajtów zapisanych dzięki kompresji ciągów, dzięki uprzejmości @Adnan

Emigna
źródło
1
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35Bzamiast "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"zapisuje 9 bajtów.
Adnan
5

JavaScript, 87 84 80 79 bajtów

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

Aby uzyskać miesiąc, pobiera datę (która składa się z „RRRRMM” przekonwertowaną na „RRRR-MM”) i pobiera znaki od 5 do 8, czyli dokładnie trzy pierwsze litery miesiąca. Ale przekształcenie go na wielkie litery kosztuje dużo.

Próbny:

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

Nicość
źródło
Najpierw powinno byćAPR16
Downgoat
@Upgoat A co się dla ciebie pojawia?
Nicola
1
DostajęMAR16
Downgoat
@Upgoat Huh, to dziwne, dlaczego mogło być tak? Ponieważ to rozumiem .
Nicola
Dla mnie to pokazuje APR16, ale trzeci przypadek testowy pokazuje tylko DECdla mnie.
Adnan
4

Julia, 57 56 53 bajtów

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

Jest to anonimowa funkcja, która przyjmuje ciąg i zwraca ciąg. Aby go wywołać, przypisz go do zmiennej.

Najpierw konstruujemy DateTimeobiekt za pomocą konstruktora typu i ciągu formatu. Zauważ, że singiel mw ciągu formatu otrzyma jedno- i dwucyfrowe miesiące, choć poprzedni przypadek nie ma tu znaczenia. Ponieważ nie określono żadnych dni, zakłada się pierwszy dzień miesiąca.

Następnie możemy sformatować wartość jako ciąg za pomocą Dates.formatfunkcji z Base.Datessubmodułu. Ciąg uyyotrzymuje trzyliterową nazwę miesiąca i dwucyfrowy rok, ale wynik jest w tytule, np. Apr16 zamiast pożądanego APR16, więc musimy to uppercasezrobić.

Wypróbuj online! (obejmuje wszystkie przypadki testowe)

Alex A.
źródło
4

C, 147 145 112 bajtów

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

Demo online

Dzięki ugoren !

Marco
źródło
2
Niektóre tanie sztuczki - usuń #include, zdefiniuj mjako parametr - main(m),
ugoren
2
Ponadto %.3sformat zapisuje zerowe zakończenie.
ugoren
Dzięki @ugoren! Zmieniłem również "%4s%2d"na "%4s%d".
Marco
main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}dużo krótszy
l4m2
4

JavaScript ES6, 77 66 bajtów

Zaoszczędź 11 bajtów dzięki @ Bálint!

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

Uzyskaj datę, wyodrębniając ciąg zwrócony przez Dateklasę. następnie dodaje wielkie litery i dodaje rok.

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

Downgoat
źródło
Zrobiłem jeden na 66 bajtów tą samą techniką atob, ale nie mogę go skopiować
Bálint
@ Bálint Myślałem, że mam również 66 bajtów, ale okazało się, że nasz licznik bajtów był nieprawidłowy z powodu złego wklejania kopii;)
Downgoat
Nazwę miesiąca można uzyskać za pomocą(Date(0,a[4]- -a[5])+"").substr(4,3)
Bálint
1
Nie rozumiem, że a[4]- -a[5]. Co było nie tak a[4]+a[5]-1?
Neil
1
new Date(0,a[4]+a[5]-1)+""=>new Date(0,a[4]+a[5]-1)+0
l4m2
3

C #, 94 87 bajtów

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

Zapisano 7 bajtów przy użyciu składni C # 6.

Wypróbuj online

raznagul
źródło
Możesz pominąć informację o typie zwrotu dla lambdas, tj.C(string s)=>...
cat
3

Java 8, 154 113 bajtów

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

Wyjaśnienie:

Wypróbuj online.

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
Kevin Cruijssen
źródło
Myślę, że możesz go skrócić, jeśli usuniesz import i zamiast tego bezpośrednio do niego odniesiesz java.text.SimpleDateFormat.
Frozn
2
@ Frozn Właściwie import java.text.*;to 19 bajtów, a dwa razy java.text.przed nimi SimpleDateFormat20 bajtów. Więc zwiększy się o 1 bajt zamiast go obniżyć.
Kevin Cruijssen
O tak, masz rację. Zawsze patrzę na wersję bez golfa i myślę, że jest ona równa wersji z golfem. Przepraszamy :)
Frozn
@Frozn Ah, też trochę źle. Zwykle nadal używam .*;nielepszonego kodu, ale tym razem chyba go zaniedbałem. Mam opcje zapisywania, które automatycznie konwertują go na czysty import, odkąd korzystam z Javy w swojej pracy i po prostu zapomniałem go zmienić na import java.text.*;...
Kevin Cruijssen
2

Oracle SQL, 49 bajtów

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

Dane te muszą być umieszczone w tabeli o nazwie Tz kolumną Ntypu VARCHAR2(6), CHAR(6)lub tylko wtedy, gdy wszystkie lata jest> 1000, NUMBER

Stosowanie:

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;
Giacomo Garabello
źródło
Czy byłoby możliwe użycie PRINT zamiast SELECT i nie odwołanie się do tabeli przy użyciu zmiennej jako danych wejściowych? Zadeklarowanie zmiennej wejściowej i przypisanie wartości nie wpływa na liczbę bajtów
t-clausen.dk
Czy wolno pobierać dane z tabeli? Informacji tag codegolf sugeruje, że nie.
pajonk
@ t-clausen.dk najkrótsza droga z użyciem print to 58 znaków: begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print npotrzebujesz 42 dodatkowych znaków dla pojedynczego wejścia ( VARIABLE n varchar2;BEGIN:n:='201605';END;) zamiast 31 ( insert into t values('000112');), jeśli masz krótsze sposoby, proszę powiedz mi.
Giacomo Garabello,
@pajonk w tej odpowiedzi nikt nie powiedział mi nic o używaniu stołów
Giacomo Garabello
1
@pajonk zgodnie z tym , możesz użyć tabel do wprowadzania danych
t-clausen.dk
2

Microsoft SQL Server, 57 bajtów

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

Ta Upperfunkcja jest wymagana, ponieważ format nie generuje wielkich liter miesięcy, jak można by oczekiwać w przypadku wzorca formatu MMM .

Stosowanie:

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
NY
źródło
Właśnie zobaczyłem twoją odpowiedź, jest bardzo podobna do mojej, nie zauważyłem jej do tej pory, usunąłem moją odpowiedź
t-clausen.dk
Czy wolno pobierać dane z tabeli? Informacji tag codegolf sugeruje, że nie.
pajonk
@pajonk tutaj odpowiedź nie korzysta z danych wejściowych z tabeli, odpowiedź jest górnym wierszem, a zmienna wejściowa jest zakodowana na stałe. Zauważ, że możesz używać tabel jako zmiennych wejściowych, jak wspomniałem wcześniej. Dolna część to przykład konwersji kilku wartości. TSQL nie ma STDIN ani instrukcji wejściowych. Jedynym sposobem dodawania danych jest użycie zmiennych lub tabel. Wszystkie moje odpowiedzi używają tych do wprowadzania danych
t-clausen.dk
Ok, dzięki za wyjaśnienie.
pajonk
2

Pyth, 45 bajtów

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

Wypróbuj online!

Wyjaśnienie:

+:."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).

Zapakowany ciąg zawiera "JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC". Oba JANsą tak, że mogę indeksować pseudo-jeden indeksowany.

EDYCJA: Naprawiono błąd, który bałaganił w TIO

ericeschnei
źródło
2

R , 65 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako ciąg znaków, wykorzystuje stałą month.abb. Wykorzystuje moduł i substrwyodrębnia odpowiednie wartości.

JayCe
źródło
sprytne użycie :do konwersji na integer!
Giuseppe,
@Giuseppe Nie mój pomysł :) Zabrałem go stąd . Prawdopodobnie mogę to zastosować do wielu moich istniejących odpowiedzi!
JayCe
@Giuseppe Właśnie znalazłem krótszy hack przy użyciu el- 1 mniej bajtu.
JayCe
1

J, 70 bajtów

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

Stosowanie

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

Wyjaśnienie

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
mile
źródło
1

Pyth, 39 bajtów

Hexdump:

0000000: 2b 40 63 2e 22 41 59 12 56 0a 7c bd 93 e3 1c 07 +@c."AY.V.|.....
0000010: e3 d4 d9 ed 5b 49 02 cd b4 92 83 86 22 33 73 3e ....[I......"3s>
0000020: 32 7a 3a 7a 32 20 34                            2z:z2 4

Zestaw testowy.

Leaky Nun
źródło
1

jq, 35 znaków

(Kod 34 znaków + opcja wiersza poleceń 1 znak).

(Właśnie sprawdziłem, czy ^sztuczka zastosowana przez Digital Trauma w jego odpowiedzi Bash działa również w jq. Działa. Teraz już wiesz, kto zainspirował najważniejszą postać tej odpowiedzi. (Alternatywą jest użycie ascii_upcasefunkcji.))

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

Przebieg próbny (Opcja -Rużywana tylko w tej próbce, aby przejść wszystkie przypadki testowe.)

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

Test online: (Przekazywanie -R przez URL nie jest obsługiwane - więc dane wejściowe są przekazywane jako literał JSON. Przekazywanie -rprzez URL nie jest obsługiwane - sprawdź sam Dane wyjściowe Raw).

człowiek w pracy
źródło
1

Współczynnik, 82 78 bajtów

[ [ 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
kot
źródło
1

PHP, 78 bajtów

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

„Problem roku 2038” może wystąpić na niektórych komputerach, jak tutaj . Ale nie w innych, jak tutaj .

Marco
źródło
@Titus, nie próbuj edytować postów innych ludzi, jeśli występują problemy i wstaw własne rozwiązania; zamiast tego proszę o komentarz do odpowiedzi LUB utwórz nową odpowiedź samodzielnie.
Wartość tuszu
1

Swift 2.2, 149 bajtów

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

Próba skrócenia tego do Kotlina ... Szkoda, NSDateFormatterże nie ma inicjalizatora, który to ustawia dateFormat. NSDateFormatterrównież nie ma dateFormatwartości domyślnej , powodując dodatkowe straty.

Swift 3, 136 bajtów

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

Dzięki usunięciu NSprzedrostka w niektórych klasach byłem w stanie sprawić, że Swift 3 odpowiedział nieco krócej. Nadal nie krótszy niż Kotlin ...

Funkcja testowa i przypadki:

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")
JAL
źródło
1

R, 154 150 114 112 bajtów

Pobiera sześciocyfrowy wpis do „b”, oddziela pierwsze cztery cyfry od dwóch ostatnich cyfr, skraca 2-cyfrowy miesiąc i czyni go wielkimi literami i łączy go z trzecią i czwartą cyfrą.

Gra w golfa:

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

Nie golfowany:

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

EDYCJE: zastąpiono podwójne nazwy zmiennymi; naprawiłem, że jestem głupi. -2 bajty, zmieniając funkcję na anonimową (dzięki, cat).

miękka poduszka
źródło
Niezła odpowiedź! Możesz zrezygnować z a=anonimowej funkcji
cat
@cat Nie znam zbytnio anonimowych funkcji, ale czy nie muszę dodawać nawiasów na początku i na końcu funkcji, jeśli usunę a=? Coś w tym rodzaju: (function(m) {a=3;m*a})(10)
miękka poduszka
1
Nie, 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="")}to obiekt funkcyjny sam w sobie.
kot
To nie wydaje się działać. na RStudio with R 3.2.3 (2015-12-10)otrzymujęError in i(o, b) : invalid format '%06d'; use format %s for character objects
kot
@cat Darn nowe wersje psują wszystko! Korzystam z RStudio R version 3.1.1 (2014-07-10)i działa dobrze. Jak to działa tutaj, czy powinienem pobrać nową wersję i zmienić kod? Dziękujemy również za anonimową wskazówkę dotyczącą funkcji!
miękka poduszka