Conversion de AAAAMM en MMMYY

54

En se basant sur cette question SO .

Le défi est plutôt simple: une période de date dans le format est indiquée YYYYMMdans le format MMMYY.

Règles:

  • L'entrée sera un nombre ou une chaîne d'une longueur exacte de 6 caractères, composée uniquement de chiffres.
  • Les deux derniers chiffres seront entre 01et 12.
  • Sortie doit être sous la forme MMMYY, où MMMreprésente majuscules code à trois lettres du mois (ci - dessous) et YYreprésente deux derniers chiffres de la YYYYpartie de l'entrée.

Liste des mois avec le code correspondant:

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

Exemples:

Input     Output
201604    APR16
200001    JAN00
000112    DEC01
123405    MAY34
pajonk
la source
5
Cette question est très bien équilibrée. L’analyse manuelle et les bibliothèques de dates sont à peu près identiques, du moins en Python.
lundi
10
Hier, j'ai vu "Convertir AAAAMM en MMMYY" sur HNQ à côté du logo SO. Je vois maintenant le même titre à côté du logo PCG. J'étais très confus :)
Cat

Réponses:

20

MATL, 18 14 13 octets

4e!Z{Zc12XOXk

L'entrée est fournie sous forme de chaîne (entre guillemets simples).

Cette version ne fonctionne que dans MATL sur MATLAB puisque MATLAB est capable d'analyser automatiquement datestr('2016 04').

Explication

        % 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

Voici une version de 18 octets qui fonctionne sur Octave (et donc l'interprète en ligne)

'yyyymm'2$YO12XOXk

Essayez-le en ligne

Version modifiée pour tous les cas de test

Explication

            % 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
la source
3
Je ne vois pas comment cela pourrait être battu alors .. gg
Adnan
20

Python 3, 70 octets

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

Celui - ci utilise le intégré strftimeet les strptimefonctions.

Pour 1 octet de plus, voici une version qui analyse manuellement la chaîne:

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

Cela encode les noms de mois de manière intéressante (merci à Henry Gomersall pour avoir sauvegardé un octet).

bkul
la source
11
Cette analyse manuelle est folle.
Morgan Thrapp
@ MorganThrapp J'ai eu l'idée de cette réponse .
mardi
1
Votre version manuelle peut être effectuée dans 69 octets en Python 2 si vous prenez un numéro en entrée: lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4].
xnor
1
Bien que cela perd un octet:lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Henry Gomersall
1
@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae - "le temps d'importation" vous permettrait d'économiser 6 caractères, mais vous coûterait 10 ("temps.", deux fois)
TLW le
18

PowerShell v2 +, 49 46 octets

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

Merci à @Joey pour avoir économisé 3 octets!

Prend l'entrée $args[0]sous forme de chaîne explicite (par exemple, '201604') via une entrée de ligne de commande. Utilise la string.Insert()fonction pour insérer un -dans l'espace approprié, et la chaîne résultante forme une entrée dans l' Get-Dateapplet de commande avec le -Uparamètre format spécifiant le raccourci de trois mois et l'année à deux chiffres. Nous encapsulons cela entre parenthèses et nous ajoutons un point .ToUpper()pour rendre la chaîne de sortie capitalisée. Cette chaîne est laissée sur le pipeline et l'impression est implicite.

En outre, comme indiqué, cela dépend des paramètres régionaux. Voici les informations sur les paramètres régionaux que j'utilise lorsque cela fonctionne correctement.

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

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)
AdmBorkBork
la source
Vous n'avez pas besoin de citer le MMMyy, car c'est un simple argument pour une applet de commande. Vous pouvez aussi simplement utiliser -UFormat %b%y, c'est-à-dire à la -u %b%yplace, ce qui est encore plus court. Note latérale: Cette solution est sensible aux paramètres régionaux (ce que je n'aime pas personnellement), mais serait un peu plus longue à prendre en compte, cela est vrai.
Joey
Excellent appel à la -UFormatplace. Merci! Je ne connaissais pas non plus les citations MMMyy, c'est bon à savoir pour l'avenir.
AdmBorkBork
8

Retina , 71 70 octets

Merci à Sp3000 d’avoir économisé 1 octet.

Le nombre d'octets suppose un codage ISO 8859-1. Le retour à la ligne est important.

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

R-6`.

Essayez-le en ligne!

Explication

Prenant 201604comme exemple:

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

Cela permute les deux derniers chiffres de l'année avec le mois tout en élargissant le mois de manière unaire en utilisant des sauts de ligne et en ajoutant la liste des mois à l'envers de manière à obtenir:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

représentent les sauts de ligne (0x0A).

+`...¶

Maintenant, nous supprimons à plusieurs reprises trois caractères autres que le saut de ligne suivi d'un saut de ligne. C'est-à-dire que nous mangeons la liste des mois à partir de la fin pour chaque saut de ligne représentant un mois:

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

C'est pourquoi nous avons inséré cela XXX: depuis que les mois commencent à compter 1, nous allons toujours supprimer au moins trois caractères, même pour janvier.

R-6`.

Enfin, nous supprimons tout jusqu'au 6ème caractère à partir de la fin. En d'autres termes, nous ne conservons que les cinq derniers caractères.

Martin Ender
la source
C'est assez malin.
AdmBorkBork
7

CJam, 50 46 octets

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

Essayez-le en ligne. Merci à Martin Ender d’avoir compressé la chaîne pour économiser quelques octets.

Explication

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
la source
6

Java 7, 137 caractères (161 octets)

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

Considérons que chaque nom de mois (JAN, FEB, etc.) est un nombre en base 36 et le code dans le symbole Unicode correspondant. Ensuite, récupérez le symbole correspondant dans la chaîne et réencodez-le en base 36, puis quelques manipulations simples.

Légèrement non-golfé:

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
}

Vous pouvez le voir fonctionner ici: https://ideone.com/IKlnPY

cliffroot
la source
5

Python, 83 octets

from datetime import*
lambda x:datetime.strptime(x,'%Y%m').strftime('%b%y').upper()
atlasologue
la source
Je viens de poster une réponse presque identique à la vôtre. Je n'ai pas vu le tien car il a fallu un certain temps pour écrire la réponse. Si vous voulez que je supprime le mien, je le ferai, ou vous pouvez utiliser le mien pour obtenir des octets supplémentaires.
lundi
1
C'est bon, vous m'avez battu de 13 octets, je le concède. J'aime votre réponse manuelle, aussi.
atlasologue
5

Kotlin, 100 octets

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

Utilisation assez simple de Java SimpleDateFormat

Rames
la source
1
Hmm, je ne connais pas Kotlin, mais comme il est dérivé de Java, ne devriez-vous pas inclure l'importation de SimpleDateFormat(c.-à-d. import java.text.*;)?
Kevin Cruijssen
Puisque le défi demande une sortie, je suppose qu'une impression est nécessaire dans le cadre de votre fonction.
JohnWells
5

MATLAB / Octave, 42 octets

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

Crée une fonction anonyme nommée ansqui est appelée avec une chaîne représentant la date: ans('201604').

Démo en ligne

Cette solution permet datenumde convertir la date d'entrée en un numéro de date de série, puis datestravec la spécification de sortie prédéfinie de mmmyy( 12) pour obtenir la représentation sous forme de chaîne au format requis. Enfin, nous utilisons upperpour le changer en MMMYYpuisque le mois en majuscule n'est pas une option de sortie.

Suever
la source
1
Wow, gj sur battre tous les autres dans une langue non-golf!
Downgoat
5

05AB1E, 51 42 41 octets

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

Explication

                                           # 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

Essayez-le en ligne

9 octets enregistrés grâce à la compression de chaîne, gracieuseté de @Adnan

Emigna
la source
1
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35Bau lieu de "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"sauver 9 octets.
Adnan
5

JavaScript, 87 84 80 79 octets

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

Pour obtenir le mois, obtient la date (constituée de "AAAAMM" convertie en "AAAA-MM") et récupère les caractères 5 à 8, qui correspondent exactement aux trois premières lettres du mois. Mais cela coûte beaucoup de le convertir en majuscule.

Démo:

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

nicael
la source
Tout d'abord devrait êtreAPR16
Downgoat
@ Upgoat Et qu'est-ce qui apparaît pour vous?
Nicael
1
Je reçoisMAR16
mardi
@ Upgoat Huh, c'est bizarre, pourquoi ça pourrait être comme ça? Parce que je comprends ça .
Nicael
Pour moi, cela se voit APR16, mais le troisième cas de test ne montre que DECpour moi.
Adnan
4

Julia, 57 56 53 octets

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

Il s'agit d'une fonction anonyme qui accepte une chaîne et retourne une chaîne. Pour l'appeler, assignez-le à une variable.

Tout d'abord, nous construisons un DateTimeobjet en utilisant le constructeur de type et une chaîne de format. Notez que le seul mdans la chaîne de format obtiendra les mois à un et deux chiffres, bien que le premier cas ne soit pas pertinent ici. Comme aucun jour n'est spécifié, le premier du mois est supposé.

Nous pouvons ensuite formater la valeur en tant que chaîne en utilisant la Dates.formatfonction du Base.Datessous - module. La chaîne uyyreçoit le nom du mois à trois lettres et l'année à deux chiffres, mais le résultat est dans la casse du titre, par exemple Avril16 au lieu de l'APR16 souhaité, nous en avons donc besoin uppercase.

Essayez-le en ligne! (inclut tous les cas de test)

Alex A.
la source
4

C, 147 145 112 octets

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

Démo en ligne

Merci Ugoren !

Marco
la source
2
Quelques astuces bon marché - supprimer le #include, définir mcomme paramètre - main(m),
ugoren
2
De plus, le %.3sformat enregistre la fin nulle.
ugoren
Merci @ugoren! J'ai aussi changé "%4s%2d"pour "%4s%d".
Marco
main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}beaucoup plus court
l4m2
4

JavaScript ES6, 77 66 octets

11 octets sauvés grâce à @ Bálint!

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

Obtenez la date en extrayant la chaîne retournée par la Dateclasse. puis capitalise et ajoute l'année.

Version 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
la source
J'ai fait un à 66 octets avec la même technique de atob, mais je ne peux pas le copier sur
Bálint
@ Bálint Je pensais que j'avais 66 octets aussi, mais notre compteur d'octets est erroné en raison d'un mauvais collage de copies;)
Downgoat 22/06/2016
Vous pouvez obtenir le nom du mois avec(Date(0,a[4]- -a[5])+"").substr(4,3)
Bálint le
1
Je ne comprends pas ça a[4]- -a[5]. Quel était le problème avec 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 octets

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

7 octets enregistrés en utilisant la syntaxe C # 6.

Essayez en ligne

raznagul
la source
Vous pouvez laisser les informations de type de retour pour les lambdas, c.C(string s)=>...
chat
3

Japt, 35 34 octets

ÐUr$/..../$,"$&-")+P s4,7 u +Us2,4

Lien.

Utilise la même technique que ma réponse JavaScript .

nicael
la source
3

Java 8, 154 113 octets

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

Explication:

Essayez-le en ligne.

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
la source
Je pense que vous pouvez le raccourcir si vous supprimez l'importation et vous y référez directement avec java.text.SimpleDateFormat.
Frozn
2
@Frozn import java.text.*;est en fait 19 octets, et deux fois java.text.devant les deux SimpleDateFormatest 20 octets. Donc, il augmenterait de 1 octet au lieu de le baisser.
Kevin Cruijssen
Oh oui tu as raison. Je regarde toujours la version non-golfée et pense qu’elle est égale à la version golfée. Désolé :)
Frozn
@Frozn Ah, aussi un peu mon mauvais. D'habitude, je l'utilise toujours .*;pour le code non-joué, mais cette fois, il me semble l'avoir négligé. J'ai des options de sauvegarde qui le convertissent automatiquement en importations pures depuis que j'utilise Java dans mon travail, et j'ai tout simplement oublié de le changer en import java.text.*;..
Kevin Cruijssen
2

Oracle SQL, 49 octets

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

Les données doivent être insérées dans une table appelée Tavec une colonne Nde type VARCHAR2(6), CHAR(6)ou, uniquement si toutes les années sont> 1000, NUMBER

Usage:

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
la source
Serait-il possible d'utiliser PRINT au lieu de SELECT et de ne pas faire référence à la table en utilisant une variable comme entrée? La déclaration de la variable d'entrée et l'attribution de la valeur n'affectent pas le nombre d'octets
t-clausen.dk
Est-il autorisé à prendre des entrées d'une table? L' information tag codegolf suggère que non.
Pajonk
@ t-clausen.dk le moyen le plus court en utilisant print est de 58 caractères: begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print net vous avez besoin de 42 caractères supplémentaires pour une seule entrée ( VARIABLE n varchar2;BEGIN:n:='201605';END;) au lieu de 31 ( insert into t values('000112');) si vous avez des moyens plus courts, dites-le-moi.
Giacomo Garabello
@pajonk dans cette réponse, personne ne me dit rien sur l'utilisation des tables
Giacomo Garabello
1
@pajonk selon cela , vous pouvez utiliser des tables pour l'entrée
t-clausen.dk
2

Microsoft SQL Server, 57 octets

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

La Upperfonction est requise car le format ne produit pas de mois majuscules, contrairement au modèle de format MMM .

Usage:

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
New York
la source
Je viens de voir votre réponse, il ressemble beaucoup à la mienne, je ne l'ai pas remarquée jusqu'à présent, j'ai retiré ma réponse
t-clausen.dk
Est-il autorisé à prendre des entrées d'une table? L' information tag codegolf suggère que non.
Pajonk
@pajonk la réponse ici n'utilise pas l'entrée d'une table, la réponse est la ligne du haut et la variable d'entrée est codée en dur. Notez que vous pouvez utiliser des tableaux comme variables d’entrée, comme je l’ai mentionné plus tôt. La partie inférieure est un exemple comment convertir plusieurs valeurs. TSQL n'a ni STDIN ni d'instructions d'entrée. Le seul moyen d’ajouter des données est d’utiliser des variables ou des tableaux. Toutes mes réponses utilisent celles pour l'entrée
t-clausen.dk
Ok, merci pour clarifier.
mardi
2

Pyth, 45 octets

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

Essayez-le en ligne!

Explication:

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

La chaîne emballée contient "JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC". Les deux JANs sont pour que je puisse l’indexer pseudo-un-indexé.

EDIT: bug corrigé avec TIO

Ericeschnei
la source
2

R , 65 octets

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

Essayez-le en ligne!

Prend les entrées sous forme de chaîne, exploite la constante month.abb. Utilise le module et substrextrait les valeurs pertinentes.

JayCe
la source
utilisation intelligente de :convertir en integer!
Giuseppe
@ Giuseppe Pas mon idée :) Je l'ai prise d' ici . Je peux probablement l'appliquer à un certain nombre de mes réponses existantes!
JayCe
@ Giuseppe Je viens de trouver un hack plus court en utilisant el- 1 octet de moins.
JayCe
1

J, 70 octets

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

Usage

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

Explication

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
milles
la source
1

Pyth, 39 octets

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

Suite de tests.

Fuite, nonne
la source
1

jq, 35 caractères

(Option de ligne de commande code à 34 caractères + 1 caractère.)

(Je viens d'essayer de savoir si le ^truc utilisé par Digital Trauma dans sa réponse Bash fonctionne également en jq. Fonctionne. Vous savez maintenant qui a inspiré le personnage le plus important de cette réponse. (L'alternative consiste à utiliser la ascii_upcasefonction.))

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

Exemple d' -Ranalyse (option utilisée uniquement dans cet exemple pour réussir tous les cas de test.)

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

Test en ligne: (L'URL transmis n'est pas pris en charge. Par conséquent, l'entrée est transmise sous forme de chaîne littérale JSON. L' -rURL transmise n'est pas prise en charge - cochez Raw Output vous-même.)

homme au travail
la source
1

Facteur, 82 78 octets

[ [ 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
chat
la source
1

PHP, 78 octets

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

Le "problème de l'année 2038" peut se produire sur certains ordinateurs, comme ici . Mais pas chez d'autres, comme ici .

Marco
la source
@ Titus, n'essayez pas de modifier les publications d'autres personnes s'il y a des problèmes et n'insérez pas vos propres solutions; commentez plutôt la réponse OU créez vous-même une nouvelle réponse.
Valeur d'encre
1

Swift 2.2, 149 octets

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

Essayer de faire cela plus court que Kotlin ... Dommage qu’il NSDateFormattern’ait pas d’initialiseur qui le règle dateFormat. NSDateFormatterégalement n'a pas de dateFormatvaleur par défaut , ce qui entraîne des pertes supplémentaires.

Rapide 3, 136 octets

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

Grâce à la suppression du NSpréfixe de certaines classes, j'ai pu faire répondre un peu plus rapidement le Swift 3. Toujours pas plus court que Kotlin cependant ...

Fonction de test et cas:

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
la source
1

R, 154 150 114 112 octets

Prend six chiffres dans "b", sépare les quatre premiers chiffres des deux derniers chiffres, abrége le mois à 2 chiffres et le met en majuscule et le concatène avec les 3ème et 4ème chiffres.

Golfé:

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: remplacé les noms en double par des variables; m'a fixé d'être stupide. -2 octets en tournant la fonction anonyme (merci, chat).

un oreiller doux
la source
Bonne réponse! Vous pouvez laisser le a=pour une fonction anonyme
chat
@cat Je ne connais pas très bien les fonctions anonymes, mais n'aurais-je pas besoin d'ajouter des parenthèses au début et à la fin de la fonction si je supprime les a=? Quelque chose comme ça: (function(m) {a=3;m*a})(10)
un oreiller moelleux
1
Nope, 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="")}est un objet fonction tout seul.
Chat
Cela ne semble pas fonctionner. sur RStudio with R 3.2.3 (2015-12-10)je reçoisError in i(o, b) : invalid format '%06d'; use format %s for character objects
chat
@cat Darn nouvelles versions tout gâcher! Je suis sur RStudio en cours d'exécution R version 3.1.1 (2014-07-10)et cela fonctionne bien. Comment cela fonctionne ici, dois-je obtenir la nouvelle version et changer le code? Merci également pour le conseil de fonction anonyme!
un oreiller moelleux