Sorprendentemente, esta simple tarea ya no parece existir, así que ...
Su tarea es escribir un programa que tome como entrada un tiempo de 12 horas y lo convierta en "hora militar" o en formato de 24 horas.
La entrada tendrá la forma:
HH:MM am/pm
Aunque se permiten ligeras variaciones:
El espacio que separa am / pm del resto del tiempo es opcional.
La última parte puede ser "am" / "pm" o "a" / "p".
Cualquier capitalización está bien.
La salida será el tiempo ingresado, transformado en formato de 24 horas. Puede ser un número o una cadena.
Tanto para la entrada como para la salida:
Los 0 en primer lugar son opcionales. Los 0 en los últimos 3 lugares son obligatorios.
el delimitador que separa las horas y los minutos puede ser un ":", "" (un espacio) o nada.
Otras notas:
La medianoche se puede expresar como 0000 o 2400.
La medianoche se considerará "am", mientras que el mediodía se considerará "pm".
Su programa puede ser una función o un programa completo, y debería devolver el resultado o enviarlo a la salida estándar. El espacio en blanco al final está bien.
Ejemplos (no es necesario que admita todos los formatos):
12:00am -> 0000
1200 pm -> 1200
1234Am -> 00:34
134a -> 134
01:34PM -> 13 34
1234pm -> 1234
Este es el código de golf, por lo que gana el menor número de bytes. Dado que esto es tan trivial de resolver usando un incorporado, sería bueno ver algún código que resuelva esto manualmente (pero el uso de los incorporados está bien).
Solo para aclarar, no es necesario que admita todos los formatos posibles. Está bien admitir solo una entrada y un formato de salida único (de su elección). Sin embargo, me gustaría limitar el formato como se describe anteriormente (que ya es bastante gratuito). {1134,'pm'}
, por ejemplo, sería inaceptable.
01:54pm
¿funcionaría, pero1:54pm
no lo haría?Respuestas:
V ,
2117 bytes¡Gracias @DJMcMayhem por 4 bytes!
Pruébalo en línea! Esto toma el formato
HH:MMx
dondex
está oa
op
, y lo devuelve en el formatoHH:MM
Hexdump:
Explicación:
fuente
[1-12]
derecha? En ese caso, creo que podría hacerlo enó^12/0
lugar decw^R=^R"%12
çp/12^A
que es equivalente a:g/p/norm 12<C-a>
en vimMATL , 4 bytes
Pruébalo en línea!
Explicación
Función incorporada: conversión de cadena de fecha con detección automática de formato de entrada y con formato de salida
15
, que corresponde'HH:MM'
. Esto es equivalente a la respuesta Octave de @ StewieGriffin .fuente
Octava,
2117 bytesGuardado 4 bytes gracias a Luis Mendo. Podría especificar el formato número 15 en lugar de
'HHMM'
.Explicación:
Se trata de una función anónima teniendo una cadena
c
como entrada en el formato:'11:34 AM'
.datestr
reconoce el formato automáticamente como uno de los formatos de fecha estándar y lo emite en el formato número 15 especificado, que esHH:MM
.Dado que el formato de salida especificado no tiene
AM
uPM
Octave lo convierte automáticamente a lo que usted denomina tiempo militar.Pruébalo en línea.
Una versión que no
datestr
usa 35 bytesExplicación:
Toma una cadena de entrada
c
en el formato1134am
.O, un enfoque diferente para 37 bytes:
fuente
PowerShell ,
232019 bytesPruébalo en línea!
(Si está en Windows, puede omitir el
get-
, para bajar a 19 bytes. En TIO, aparentemente requiere elGet-Date
nombre completo ).Toma la entrada como una cadena
$args[0]
, la usa como entrada alGet-Date
cmdlet, que la analiza en undatetime
objeto .NET . Eso se pasa con el-f
parámetro ormat deHHmm
convertirlo a tiempo militar (la capitalHH
especifica el tiempo de 24 horas). La salida es implícita.El motor de análisis es bastante robusto, por lo que también se permiten entradas adicionales como
12am
o12:00am
están permitidas. Juegue con la entrada en TIO y vea qué más funciona.( Guardado 3 bytes gracias a @admalledd ... guardó otro byte gracias a @briantist )
fuente
$args[0]
y-f
, además de quitar las comillas simples alrededor del formato str:date $args[0]-f HHmm
. Al menos esto funciona en mi PowerShell ...Get-Date
con-f
, alguien me ha recordado que no necesita las comillas. Y también es bueno eliminar el espacio, ya que el analizador trata]
el final de un token. ¡Gracias!Python 2, 44 bytes
Formato de entrada:
01:23am
opcionalm
y espacios después de minutosFormato de salida:
123
fuente
Pyth,
2120 bytesToma la entrada del formulario
01 23a
como "01:23 am". Inicial 0 es opcional.La salida es de la forma
123
, con el 0 inicial omitido.En pseudocódigo:
Pruébalo en línea!
fuente
PHP,
3532 bytesformato de entrada: no distingue entre mayúsculas y minúsculas, requiere dos puntos y el
m
formato de salidahhmm
. utiliza incorporados:toma la entrada del primer argumento de la línea de comando.
PHP, 45 bytes, sin integraciones
formato de entrada en
(h)h:mm a(m)
minúsculas, formato de salida(h)hmm
.fuente
JavaScript (ES6), 40 bytes
La entrada debe estar formateada como:
12:32 am
fuente
GNU Coreutils (
1816 bytes)De un script de shell:
No acepta espacios en blanco en la entrada
En ese momento, también puede usar $ 1 e ignorar argumentos adicionales.
Original
Para permitir espacios en blanco en la entrada,
fuente
C #, 46 bytes
Las cadenas se toman en entrada como
12:00 AM
Hacer lo mismo pero subcadenas en la salida de la llamada predeterminada a
ToString
(Suponiendo una cultura deen-GB
) es 3 bytes más para 49 bytes:fuente
date
, 0 + 8 = 8 bytesSobre el tema de usar la herramienta adecuada para el trabajo ...
Toma la entrada como un argumento de línea de comando. Ejecutar con
+%H%M -d
(8 bytes de penalización). No hay un programa real aquí; todo el trabajo lo realizan los argumentos de la línea de comandos. (¡Esta es una demostración bastante buena de por qué hay una penalización por los argumentos de la línea de comandos!)Ejemplo:
fuente
Java 7,
138106105104 bytesPruébalo en línea!
La entrada está delimitada por dos puntos y tiene un espacio entre la hora y las am / pm. La salida no está delimitada por dos puntos.
-1 byte gracias a Kevin Cruijssen
fuente
HHmm
aHmm
.Japt , 14 bytes
Pruébalo en línea!
Esto solo funciona en Chrome. Aquí hay una versión que funciona en todos los navegadores:
¡Gracias nuevamente a ETHproductions por la ayuda!
fuente
Perl,
452837bytes2837 bytes(c / o @Dada)
(Código de 36 bytes, 1 byte para el
-p
conmutador del compilador )Acepta
0145pm
formatos de tipo, con am / pm o a / p. Se requieren ceros iniciales en las entradas.Prueba:
Mi respuesta original
(también revisado suavemente)
(Código de 39 bytes, 1 byte para el
-p
conmutador del compilador ).Acepta solo el formulario como 0145p o 0145a, y ningún otro, y requiere
perl -p
modo para funcionar.prueba:
fuente
-p
es necesario) si cambia las comillas simples por comillas dobles.s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1
(37 bytes). Y, por cierto, su primera solución puede reducirse un poco:s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e
(40 bytes)Commodore 64 BASIC, 301 bytes antes de ejecutar, 321 bytes utilizados una vez ejecutados
Para ingresar esto en un Commodore 64 real, necesitará usar abreviaturas de palabras clave BÁSICAS, como LE [shift] F para
LEFT$
, M [shift] I paraMID$
etc ... o puede probar CBM PRG STUDIO.La
TI$
variable en Commodore BASIC presenta la hora en formato de reloj de 24 horas como HHMMSS cuando se imprime. Eliminar el espacio después del número de línea no ahorra memoria ya que Commodore BASIC agrega el espacio automáticamente de todos modos cuando enumera el programa después de ingresarlo.Al convertir un número a una cadena con
STR$
, Commodore BASIC agregará el espacio (así que siPRINT A
verá un espacio antes de que se muestre el número), eliminé el espacio de apertura en la conversión de número a cadena con elRIGHT$
comando. Puede guardar algunos bytes modificando la línea cero a:por lo tanto, deberá declarar su tiempo de conversión antes de ejecutar el programa, de la siguiente manera:
En cualquier momento posterior, puede ver la hora actual con:
fuente
Java, 171 bytes
El formato de entrada es
HH:MM a/p
y el formato de salida esHHMM
. Abusando del hecho de que la función principal tiene una serie de cadenas para dividir la entrada en 3 secciones: hora, minuto e indicador a / p.Ejemplo de entrada y salida:
Versión sin golf:
fuente
enum
solía sostener elmain
. Nice :)REXX, 33 bytes
Utilizar:
Esto podría acortarse unos pocos bytes si no se usaran dos puntos como delimitador.
fuente
C (clang) , 94 bytes
Pruébalo en línea!
Estoy aquí para aprender, así que cualquier sugerencia sobre cómo puedo optimizar el código es bienvenida.
@ Johan du Toit ¡Gracias por guardar algunos bytes!
fuente
printf("%02d:%02d", (a=='p' ? 12 : 0) + (h %12), m);
C,
8772 bytesAhorró 15 bytes gracias a @Johan du Toit
Llame
f()
con una cadena mutable como argumento, la entrada es la salida.El formato es
HH:MMa/p
, dondea/p
es minúsculaa
o minúsculap
. No se permite ningún espacio entre el tiempo y el especificador de meridiano.Pruébalo con ideone .
fuente
i;f(char*p){i=atoi(p)%12+(p[5]^97?12:0);*p=i/10+48;p[1]=i%10+48;p[5]=0;}
(p[5]!=97)*12;
lugar de(p[5]^97?12:0);
tcl, 45
47Ahora usando un incorporado:
Se puede probar en http://rextester.com/TSRXI8802 donde hay un script que lo ejecuta de 0100 a.m. a 1259 p.m.
fuente
SmileBASIC, 67 bytes
Entrada:
HH:MMa/p
Salida:
HH MM
fuente
R, 68 bytes
Lee la entrada de stdin y se supone que está en uno de los siguientes formatos:
12:00 AM
12:00 am
12:00AM
12:00am
y la salida está en el formato:
[1] "00:00"
En la mayoría de los casos, la
strptime()
salida está en el formato:"2017-01-06 12:00:00 CET"
donde la fecha es la fecha local. Como tal, necesitamos usarsubstr()
para devolver solo la hora, sin embargo, si la entrada es medianoche (por ejemplo12:00am
), la salida es solo"2017-01-06 CET"
la razón de laif
cosa al final (debe haber una solución más inteligente).fuente
lubridate
, pero el nombre del paquete es demasiado largo (entre otros problemas).C,
159152bytesFormato de entrada:
07:30am
fuente
Pyke, 15 bytes
Pruébalo aquí!
fuente
Mathematica, 33 bytes
Función anónima. Toma una cadena como entrada y devuelve una cadena como salida. Funciona con la mayoría de los formatos, incluidos
hh:mm AM/PM
.fuente
JavaScript, 67 bytes
La entrada es como en el ejemplo
fuente
12:00 am
o12:00 pm
Haskell, 61 caracteres
Version corta:
Formato de entrada:
HHMM(a/p)
donde(a/p)
es 'a' o 'p' sin paréntesis.Formato de salida:
(hs, MM)
- una tupla que contiene las horas como un entero y MM aún como una cadena.Ejemplo:
Versión más larga (con más nombres útiles y una sustitución
hs
):fuente
Lisp común (
151bytes)OK, CL no está destinado a ser "conciso", pero me sorprende que no sea el más detallado para este.
Aquí está la versión de 122 bytes, que requiere una entrada de posición fija.
0145pm
o145p
son aceptables (con el espacio inicial en la primera posición de carácter).IMPRESIÓN:
Más bonito pero más grande
Usando solo el
Common-Lisp
paquete. Acepta (solo) la entrada en forma de horas enteras (con o sin letra inicial0
), literal:
, minutos de dos dígitos y seguimiento final opcionalam
opm
(solo en minúsculas). Permite espacios en blanco alrededor de la hora y alrededor de AM / PM, pero no directamente después de:
.Prueba:
pprint
la definición de la función:Desfuscado:
fuente
Retina ,
6160 bytesLa entrada se proporciona sin dos puntos de separación, encabezado obligatorio
0
y usando soloa
o enp
lugar deam
opm
, por ejemplo,0134a
es 01:34 am. Salidas en tiempo militar directo usando 0000 como medianoche. (Podría guardar algunos bytes si se me permite convertir, por ejemplo, a las 12:30 a.m.2430
, pero dudo que sea aceptable).Pruébalo en línea!
Explicación
Los dos casos iniciales se refieren a las "12" horas, ya que am / pm se invierte por 12:
Si el tiempo es entre la medianoche (12 a.m.) y la 1 a.m., cámbielo a 00 en lugar de a las 12 y quite el
a
.Si el tiempo es entre el mediodía (12 p.m.) y la 1 p.m., elimine la p para obtener las 24 horas.
Para cualquier otra hora:
Si es la hora de la mañana, simplemente quítelo
a
para obtener el tiempo de 24 horas.Si la hora es pm, elimine el
p
. Convierta el componente de hora a unario, agregue 12 y vuelva a convertir a decimal. Deja los minutos sin cambios.fuente
Lote, 40 bytes.
Toma la entrada como tres argumentos. Asume que el segundo argumento tiene cero a la izquierda donde sea necesario, el tercer argumento es
a
op
. Funciona tratando el tercer argumento como un nombre de variable indirecta, por lo tanto, lo agrega al número de horas; la cantidad de minutos no se ve afectada, por lo que solo se emite directamente. Si mezclar diferentes formatos está bien, se puede eliminar el último espacio para guardar un byte.(Más bien molesto, esta pregunta no apareció en la página de preguntas cuando la cargué originalmente, y solo me topé con ella porque estaba buscando otra pregunta).
fuente