Gestützt auf diese SO-Frage .
Die Herausforderung ist ziemlich einfach: Wenn ein Datumszeitraum im Format angegeben YYYYMM
wird, 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
01
und12
. - Die Ausgabe muss in der Form erfolgen
MMMYY
, in derMMM
der dreistellige Großbuchstabencode für den Monat (unten) undYY
die zwei letzten Ziffern desYYYY
Teils 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
Antworten:
MATL,
181413 BytesDie 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
Hier ist eine 18-Byte- Version, die auf Octave (und damit auf dem Online-Interpreter) funktioniert.
Probieren Sie es online
Geänderte Version für alle Testfälle
Erläuterung
quelle
Python 3, 70 Bytes
Dies nutzt die eingebauten
strftime
undstrptime
Funktionen.Für 1 Byte mehr ist hier eine Version, die die Zeichenfolge manuell analysiert:
Dies verschlüsselt die Monatsnamen auf interessante Weise (danke an Henry Gomersall für das Speichern eines Bytes).
quelle
lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4]
.lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Bash + Coreutils, 18
Erfordert eine 64-Bit-Version von
date
für die angegebenen Testfälle, die Daten vor dem 14. Dezember 1901 erkennt .quelle
PowerShell v2 +,
4946 BytesVielen 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 diestring.Insert()
Funktion, um ein-
in das entsprechende LeerzeichenGet-Date
einzufügen , und diese resultierende Zeichenfolge bildet eine Eingabe in das Cmdlet mit dem-U
Formatparameter, 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.
quelle
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%y
stattdessen, 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.-UFormat
statt. Vielen Dank! Ich wusste auch nichts über die ZitateMMMyy
- das ist gut zu wissen für die Zukunft.Retina ,
71-70BytesVielen 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.
Probieren Sie es online!
Erläuterung
Als
201604
Beispiel nehmen: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:
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:
Aus diesem Grund haben wir Folgendes eingefügt
XXX
: Da die Monate ab zählen1
, werden auch für Januar immer mindestens drei Zeichen entfernt.Zum Schluss entfernen wir alles bis zum 6. Zeichen vom Ende. Mit anderen Worten, wir behalten nur die letzten fünf Zeichen.
quelle
CJam,
5046 BytesProbieren Sie es online aus. Vielen Dank an Martin Ender für das Komprimieren des Strings, um ein paar Bytes zu sparen.
Erläuterung
quelle
Bash,
3928 BytesVielen Dank, Digital Trauma !
quelle
Java 7, 137 Zeichen (161 Byte)
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:
Sie können es hier sehen: https://ideone.com/IKlnPY
quelle
Python, 83 Bytes
quelle
Kotlin, 100 Bytes
Sehr einfache Verwendung von Java SimpleDateFormat
quelle
SimpleDateFormat
(ieimport java.text.*;
) mit einbeziehen?MATLAB / Octave, 42 Bytes
Erzeugt eine anonyme Funktion mit dem Namen
ans
, der mit einem String aufgerufen wird , die das Datum:ans('201604')
.Online Demo
Diese Lösung
datenum
konvertiert das Eingabedatum in eine Seriennummer und gibt danndatestr
mit der vordefinierten Ausgabespezifikation vonmmmyy
(12
) die Zeichenfolgendarstellung im erforderlichen Format aus. Schließlich verwenden wirupper
, um es zu ändern,MMMYY
da der Monat in Großbuchstaben keine Ausgabeoption ist.quelle
05AB1E,
514241 BytesErläuterung
Probieren Sie es online aus
Dank String-Komprimierung 9 Bytes gespart, mit freundlicher Genehmigung von @Adnan
quelle
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B
statt"JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
spart 9 Bytes.JavaScript,
87848079 BytesUm 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:
quelle
APR16
MAR16
APR16
, aber der dritte Testfall zeigt nurDEC
für mich.Julia,
575653 BytesDies 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
DateTime
Objekt mit dem Typkonstruktor und einem Formatstring. Beachten Sie, dass diem
Ziffer 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.format
Funktion aus demBase.Dates
Submodul können wir den Wert dann als String formatieren . Die Zeichenfolgeuyy
erhält den dreistelligen Monatsnamen und das zweistellige Jahr, das Ergebnis wird jedoch in Groß- und Kleinschreibung ausgegeben, z. B. Apr16 anstelle des gewünschten APR16uppercase
.Probieren Sie es online! (beinhaltet alle Testfälle)
quelle
C
147145112 BytesOnline-Demo
Danke ugoren !
quelle
#include
,m
als Parameter definieren -main(m)
,%.3s
Format speichert auch die Nullterminierung."%4s%2d"
zu"%4s%d"
.main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}
viel kürzerJavaScript ES6,
7766 Bytes11 Bytes gespart dank @ Bálint!
Rufen Sie das Datum ab, indem Sie den von der
Date
Klasse zurückgegebenen String extrahieren . Dann wird das Jahr großgeschrieben und hinzugefügt.ES5-Version:
quelle
(Date(0,a[4]- -a[5])+"").substr(4,3)
a[4]- -a[5]
. Was war los mita[4]+a[5]-1
?new Date(0,a[4]+a[5]-1)+""
=>new Date(0,a[4]+a[5]-1)+0
C #,
9487 Bytes7 Byte mit C # 6-Syntax gespeichert.
Versuchen Sie es online
quelle
C(string s)=>...
Japt,
3534 BytesVerknüpfung.
Verwendet die gleiche Technik wie meine JavaScript-Antwort .
quelle
Java 8,
154113 BytesErläuterung:
Probieren Sie es online aus.
quelle
java.text.SimpleDateFormat
.import java.text.*;
es 19 Bytes und zweimaljava.text.
vor beidenSimpleDateFormat
20 Bytes. Es würde also um 1 Byte zunehmen, anstatt es zu verringern..*;
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 ändernimport java.text.*;
.Oracle SQL, 49 Bytes
Die Daten müssen in eine Tabelle eingefügt werden, die
T
mit einer SpalteN
vom Typ aufgerufen wirdVARCHAR2(6)
,CHAR(6)
oder nur, wenn alle Jahre> 1000 sind.NUMBER
Verwendungszweck:
quelle
begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print n
und 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.Microsoft SQL Server, 57 Bytes
Die
Upper
Funktion ist erforderlich, da das Format keine Monate in Großbuchstaben erzeugt, wie dies mit dem MMM- Formatmuster zu erwarten ist.Verwendungszweck:
quelle
Pyth, 45 Bytes
Probieren Sie es online!
Erläuterung:
Die gepackte Zeichenfolge enthält
"JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
. Die beidenJAN
s sind so, dass ich es pseudo-eins-indiziert indizieren kann.BEARBEITEN: Fehler behoben, der bei TIO auftrat
quelle
R , 65 Bytes
Probieren Sie es online!
Nimmt die Eingabe als String und nutzt die Konstante
month.abb
. Verwendet den Modul undsubstr
, um relevante Werte zu extrahieren.quelle
:
zu konvertiereninteger
!el
- 1 weniger Byte gefunden.J, 70 Bytes
Verwendungszweck
Erläuterung
quelle
Pyth, 39 Bytes
Hexdump:
Testsuite.
quelle
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, dieascii_upcase
Funktion zu verwenden.)Probelauf (Option,
-R
die nur in diesem Beispiel verwendet wird, um alle Testfälle zu bestehen.)Online-Test: (Das Übergeben von -R über URL wird nicht unterstützt. Daher wird die Eingabe als JSON-Zeichenfolgenliteral übergeben. Das Übergeben
-r
von URL wird nicht unterstützt. Überprüfen Sie die Raw-Ausgabe selbst.)quelle
Faktor
82 -78 BytesEshplained:
quelle
PHP, 78 Bytes
Das "Jahr-2038-Problem" kann auf einigen Computern wie hier auftreten . Aber nicht bei anderen, wie hier .
quelle
Swift 2.2, 149 Bytes
Der Versuch, dies kürzer als Kotlin zu machen ... Es ist eine Schande, dass
NSDateFormatter
es keinen Initialisierer gibt, der das setztdateFormat
.NSDateFormatter
hat auch keinen StandardwertdateFormat
, was zu zusätzlichen Verlusten führt.Schnelle 3, 136 Bytes
Dank der Entfernung des
NS
Prä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:
quelle
R,
154150114112 BytesNimmt 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:
Ungolfed:
EDITS: doppelte Namen durch Variablen ersetzt; hat mich dumm gemacht. -2 Bytes durch anonyme Funktion drehen (danke, cat).
quelle
a=
für eine anonyme Funktiona=
? So etwas in der Art:(function(m) {a=3;m*a})(10)
function(b){h=substr;i=sprintf;o="%06d";cat(toupper(month.abb[as.numeric(h(i(o,b),5,6))]),h(i(o,b),3,4),sep="")}
ist ein Funktionsobjekt für sich.RStudio with R 3.2.3 (2015-12-10)
bekomme ichError in i(o, b) : invalid format '%06d'; use format %s for character objects
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!