Konvertieren Sie YYYYMM in MMMYY


54

Gestützt auf diese SO-Frage .

Die Herausforderung ist ziemlich einfach: Wenn ein Datumszeitraum im Format angegeben YYYYMMwird, wird er im Format ausgegeben MMMYY.

Regeln:

  • Die Eingabe ist eine Zahl oder eine Zeichenfolge mit einer Länge von genau 6 Zeichen, die nur aus Ziffern besteht.
  • Die letzten beiden Ziffern stehen zwischen 01und 12.
  • Die Ausgabe muss in der Form erfolgen MMMYY, in der MMMder dreistellige Großbuchstabencode für den Monat (unten) und YYdie zwei letzten Ziffern des YYYYTeils der Eingabe dargestellt werden.

Liste der Monate mit entsprechendem Code:

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

Beispiele:

Input     Output
201604    APR16
200001    JAN00
000112    DEC01
123405    MAY34

5
Diese Frage ist sehr ausgewogen. Sowohl die manuelle Analyse als auch die Datumsbibliotheken sind, zumindest in Python, ungefähr gleich.
bkul

10
Gestern habe ich auf HNQ neben dem SO-Logo "Convert YYYYMM to MMMYY" gesehen. Jetzt sehe ich den gleichen Titel neben dem PCG-Logo. Ich war sehr verwirrt :)
Katze

Antworten:


20

MATL, 18 14 13 Bytes

4e!Z{Zc12XOXk

Die Eingabe erfolgt als Zeichenfolge (in einfache Anführungszeichen eingeschlossen).

Diese Version läuft nur in MATL unter MATLAB, da MATLAB automatisch parsen kann datestr('2016 04').

Erläuterung

        % 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

Hier ist eine 18-Byte- Version, die auf Octave (und damit auf dem Online-Interpreter) funktioniert.

'yyyymm'2$YO12XOXk

Probieren Sie es online

Geänderte Version für alle Testfälle

Erläuterung

            % 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
Ich verstehe nicht, wie das so geschlagen werden kann .. gg
Adnan

20

Python 3, 70 Bytes

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

Dies nutzt die eingebauten strftimeund strptimeFunktionen.

Für 1 Byte mehr ist hier eine Version, die die Zeichenfolge manuell analysiert:

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

Dies verschlüsselt die Monatsnamen auf interessante Weise (danke an Henry Gomersall für das Speichern eines Bytes).


11
Das manuelle Parsen ist verrückt.
Morgan Thrapp

@ MorganThrapp Ich habe die Idee aus dieser Antwort .
bkul

1
Ihre manuelle Version kann in 69 Bytes in Python 2 durchgeführt werden , wenn Sie eine Zahl als Eingabe: lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4].
xnor

1
Dabei geht ein Byte verloren:lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Henry Gomersall

1
@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae - "Zeit importieren" spart 6 Zeichen, kostet aber 10 ("Zeit", zweimal)
TLW


18

PowerShell v2 +, 49 46 Bytes

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

Vielen Dank an @Joey für das Speichern von 3 Bytes!

Übernimmt die Eingabe $args[0]als explizite Zeichenfolge (z. B. '201604') über die Befehlszeileneingabe. Verwendet die string.Insert()Funktion, um ein -in das entsprechende Leerzeichen Get-Dateeinzufügen , und diese resultierende Zeichenfolge bildet eine Eingabe in das Cmdlet mit dem -UFormatparameter, der die dreimonatige Abkürzung plus das zweistellige Jahr angibt. Wir kapseln das in parens und wenden a .ToUpper()an, um die Ausgabe-Zeichenfolge zu aktivieren. Diese Zeichenfolge verbleibt in der Pipeline und das Drucken ist implizit.

Wie bereits erwähnt, ist dies auch von der Ländereinstellung abhängig. Hier sind die Gebietsschemainformationen, die ich verwende, wo dies richtig funktioniert.

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

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

Sie müssen das nicht zitieren MMMyy, da es sich um ein einfaches Argument für ein Cmdlet handelt. Du könntest auch einfach verwenden -UFormat %b%y, also -u %b%ystattdessen, was noch kürzer ist. Randnotiz: Diese Lösung ist länderspezifisch (was ich persönlich nicht mag), aber zugegebenermaßen ein bisschen länger, um das zu erklären.
Joey

Hervorragender Anruf mit dem -UFormatstatt. Vielen Dank! Ich wusste auch nichts über die Zitate MMMyy- das ist gut zu wissen für die Zukunft.
AdmBorkBork

8

Retina , 71-70 Bytes

Vielen Dank an Sp3000 für das Speichern von 1 Byte.

Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus. Der Zeilenvorschub am Ende ist signifikant.

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

R-6`.

Probieren Sie es online!

Erläuterung

Als 201604Beispiel nehmen:

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

Dies tauscht die letzten beiden Ziffern des Jahres mit dem Monat aus, während der Monat in unären Zeilenvorschüben erweitert wird und die Liste der Monate in umgekehrter Reihenfolge vorangestellt wird, sodass wir Folgendes erhalten:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

Wobei die Zeilenvorschübe darstellen (0x0A).

+`...¶

Jetzt entfernen wir wiederholt drei Nicht-Zeilenvorschub-Zeichen, gefolgt von einem Zeilenvorschub. Das heißt, für jeden Zeilenvorschub, der einen Monat darstellt, wird die Liste der Monate ab dem Ende aufgefressen:

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

Aus diesem Grund haben wir Folgendes eingefügt XXX: Da die Monate ab zählen 1, werden auch für Januar immer mindestens drei Zeichen entfernt.

R-6`.

Zum Schluss entfernen wir alles bis zum 6. Zeichen vom Ende. Mit anderen Worten, wir behalten nur die letzten fünf Zeichen.


Das ist ziemlich schlau.
AdmBorkBork

7

CJam, 50 46 Bytes

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

Probieren Sie es online aus. Vielen Dank an Martin Ender für das Komprimieren des Strings, um ein paar Bytes zu sparen.

Erläuterung

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 Zeichen (161 Byte)

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

Angenommen, jeder Monatsname (JAN, FEB usw.) ist eine Zahl in der Basis 36 und codiert sie in das entsprechende Unicode-Symbol. Holen Sie sich dann das entsprechende Symbol aus der Zeichenfolge und codieren Sie es erneut in Basis 36 und anschließend in einige einfache Zeichenfolgenmanipulationen.

Leicht ungolfed:

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
}

Sie können es hier sehen: https://ideone.com/IKlnPY


5

Python, 83 Bytes

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

Ich habe gerade eine Antwort gepostet, die fast mit Ihrer identisch ist. Ich habe deins nicht gesehen, weil es eine Weile gedauert hat, die Antwort zu schreiben. Wenn Sie möchten, dass ich meine lösche, werde ich es tun, oder Sie können meine verwenden, um ein paar zusätzliche Bytes zu entfernen.
bkul

1
Das ist in Ordnung, du hast mich um 13 Bytes geschlagen, ich gebe zu. Ich mag auch Ihre manuelle Antwort.
Atlasologe

5

Kotlin, 100 Bytes

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

Sehr einfache Verwendung von Java SimpleDateFormat


1
Hmm, ich kenne Kotlin nicht, aber da es von Java abgeleitet ist, sollten Sie nicht den Import von SimpleDateFormat(ie import java.text.*;) mit einbeziehen?
Kevin Cruijssen

Da die Aufforderung zur Ausgabe auffordert, gehe ich davon aus, dass ein Ausdruck als Teil Ihrer Funktion erforderlich ist.
JohnWells

5

MATLAB / Octave, 42 Bytes

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

Erzeugt eine anonyme Funktion mit dem Namen ans, der mit einem String aufgerufen wird , die das Datum: ans('201604').

Online Demo

Diese Lösung datenumkonvertiert das Eingabedatum in eine Seriennummer und gibt dann datestrmit der vordefinierten Ausgabespezifikation von mmmyy( 12) die Zeichenfolgendarstellung im erforderlichen Format aus. Schließlich verwenden wir upper, um es zu ändern, MMMYYda der Monat in Großbuchstaben keine Ausgabeoption ist.


1
Wow, gj, wenn du alle anderen in einer nicht-golfenden Sprache schlägst!
Downgoat

5

05AB1E, 51 42 41 Bytes

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

Erläuterung

                                           # 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

Probieren Sie es online aus

Dank String-Komprimierung 9 Bytes gespart, mit freundlicher Genehmigung von @Adnan


1
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35Bstatt "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"spart 9 Bytes.
Adnan

5

JavaScript, 87 84 80 79 Bytes

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

Um den Monat zu erhalten, wird das Datum (das aus "JJJJMM" und "JJJJ-MM" besteht) berechnet und die Zeichen 5 bis 8 abgerufen, die genau die ersten drei Buchstaben des Monats sind. Aber es kostet viel, es in Großbuchstaben umzuwandeln.

Demo:

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


Zuerst sollte seinAPR16
Downgoat

@Upgoat Und was erscheint für dich?
Nicael

1
Ich bekommeMAR16
Downgoat

@Upgoat Huh, das ist komisch, warum könnte es so sein? Weil ich das verstehe .
Nicael

Für mich zeigt es APR16, aber der dritte Testfall zeigt nur DECfür mich.
Adnan

4

Julia, 57 56 53 Bytes

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

Dies ist eine anonyme Funktion, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.

Zuerst konstruieren wir ein DateTimeObjekt mit dem Typkonstruktor und einem Formatstring. Beachten Sie, dass die mZiffer in der Formatzeichenfolge sowohl ein- als auch zweistellige Monate enthält, obwohl der erstere Fall hier keine Rolle spielt. Da keine Tage angegeben sind, wird der erste des Monats angenommen.

Mit der Dates.formatFunktion aus dem Base.DatesSubmodul können wir den Wert dann als String formatieren . Die Zeichenfolge uyyerhält den dreistelligen Monatsnamen und das zweistellige Jahr, das Ergebnis wird jedoch in Groß- und Kleinschreibung ausgegeben, z. B. Apr16 anstelle des gewünschten APR16 uppercase.

Probieren Sie es online! (beinhaltet alle Testfälle)


4

C 147 145 112 Bytes

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

Online-Demo

Danke ugoren !


2
Einige billige Tricks - löschen Sie die #include, mals Parameter definieren - main(m),
ugoren

2
Das %.3sFormat speichert auch die Nullterminierung.
Ugoren

Danke @ugoren! Ich wechselte auch "%4s%2d"zu "%4s%d".
Marco

main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}viel kürzer
l4m2

4

JavaScript ES6, 77 66 Bytes

11 Bytes gespart dank @ Bálint!

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

Rufen Sie das Datum ab, indem Sie den von der DateKlasse zurückgegebenen String extrahieren . Dann wird das Jahr großgeschrieben und hinzugefügt.

ES5-Version:

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


Ich habe eins von 66 Bytes mit der gleichen Atob-Technik erstellt, aber ich kann es nicht kopieren
Bálint

@ Bálint Ich dachte, ich hätte auch 66 Bytes, aber unser
Bytezähler

Sie könnten den Namen des Monats mit(Date(0,a[4]- -a[5])+"").substr(4,3)
Bálint

1
Ich verstehe das nicht a[4]- -a[5]. Was war los mit 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 Bytes

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

7 Byte mit C # 6-Syntax gespeichert.

Versuchen Sie es online


Sie können die Rückgabetypinformationen für Lambdas C(string s)=>...
cat


3

Java 8, 154 113 Bytes

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

Erläuterung:

Probieren Sie es online aus.

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

Ich denke, Sie können es verkürzen, wenn Sie den Import entfernen und stattdessen direkt darauf verweisen java.text.SimpleDateFormat.
Frozn

2
@Frozn Tatsächlich sind import java.text.*;es 19 Bytes und zweimal java.text.vor beiden SimpleDateFormat20 Bytes. Es würde also um 1 Byte zunehmen, anstatt es zu verringern.
Kevin Cruijssen

Oh ja, du hast recht. Ich schaue immer auf die ungolfed Version und denke, dass es dem golfed gleichkommt. Es tut uns leid :)
Frozn

@Frozn Ah, auch ein bisschen schlecht. Normalerweise verwende ich immer noch .*;für den ungolfed Code, aber dieses Mal habe ich ihn anscheinend vernachlässigt. Ich habe Speicheroptionen, die es automatisch in reine Importe konvertieren, da ich Java in meinem Job verwende, und ich habe einfach vergessen, es zu ändern import java.text.*;.
Kevin Cruijssen

2

Oracle SQL, 49 Bytes

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

Die Daten müssen in eine Tabelle eingefügt werden, die Tmit einer Spalte Nvom Typ aufgerufen wird VARCHAR2(6), CHAR(6)oder nur, wenn alle Jahre> 1000 sind. NUMBER

Verwendungszweck:

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;

Wäre es möglich, PRINT anstelle von SELECT zu verwenden und stattdessen eine Variable als Eingabe für die Tabelle zu verwenden? Das Deklarieren der Eingabevariable und das Zuweisen des Werts haben keinen Einfluss auf die Anzahl der Bytes
t-clausen.dk

Darf man Eingaben von einer Tabelle nehmen? Die Codegolf-Tag-Informationen deuten darauf hin, dass nein.
Pajonk

@ t-clausen.dk Der kürzeste Weg zum Drucken ist 58 Zeichen: begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print nund Sie benötigen 42 zusätzliche Zeichen für eine einzige Eingabe ( VARIABLE n varchar2;BEGIN:n:='201605';END;) anstelle von 31 ( insert into t values('000112');). Wenn Sie kürzere Wege haben, teilen Sie mir dies bitte mit.
Giacomo Garabello

@ Pajonk in dieser Antwort sagt mir niemand etwas über die Verwendung von Tabellen
Giacomo Garabello

1
@pajonk nach dieser , können Sie Tabellen für die Eingabe verwenden
t-clausen.dk

2

Microsoft SQL Server, 57 Bytes

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

Die UpperFunktion ist erforderlich, da das Format keine Monate in Großbuchstaben erzeugt, wie dies mit dem MMM- Formatmuster zu erwarten ist.

Verwendungszweck:

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

Habe gerade deine Antwort gesehen, sie ist meiner sehr ähnlich, habe sie bis jetzt nicht bemerkt, habe meine Antwort entfernt
t-clausen.dk

Darf man Eingaben von einer Tabelle nehmen? Die Codegolf-Tag-Informationen deuten darauf hin, dass nein.
Pajonk

@pajonk Die Antwort hier verwendet keine Eingabe aus einer Tabelle, die Antwort ist die oberste Zeile und die Eingabevariable ist fest codiert. Beachten Sie, dass Sie, wie bereits erwähnt, Tabellen als Eingabevariablen verwenden können. Der untere Teil ist ein Beispiel für die Konvertierung mehrerer Werte. TSQL hat weder STDIN noch Eingabeanweisungen. Zum Hinzufügen von Daten können nur Variablen oder Tabellen verwendet werden. Alle meine Antworten verwenden diese für die Eingabe
t-clausen.dk

Ok, danke für die Klarstellung.
Pajonk

2

Pyth, 45 Bytes

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

Probieren Sie es online!

Erläuterung:

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

Die gepackte Zeichenfolge enthält "JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC". Die beiden JANs sind so, dass ich es pseudo-eins-indiziert indizieren kann.

BEARBEITEN: Fehler behoben, der bei TIO auftrat


2

R , 65 Bytes

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

Probieren Sie es online!

Nimmt die Eingabe als String und nutzt die Konstante month.abb. Verwendet den Modul und substr, um relevante Werte zu extrahieren.


kluger Gebrauch von :zu konvertieren integer!
Giuseppe

@ Giuseppe Nicht meine Idee :) Ich habe es von hier genommen . Ich kann es wahrscheinlich auf eine Reihe meiner vorhandenen Antworten anwenden!
JayCe

@ Giuseppe Ich habe gerade einen kürzeren Hack mit el- 1 weniger Byte gefunden.
JayCe

1

J, 70 Bytes

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

Verwendungszweck

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

Erläuterung

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

Pyth, 39 Bytes

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

Testsuite.


1

jq, 35 Zeichen

(34 Zeichen Code + 1 Zeichen Befehlszeilenoption.)

( Ich habe gerade versucht, ob der ^von Digital Trauma in seiner Bash-Antwort verwendete Trick auch in jq funktioniert. Funktioniert. Jetzt wissen Sie, wer den wichtigsten Charakter dieser Antwort inspiriert hat. (Die Alternative besteht darin, die ascii_upcaseFunktion zu verwenden.)

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

Probelauf (Option, -Rdie nur in diesem Beispiel verwendet wird, um alle Testfälle zu bestehen.)

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

Online-Test: (Das Übergeben von -R über URL wird nicht unterstützt. Daher wird die Eingabe als JSON-Zeichenfolgenliteral übergeben. Das Übergeben -rvon URL wird nicht unterstützt. Überprüfen Sie die Raw-Ausgabe selbst.)


1

Faktor 82 - 78 Bytes

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

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

Das "Jahr-2038-Problem" kann auf einigen Computern wie hier auftreten . Aber nicht bei anderen, wie hier .


@Titus, bitte versuchen Sie nicht, die Beiträge anderer Leute zu bearbeiten, wenn es Probleme gibt, und fügen Sie Ihre eigenen Lösungen ein. Bitte kommentieren Sie stattdessen die Antwort ODER erstellen Sie selbst eine neue Antwort.
Value Ink

1

Swift 2.2, 149 Bytes

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

Der Versuch, dies kürzer als Kotlin zu machen ... Es ist eine Schande, dass NSDateFormatteres keinen Initialisierer gibt, der das setzt dateFormat. NSDateFormatterhat auch keinen Standardwert dateFormat, was zu zusätzlichen Verlusten führt.

Schnelle 3, 136 Bytes

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

Dank der Entfernung des NSPräfixes in einigen Klassen konnte ich die Antwort von Swift 3 etwas kürzer machen. Immer noch nicht kürzer als Kotlin ...

Testfunktion und Fälle:

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 Bytes

Nimmt die sechsstellige Eingabe in "b" auf, trennt die ersten vier Ziffern von den letzten zwei Ziffern, verkürzt den zweistelligen Monat und macht ihn groß und verknüpft ihn mit der dritten und vierten Ziffer.

Golf gespielt:

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

EDITS: doppelte Namen durch Variablen ersetzt; hat mich dumm gemacht. -2 Bytes durch anonyme Funktion drehen (danke, cat).


Gute Antwort! Sie können das a=für eine anonyme Funktion
Katze

@cat Ich kenne mich mit anonymen Funktionen nicht so gut aus, aber müsste ich am Anfang und am Ende der Funktion keine Klammern setzen, wenn ich die entferne a=? So etwas in der Art: (function(m) {a=3;m*a})(10)
ein weiches Kissen

1
Nein, 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="")}ist ein Funktionsobjekt für sich.
Katze

Dies scheint nicht zu funktionieren. am RStudio with R 3.2.3 (2015-12-10)bekomme ichError in i(o, b) : invalid format '%06d'; use format %s for character objects
Katze

@cat Verdammt neue Versionen, die alles vermasseln! Ich bin auf RStudio R version 3.1.1 (2014-07-10)und es funktioniert gut. Wie funktioniert das hier? Soll ich die neue Version herunterladen und den Code ändern? Danke auch für den anonymen Funktionstipp!
ein weiches Kissen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.