Basándome en esta pregunta SO .
El desafío es bastante simple: dado un período de fecha en el formato, se YYYYMM
genera 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
01
y12
. - La salida debe estar en la forma
MMMYY
, dondeMMM
representa el código de tres letras en mayúscula para el mes (abajo) yYY
representa los dos últimos dígitos de laYYYY
parte 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
Respuestas:
MATL,
181413 bytesLa 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
Aquí hay una versión de 18 bytes que funciona en Octave (y, por lo tanto, el intérprete en línea)
Pruébalo en línea
Versión modificada para todos los casos de prueba.
Explicación
fuente
Python 3, 70 bytes
Esto utiliza el incorporado
strftime
y lasstrptime
funciones.Para 1 byte más, aquí hay una versión que analiza la cadena manualmente:
Esto codifica los nombres de los meses de una manera interesante (gracias a Henry Gomersall por guardar un byte).
fuente
lambda n:"JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[n%100-1::12]+`n`[2:4]
.lambda s:" JFMAMJJASONDAEAPAUUUECOENBRRYNLGPTVC"[int(s[4:])::12]+s[2:4]
Bash + coreutils, 18
Requiere una versión de 64 bits
date
para los casos de prueba dados, que reconoce las fechas anteriores al 14 de diciembre de 1901 .fuente
PowerShell v2 +,
4946 bytes¡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 lastring.Insert()
función para poner un-
en el espacio apropiado, y esa cadena resultante forma la entrada alGet-Date
cmdlet con el-U
pará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.
fuente
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.-UFormat
en su lugar. ¡Gracias! Tampoco sabía sobre las citasMMMyy
, eso es bueno saber para el futuro.Retina ,
7170 bytesGracias 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.
Pruébalo en línea!
Explicación
Tomando
201604
como ejemplo: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:
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:
Es por eso que lo hemos insertado
XXX
: desde que comienzan a contar los meses1
, siempre eliminaremos al menos tres caracteres, incluso para enero.Finalmente, eliminamos todo hasta el sexto personaje desde el final. En otras palabras, solo conservamos los últimos cinco caracteres.
fuente
CJam,
5046 bytesPruébalo en línea. Gracias a Martin Ender por comprimir la cadena para guardar unos pocos bytes.
Explicación
fuente
Bash,
3928 bytesGracias Digital Trauma !
fuente
Java 7, 137 caracteres (161 bytes)
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:
Puedes verlo corriendo aquí: https://ideone.com/IKlnPY
fuente
Python, 83 bytes
fuente
Kotlin, 100 bytes
Uso bastante sencillo de Java SimpleDateFormat
fuente
SimpleDateFormat
(es decirimport java.text.*;
)?MATLAB / Octave, 42 bytes
Crea una función anónima llamada
ans
que se llama con una cadena que representa la fecha:ans('201604')
.Demo en línea
Esta solución utiliza
datenum
para convertir la fecha de entrada en un número de fecha de serie y luegodatestr
con la especificación de salida predefinida demmmyy
(12
) para obtener la representación de cadena en el formato requerido. Finalmente, usamosupper
para cambiarloMMMYY
ya que el mes en mayúscula no es una opción de salida.fuente
05AB1E,
514241 bytesExplicación
Pruébalo en línea
9 bytes guardados gracias a la compresión de cadenas, cortesía de @Adnan
fuente
•r–ºþ¯Bê€õaPù£—^5AºüLwÇ–è•35B
en lugar de"JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
guardar 9 bytes.JavaScript,
87848079 bytesPara 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:
fuente
APR16
MAR16
APR16
, pero el tercer caso de prueba se muestra soloDEC
para mí.Julia,
575653 bytesEsta es una función anónima que acepta una cadena y devuelve una cadena. Para llamarlo, asígnelo a una variable.
Primero construimos un
DateTime
objeto usando el constructor de tipo y una cadena de formato. Tenga en cuenta que el únicom
en 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.format
función delBase.Dates
submódulo. La cadenauyy
obtiene 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 necesitamosuppercase
hacerlo.Pruébalo en línea! (incluye todos los casos de prueba)
fuente
C,
147145112 bytesDemostración en línea
Gracias ugoren !
fuente
#include
, definam
como parámetro -main(m)
,%.3s
formato guarda la terminación nula."%4s%2d"
a"%4s%d"
.main(m){char a[9];scanf("%4s%d",a,&m);printf("%.3s%s","JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"+--m*3,a+2);}
mucho más cortoJavaScript ES6,
7766 bytes¡Guardado 11 bytes gracias a @ Bálint!
Obtenga la fecha extrayendo la cadena devuelta por la
Date
clase. luego capitaliza y agrega el año.Versión ES5:
fuente
(Date(0,a[4]- -a[5])+"").substr(4,3)
a[4]- -a[5]
. ¿Qué estaba mal cona[4]+a[5]-1
?new Date(0,a[4]+a[5]-1)+""
=>new Date(0,a[4]+a[5]-1)+0
C #,
9487 bytesGuardado 7 bytes mediante el uso de la sintaxis C # 6.
Probar en línea
fuente
C(string s)=>...
Japt,
3534 bytesEnlazar.
Utiliza la misma técnica que mi respuesta de JavaScript .
fuente
Java 8,
154113bytesExplicación:
Pruébalo en línea.
fuente
java.text.SimpleDateFormat
.import java.text.*;
tiene 19 bytes, y dos vecesjava.text.
delante de ambosSimpleDateFormat
hay 20 bytes. Por lo tanto, aumentaría en 1 byte en lugar de bajarlo..*;
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 aimport java.text.*;
...Oracle SQL, 49 bytes
Los datos se debe insertar en una tabla llamada
T
con una columnaN
de tipoVARCHAR2(6)
,CHAR(6)
o bien, sólo si todos los años son> 1000,NUMBER
Uso:
fuente
begin:n:=to_char(to_date(:n,'yyyymm'),'monyy');end;print n
y 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.Microsoft SQL Server, 57 bytes
La
Upper
funció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:
fuente
Pyth, 45 bytes
Pruébalo en línea!
Explicación:
La cadena empaquetada contiene
"JANJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
. Los dosJAN
s son para que pueda indexarlo pseudo-uno-indexado.EDITAR: Se corrigió el error que estaba jugando con TIO
fuente
R , 65 bytes
Pruébalo en línea!
Toma la entrada como una cadena, aprovecha la constante
month.abb
. Utiliza el módulo ysubstr
para extraer valores relevantes.fuente
:
convertir ainteger
!el
- 1 byte menos.J, 70 bytes
Uso
Explicación
fuente
Pyth, 39 bytes
Hexdump:
Banco de pruebas.
fuente
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 laascii_upcase
función).)Ejecución de muestra (Opción
-R
utilizada solo en esta muestra para pasar todos los casos de prueba).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
-r
través de la URL no se admite: compruebe usted mismo la salida sin formato).fuente
Factor,
8278 bytesEshplained:
fuente
PHP, 78 bytes
El "problema del año 2038" puede ocurrir en algunas computadoras, como aquí . Pero no en otros, como aquí .
fuente
Swift 2.2, 149 bytes
Tratando de hacer esto más corto que Kotlin ... Es una pena
NSDateFormatter
que no tenga un inicializador que lo establezcadateFormat
.NSDateFormatter
tampoco tiene undateFormat
valor predeterminado , lo que causa pérdidas adicionales.Swift 3, 136 bytes
Gracias a la eliminación del
NS
prefijo 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:
fuente
R,
154150114112 bytesToma 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:
Sin golf:
EDICIONES: reemplazó nombres duplicados con variables; Me arregló para ser estúpido. -2 bytes convirtiendo la función en anónima (gracias, cat).
fuente
a=
para una función anónimaa=
? Algo como esto:(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="")}
es un objeto de función por sí solo.RStudio with R 3.2.3 (2015-12-10)
I getError in i(o, b) : invalid format '%06d'; use format %s for character objects
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!