Convertir AAAAMM a MMMYY

54

Basándome en esta pregunta SO .

El desafío es bastante simple: dado un período de fecha en el formato, se YYYYMMgenera en el formato MMMYY.

Reglas:

  • La entrada será un número o una cadena de exactamente 6 caracteres de longitud, que constará solo de dígitos.
  • Los dos últimos dígitos estarán entre 01y 12.
  • La salida debe estar en la forma MMMYY, donde MMMrepresenta el código de tres letras en mayúscula para el mes (abajo) y YYrepresenta los dos últimos dígitos de la YYYYparte de la entrada.

Lista de meses con el código correspondiente:

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

Ejemplos:

Input     Output
201604    APR16
200001    JAN00
000112    DEC01
123405    MAY34
pajonk
fuente
55
Esta pregunta está muy bien equilibrada. Tanto el análisis manual como las bibliotecas de fechas terminan siendo casi iguales, al menos en Python.
bkul
10
Ayer, vi "Convertir AAAAMM a MMMYY" en HNQ junto al logotipo SO. Ahora veo el mismo título al lado del logotipo de PCG. Estaba muy confundido :)
gato

Respuestas:

20

MATL, 18 14 13 bytes

4e!Z{Zc12XOXk

La entrada se proporciona como una cadena (entre comillas simples).

Esta versión solo se ejecuta en MATL en MATLAB ya que MATLAB puede analizar automáticamente datestr('2016 04').

Explicación

        % 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

Aquí hay una versión de 18 bytes que funciona en Octave (y, por lo tanto, el intérprete en línea)

'yyyymm'2$YO12XOXk

Pruébalo en línea

Versión modificada para todos los casos de prueba.

Explicación

            % 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
fuente
3
No veo cómo se puede superar así que ... gg
Adnan
20

Python 3, 70 bytes

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

Esto utiliza el incorporado strftimey las strptimefunciones.

Para 1 byte más, aquí hay una versión que analiza la cadena manualmente:

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

Esto codifica los nombres de los meses de una manera interesante (gracias a Henry Gomersall por guardar un byte).

bkul
fuente
11
Ese análisis manual es una locura.
Morgan Thrapp
@MorganThrapp Se me ocurrió la idea de esta respuesta .
bkul
1
Su versión manual se puede hacer de 69 bytes en Python 2 si se toma un número como entrada: lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4].
xnor
1
Aunque esto pierde un byte:lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Henry Gomersall
1
@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae - "tiempo de importación" le ahorraría 6 caracteres, pero le costaría 10 ("tiempo", dos veces)
TLW
18

PowerShell v2 +, 49 46 bytes

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

¡Gracias a @Joey por guardar 3 bytes!

Toma la entrada $args[0]como una cadena explícita (por ejemplo, '201604') a través de la entrada de la línea de comandos. Utiliza la string.Insert()función para poner un -en el espacio apropiado, y esa cadena resultante forma la entrada al Get-Datecmdlet con el -Uparámetro de formato que especifica la taquigrafía de tres meses más el año de dos dígitos. Encapsulamos eso en parens, y añadimos a .ToUpper()para que la cadena de salida se capitalice. Esa cadena se deja en la tubería y la impresión es implícita.

Además, como se señaló, esto es sensible a la configuración regional. Aquí está la información de configuración regional que estoy usando donde esto funciona correctamente.

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

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)
AdmBorkBork
fuente
No necesita citar el MMMyy, ya que es un argumento simple para un cmdlet. También podría usar -UFormat %b%y, es decir -u %b%y, que es aún más corto. Nota al margen: esta solución es sensible a la configuración regional (que personalmente no me gusta), pero sería un poco más largo para dar cuenta de eso, lo admito.
Joey
Excelente llamada con el -UFormaten su lugar. ¡Gracias! Tampoco sabía sobre las citas MMMyy, eso es bueno saber para el futuro.
AdmBorkBork
8

Retina , 71 70 bytes

Gracias a Sp3000 por guardar 1 byte.

El recuento de bytes asume la codificación ISO 8859-1. El avance de línea final es significativo.

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

R-6`.

Pruébalo en línea!

Explicación

Tomando 201604como ejemplo:

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

Esto intercambia los dos últimos dígitos del año con el mes, al mismo tiempo que expande el mes en unario usando saltos de línea y antepone la lista de meses al revés para que obtengamos:

20DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXXX¶¶¶¶16

Donde los avances de línea representan (0x0A).

+`...¶

Ahora eliminamos repetidamente tres caracteres sin salto de línea seguidos de un salto de línea. Es decir, consumimos la lista de meses desde el final para cada salto de línea que representa un mes:

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

Es por eso que lo hemos insertado XXX: desde que comienzan a contar los meses 1, siempre eliminaremos al menos tres caracteres, incluso para enero.

R-6`.

Finalmente, eliminamos todo hasta el sexto personaje desde el final. En otras palabras, solo conservamos los últimos cinco caracteres.

Martin Ender
fuente
Eso es bastante inteligente.
AdmBorkBork
7

CJam, 50 46 bytes

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

Pruébalo en línea. Gracias a Martin Ender por comprimir la cadena para guardar unos pocos bytes.

Explicación

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
NinjaOsoMono
fuente
6

Java 7, 137 caracteres (161 bytes)

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

Considere que el nombre de cada mes (JAN, FEB, etc.) es un número en la base 36 y codifíquelo en el símbolo Unicode correspondiente. Luego, obtenga el símbolo correspondiente de la cadena codifíquelo nuevamente en la base 36 y luego algunas manipulaciones de cadena simple.

Ligeramente incólume:

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
}

Puedes verlo corriendo aquí: https://ideone.com/IKlnPY

acantilado
fuente
5

Python, 83 bytes

from datetime import*
lambda x:datetime.strptime(x,'%Y%m').strftime('%b%y').upper()
atlasólogo
fuente
Acabo de publicar una respuesta casi idéntica a la tuya. No vi el tuyo porque me tomó un tiempo escribir la respuesta. Si quieres que elimine el mío, lo haré, o puedes usar el mío para obtener algunos bytes adicionales.
bkul
1
Está bien, me ganaste por 13 bytes, lo concederé. También me gusta tu respuesta manual.
atlasólogo
5

Kotlin, 100 bytes

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

Uso bastante sencillo de Java SimpleDateFormat

Rames
fuente
1
Hmm, no sé Kotlin, pero como se deriva de Java, ¿no deberías incluir la importación de SimpleDateFormat(es decir import java.text.*;)?
Kevin Cruijssen
Como el desafío solicita resultados, supongo que se requiere una impresión como parte de su función.
JohnWells
5

MATLAB / Octave, 42 bytes

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

Crea una función anónima llamada ansque se llama con una cadena que representa la fecha: ans('201604').

Demo en línea

Esta solución utiliza datenumpara convertir la fecha de entrada en un número de fecha de serie y luego datestrcon la especificación de salida predefinida de mmmyy( 12) para obtener la representación de cadena en el formato requerido. Finalmente, usamos upperpara cambiarlo MMMYYya que el mes en mayúscula no es una opción de salida.

Suever
fuente
1
¡Guau, gj en vencer a todos los demás en un lenguaje que no es de golf!
Downgoat
5

05AB1E, 51 42 41 bytes

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

Explicación

                                           # 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

Pruébalo en línea

9 bytes guardados gracias a la compresión de cadenas, cortesía de @Adnan

Emigna
fuente
1
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35Ben lugar de "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"guardar 9 bytes.
Adnan
5

JavaScript, 87 84 80 79 bytes

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

Para obtener el mes, obtiene la fecha (que está formada por "AAAAMM" convertida a "AAAA-MM") y recupera los caracteres del 5 al 8, que son exactamente las tres primeras letras del mes. Pero cuesta mucho convertirlo a mayúsculas.

Manifestación:

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
fuente
Primero debería serAPR16
Downgoat
@ Upgoat ¿Y qué te está apareciendo?
nicael
1
Me estoy poniendoMAR16
Downgoat
@ Upgoat Huh, eso es raro, ¿por qué podría ser de esta manera? Porque entiendo esto .
nicael
Para mí se muestra APR16, pero el tercer caso de prueba se muestra solo DECpara mí.
Adnan
4

Julia, 57 56 53 bytes

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

Esta es una función anónima que acepta una cadena y devuelve una cadena. Para llamarlo, asígnelo a una variable.

Primero construimos un DateTimeobjeto usando el constructor de tipo y una cadena de formato. Tenga en cuenta que el único men la cadena de formato obtendrá meses de uno y dos dígitos, aunque el primer caso es irrelevante aquí. Como no se especifican días, se supone el primero del mes.

Entonces podemos formatear el valor como una cadena usando la Dates.formatfunción del Base.Datessubmódulo. La cadena uyyobtiene el nombre del mes de tres letras y el año de dos dígitos, pero el resultado está en el caso del título, por ejemplo, Apr16 en lugar del APR16 deseado, por lo que necesitamos uppercasehacerlo.

Pruébalo en línea! (incluye todos los casos de prueba)

Alex A.
fuente
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);}

Demostración en línea

Gracias ugoren !

Marco
fuente
2
Algunos trucos baratos - elimine el #include, defina mcomo parámetro - main(m),
ugoren
2
Además, el %.3sformato guarda la terminación nula.
ugoren
Gracias @ugoren! También cambié "%4s%2d"a "%4s%d".
Marco
main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}mucho más corto
l4m2
4

JavaScript ES6, 77 66 bytes

¡Guardado 11 bytes gracias a @ Bálint!

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

Obtenga la fecha extrayendo la cadena devuelta por la Dateclase. luego capitaliza y agrega el año.

Versión 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
fuente
Hice uno en 66 bytes con la misma técnica de atob, pero no puedo copiarlo
Bálint
@ Bálint Pensé que también tenía 66 bytes, pero nuestro contador de bytes estaba equivocado debido a una mala copia de la copia;)
Downgoat
Puedes obtener el nombre del mes con(Date(0,a[4]- -a[5])+"").substr(4,3)
Bálint
1
No entiendo eso a[4]- -a[5]. ¿Qué estaba mal con 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();

Guardado 7 bytes mediante el uso de la sintaxis C # 6.

Probar en línea

raznagul
fuente
Puede dejar la información de tipo de retorno para lambdas, es decirC(string s)=>...
gato
3

Java 8, 154113 bytes

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

Explicación:

Pruébalo en línea.

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
fuente
Creo que puede acortarlo si elimina la importación y, en cambio, se refiere directamente a ella java.text.SimpleDateFormat.
Frozn
2
@Frozn En realidad, import java.text.*;tiene 19 bytes, y dos veces java.text.delante de ambos SimpleDateFormathay 20 bytes. Por lo tanto, aumentaría en 1 byte en lugar de bajarlo.
Kevin Cruijssen
Oh sí tienes razón. Siempre miro la versión sin golf y pienso que es igual a la versión con golf. Lo siento :)
Frozn
@ Frozn Ah, también un poco mi mal. Por lo general, todavía uso .*;para el código no protegido, pero esta vez parece que lo he descuidado. Tengo opciones de guardar que lo convierten automáticamente en importaciones puras ya que uso Java en mi trabajo, y simplemente olvidé cambiarlo a import java.text.*;...
Kevin Cruijssen
2

Oracle SQL, 49 bytes

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

Los datos se debe insertar en una tabla llamada Tcon una columna Nde tipo VARCHAR2(6), CHAR(6)o bien, sólo si todos los años son> 1000, NUMBER

Uso:

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
fuente
¿Sería posible usar PRINT en lugar de SELECT y no referirse a la tabla usando una variable como entrada? Declarar la variable de entrada y asignar el valor no afecta el recuento de bytes
t-clausen.dk
¿Está permitido tomar datos de una tabla? La información de la etiqueta codegolf sugiere que no.
pajonk
@ t-clausen.dk la forma más corta de usar print es 58 caracteres: begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print ny necesita 42 caracteres adicionales para una sola entrada ( VARIABLE n varchar2;BEGIN:n:='201605';END;) en lugar de 31 ( insert into t values('000112');) si tiene formas más cortas, dígame.
Giacomo Garabello
@pajonk en esta respuesta, nadie me cuenta nada sobre el uso de tablas
Giacomo Garabello
1
@pajonk de acuerdo con esto , puede usar tablas para entrada
t-clausen.dk
2

Microsoft SQL Server, 57 bytes

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

La Upperfunción es necesaria ya que el formato no produce meses en mayúscula como se esperaría con el patrón de formato MMM .

Uso:

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
Nueva York
fuente
Acabo de ver su respuesta, es muy parecida a la mía, no lo noté hasta ahora,
eliminé
¿Está permitido tomar datos de una tabla? La información de la etiqueta codegolf sugiere que no.
pajonk
@pajonk la respuesta aquí no usa la entrada de una tabla, la respuesta es la línea superior y la variable de entrada está codificada. Tenga en cuenta que puede usar tablas como variables de entrada como mencioné anteriormente. La parte inferior es un ejemplo de cómo convertir varios valores. TSQL no tiene STDIN ni declaraciones de entrada. La única forma de agregar datos es usando variables o tablas. Todas mis respuestas están usando las de entrada
t-clausen.dk
Ok, gracias por aclarar.
pajonk
2

Pyth, 45 bytes

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

Pruébalo en línea!

Explicación:

+:."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 cadena empaquetada contiene "JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC". Los dos JANs son para que pueda indexarlo pseudo-uno-indexado.

EDITAR: Se corrigió el error que estaba jugando con TIO

ericeschnei
fuente
2

R , 65 bytes

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

Pruébalo en línea!

Toma la entrada como una cadena, aprovecha la constante month.abb. Utiliza el módulo y substrpara extraer valores relevantes.

JayCe
fuente
uso inteligente de :convertir a integer!
Giuseppe
@Giuseppe No es mi idea :) Lo tomé desde aquí . ¡Probablemente pueda aplicarlo a varias de mis respuestas existentes!
JayCe
@Giuseppe Acabo de encontrar un hack más corto usando el- 1 byte menos.
JayCe
1

J, 70 bytes

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

Uso

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

Explicación

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
millas
fuente
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

Banco de pruebas.

Monja permeable
fuente
1

jq, 35 caracteres

(Código de 34 caracteres + opción de línea de comando de 1 carácter).

(Solo probé si el ^truco utilizado por Digital Trauma en su respuesta Bash también funciona en jq. Funciona. Ahora ya sabes quién inspiró el carácter más importante de esta respuesta. (La alternativa es usar la ascii_upcasefunción).)

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

Ejecución de muestra (Opción -Rutilizada solo en esta muestra para pasar todos los casos de prueba).

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

Prueba en línea: (No se admite la transferencia de -R a través de la URL; por lo tanto, la entrada se pasa como literal de cadena JSON. La transferencia a -rtravés de la URL no se admite: compruebe usted mismo la salida sin formato).

hombre trabajando
fuente
1

Factor, 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
gato
fuente
1

PHP, 78 bytes

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

El "problema del año 2038" puede ocurrir en algunas computadoras, como aquí . Pero no en otros, como aquí .

Marco
fuente
@Titus, no intentes editar las publicaciones de otras personas si hay problemas e inserta tus propias soluciones; en su lugar, comente la respuesta O cree una nueva respuesta usted mismo.
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

Tratando de hacer esto más corto que Kotlin ... Es una pena NSDateFormatterque no tenga un inicializador que lo establezca dateFormat. NSDateFormattertampoco tiene un dateFormatvalor predeterminado , lo que causa pérdidas adicionales.

Swift 3, 136 bytes

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

Gracias a la eliminación del NSprefijo en algunas clases, pude hacer que la respuesta de Swift 3 fuera un poco más corta. Sin embargo, aún no es más corto que Kotlin ...

Función de prueba y casos:

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
fuente
1

R, 154 150 114 112 bytes

Toma la entrada de seis dígitos en "b", separa los primeros cuatro dígitos de los últimos dos dígitos, abrevia el mes de 2 dígitos y lo pone en mayúscula, y lo concatena con el tercer y cuarto dígito.

Golfizado:

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

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

EDICIONES: reemplazó nombres duplicados con variables; Me arregló para ser estúpido. -2 bytes convirtiendo la función en anónima (gracias, cat).

una almohada suave
fuente
¡Buena respuesta! Puede dejar el a=para una función anónima
gato
@cat No estoy muy familiarizado con las funciones anónimas, pero ¿no necesitaría agregar paréntesis al principio y al final de la función si elimino el a=? Algo como esto: (function(m) {a=3;m*a})(10)
una almohada suave
1
No, 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="")}es un objeto de función por sí solo.
gato
Esto no parece funcionar. en RStudio with R 3.2.3 (2015-12-10)I getError in i(o, b) : invalid format '%06d'; use format %s for character objects
cat
@cat ¡Malditas versiones nuevas que arruinen todo! Estoy corriendo RStudio R version 3.1.1 (2014-07-10)y funciona bien. ¿Cómo funciona esto aquí? ¿Debo obtener la nueva versión y cambiar el código? También gracias por el consejo de la función anónima!
una almohada suave