Étonnamment, cette tâche simple ne semble pas déjà exister, alors ...
Votre tâche consiste à écrire un programme qui prend en entrée une heure de 12 heures, et la convertit en "heure militaire", ou au format 24 heures.
L'entrée se fera sous la forme:
HH:MM am/pm
Bien que de légères variations soient autorisées:
L'espace séparant l'am / pm du reste du temps est optionnel.
La dernière partie peut être "am" / "pm" ou "a" / "p".
Toute capitalisation est très bien.
La sortie sera l'heure entrée, transformée en format 24 heures. Il peut s'agir d'un nombre ou d'une chaîne.
Pour l'entrée et la sortie:
Les 0 en premier lieu sont facultatifs. Les 0 aux 3 dernières places sont obligatoires.
le délimiteur séparant les heures et les minutes peut être un ":", "" (un espace) ou rien.
Autres notes:
Minuit peut être exprimé en 0000 ou 2400.
Minuit sera considéré comme "am", tandis que midi sera considéré comme "pm".
Votre programme peut être une fonction, ou un programme complet, et doit soit retourner le résultat, soit le sortir vers la sortie standard. La fin des espaces blancs est correcte.
Exemples (vous n'êtes pas obligé de prendre en charge tous les formats):
12:00am -> 0000
1200 pm -> 1200
1234Am -> 00:34
134a -> 134
01:34PM -> 13 34
1234pm -> 1234
C'est le golf de code, donc le plus petit nombre d'octets gagne. Étant donné que c'est tellement trivial à résoudre en utilisant un intégré, il serait bien de voir du code qui résout manuellement cela (mais l'utilisation des intégrés est très bien).
Juste pour clarifier, vous n'êtes pas obligé de prendre en charge tous les formats possibles. La prise en charge d'une seule entrée et d'un seul format de sortie (de votre choix) convient parfaitement. Je voudrais cependant limiter le format comme indiqué ci-dessus (qui est déjà assez gratuit). {1134,'pm'}
, par exemple, serait inacceptable.
01:54pm
cela fonctionnerait, mais1:54pm
pas?Réponses:
V ,
2117 octetsMerci @DJMcMayhem pour 4 octets!
Essayez-le en ligne! Cela prend le format
HH:MMx
oùx
est soita
oup
, et le renvoie au formatHH:MM
Hexdump:
Explication:
la source
[1-12]
droit? Dans ce cas, je pense que vous pourriez faireó^12/0
au lieu decw^R=^R"%12
çp/12^A
qui équivaut à:g/p/norm 12<C-a>
in vimMATL , 4 octets
Essayez-le en ligne!
Explication
Fonction intégrée: conversion de chaîne de date avec détection automatique du format d'entrée et du format de sortie
15
, ce qui correspond à'HH:MM'
. Cela équivaut à la réponse Octave de @ StewieGriffin .la source
Octave,
2117 octetsEnregistré 4 octets grâce à Luis Mendo. Je pourrais spécifier le format numéro 15 au lieu de
'HHMM'
.Explication:
Ceci est une fonction anonyme prenant une chaîne
c
en entrée sur le format:'11:34 AM'
.datestr
reconnaît automatiquement le format comme l'un des formats de date standard et le sort au format spécifié numéro 15, qui estHH:MM
.Étant donné que le format de sortie spécifié n'a pas
AM
ouPM
Octave le convertit automatiquement en ce que vous appelez l'heure militaire.Essayez-le en ligne.
Une version n'utilisant pas en
datestr
utilisant 35 octetsExplication:
Prend une chaîne d'entrée
c
sur le format1134am
.Ou, une approche différente pour 37 octets:
la source
PowerShell ,
232019 octetsEssayez-le en ligne!
(Si vous êtes sous Windows, vous pouvez omettre le
get-
, pour descendre à 19 octets. Sur TIO, il nécessite apparemment leGet-Date
nom complet .)Prend l'entrée sous forme de chaîne
$args[0]
, l'utilise comme entrée de l'Get-Date
applet de commande, qui l'analyse en undatetime
objet .NET . Cela est passé avec le-f
paramètre ormat deHHmm
pour le convertir en heure militaire (la capitaleHH
spécifie l'heure de 24 heures). La sortie est implicite.Le moteur d'analyse est assez robuste, donc des entrées supplémentaires comme
12am
ou12:00am
sont également autorisées. Jouez avec l'entrée sur TIO et voyez ce qui fonctionne.( Enregistré 3 octets grâce à @admalledd ... enregistré un autre octet grâce à @briantist )
la source
$args[0]
et-f
, ainsi que de retirer les guillemets simples autour du format str:date $args[0]-f HHmm
. Au moins, cela fonctionne sur mon PowerShell ...Get-Date
avec-f
, quelqu'un m'a rappelé que vous n'avez pas besoin des citations. Et bon appel à la suppression de l'espace également, car l'analyseur traite le]
comme la fin d'un jeton. Merci!Python 2, 44 octets
Format d'entrée:, en
01:23am
optionm
et espaces après les minutesFormat de sortie:
123
la source
Pyth,
2120 octetsPrend l'entrée du formulaire
01 23a
comme "01:23 am". Le 0 initial est facultatif.La sortie est de la forme
123
, avec le 0 initial omis.En pseudocode:
Essayez-le en ligne!
la source
PHP,
3532 octetsformat d'entrée: insensible à la casse, nécessite deux-points et le
m
format de sortiehhmm
. utilise des fonctions intégrées:prend l'entrée du premier argument de ligne de commande.
PHP, 45 octets, aucun intégré
format d'entrée en
(h)h:mm a(m)
minuscules, format de sortie(h)hmm
.la source
JavaScript (ES6), 40 octets
L'entrée doit être formatée comme:
12:32 am
la source
GNU Coreutils (
1816 octets)À partir d'un script shell:
N'accepte pas les espaces dans l'entrée
À ce stade, peut également utiliser $ 1 et ignorer les arguments supplémentaires.
Original
Pour autoriser les espaces dans l'entrée,
la source
C #, 46 octets
Les chaînes sont prises en entrée comme
12:00 AM
Faire la même chose mais sous-chaîne sur la sortie de l'appel par défaut à
ToString
(en supposant une culture deen-GB
) est 3 octets de plus pour 49 octets:la source
date
, 0 + 8 = 8 octetsAu sujet de l'utilisation du bon outil pour le travail…
Prend l'entrée comme argument de ligne de commande. Courez avec
+%H%M -d
(pénalité de 8 octets). Il n'y a pas de programme réel ici; l'ensemble du travail est effectué par les arguments de la ligne de commande. (Ceci est une assez bonne démonstration de la raison pour laquelle il existe une pénalité pour les arguments de ligne de commande!)Exemple:
la source
Java 7,
138106105 105104 octetsEssayez-le en ligne!
L'entrée est délimitée par deux points et a un espace entre l'heure et le matin / l'après-midi. La sortie n'est pas délimitée par deux points.
-1 octet grâce à Kevin Cruijssen
la source
HHmm
àHmm
.Japt , 14 octets
Essayez-le en ligne!
Cela ne fonctionne que sur Chrome. Voici une version qui fonctionne dans tous les navigateurs:
Merci encore à ETHproductions pour l'aide!
la source
Perl,
452837octets2837 octets(a / s @Dada)
(Code de 36 octets, 1 octet pour le
-p
commutateur du compilateur )Accepte
0145pm
les formats de type, avec am / pm ou a / p. Zéros de tête sur les entrées nécessaires.Tester:
Ma réponse originale
(également légèrement révisé)
(Code de 39 octets, 1 octet pour le
-p
commutateur du compilateur .)Accepte uniquement le formulaire comme 0145p ou 0145a, et aucun autre, et nécessite le
perl -p
mode pour fonctionner.tester:
la source
-p
est nécessaire) si vous modifiez les guillemets simples pour les guillemets doubles.s/(..)(.)$//;$_=$_%12+12*(p eq$2).$1
(37 octets). Et en passant, votre première solution peut être un peu étudiée:s/(..)(..)([ap])/$1%12+12*($3eq"p").$2/e
(40 octets)Commodore 64 BASIC, 301 octets avant l'exécution, 321 octets utilisés une fois l'exécution
Pour entrer cela sur un vrai Commodore 64, vous devrez utiliser les abréviations de mots clés BASIC, telles que LE [shift] F pour
LEFT$
, M [shift] I pourMID$
etc ... ou vous pouvez essayer CBM PRG STUDIO.La
TI$
variable dans Commodore BASIC présente l'heure au format 24 heures au format HHMMSS lors de l'impression. La suppression de l'espace après le numéro de ligne n'économise pas de mémoire car le Commodore BASIC ajoute automatiquement de l'espace de toute façon lorsque vous listez le programme après l'avoir entré.Lors de la conversion d'un nombre en chaîne avec
STR$
, le Commodore BASIC ajoutera de l'espace (donc si vousPRINT A
verrez un espace avant que le nombre ne s'affiche), j'ai supprimé l'espace d'ouverture sur le nombre en conversion de chaîne avec laRIGHT$
commande. Vous pouvez économiser quelques octets en modifiant la ligne zéro pour:vous devrez donc déclarer votre temps de conversion avant d'exécuter le programme, comme suit:
À tout moment par la suite, vous pouvez voir l'heure actuelle avec:
la source
Java, 171 octets
Le format d'entrée est
HH:MM a/p
et le format de sortie estHHMM
. Abuser du fait que la fonction principale dispose d'un tableau de chaînes pour diviser l'entrée en 3 sections: heure, minute et indicateur a / p.Exemple d'entrée et de sortie:
Version non golfée:
la source
enum
utilisé pour tenir lemain
. Nice :)REXX, 33 octets
Utilisation:
Cela pourrait être raccourci de quelques octets si un deux-points comme délimiteur n'était pas utilisé.
la source
C (clang) , 94 octets
Essayez-le en ligne!
Je suis ici pour apprendre, donc tous les conseils sur la façon d'optimiser le code sont les bienvenus.
@ Johan du Toit Merci d'avoir économisé quelques octets!
la source
printf("%02d:%02d", (a=='p' ? 12 : 0) + (h %12), m);
C,
8772 octets15 octets enregistrés grâce à @Johan du Toit
Appelez
f()
avec une chaîne mutable comme argument, l'entrée est la sortie.Le format est
HH:MMa/p
, oùa/p
est en minusculea
ou en minusculep
. Aucun espace entre l'heure et le spécificateur méridien n'est autorisé.Essayez-le sur ideone .
la source
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;
place de(p[5]^97?12:0);
tcl, 45
47Maintenant, en utilisant un intégré:
Testable sur http://rextester.com/TSRXI8802 où il existe un script qui l'exécute de 01h00 à 1259h00
la source
SmileBASIC, 67 octets
Contribution:
HH:MMa/p
Sortie:
HH MM
la source
R, 68 octets
Lit l'entrée de stdin et il est supposé être dans l'un des formats suivants:
12:00 AM
12:00 am
12:00AM
12:00am
et la sortie est au format:
[1] "00:00"
Dans la plupart des cas, la
strptime()
sortie est au format:"2017-01-06 12:00:00 CET"
où la date est la date locale. En tant que tel, nous devons utilisersubstr()
pour renvoyer uniquement l'heure, cependant, si l'entrée est minuit (par exemple12:00am
), la sortie n'est que"2017-01-06 CET"
ce qui est la raison de laif
chose à la fin (il doit y avoir une solution de contournement plus intelligente).la source
lubridate
, mais le nom du paquet est trop long (entre autres problèmes).C,
159152 octetsFormat d'entrée:
07:30am
la source
Pyke, 15 octets
Essayez-le ici!
la source
Mathematica, 33 octets
Fonction anonyme. Prend une chaîne en entrée et renvoie une chaîne en sortie. Fonctionne avec la plupart des formats, y compris
hh:mm AM/PM
.la source
JavaScript, 67 octets
L'entrée est comme dans l'exemple
la source
12:00 am
ou12:00 pm
Haskell, 61 caractères
Version courte:
Format d'entrée:
HHMM(a/p)
où(a/p)
est soit 'a' soit 'p' sans parenthèses.Format de sortie:
(hs, MM)
- un tuple contenant les heures sous forme d'entier et MM toujours sous forme de chaîne.Exemple:
Version plus longue (avec des noms plus utiles et une substitution
hs
):la source
Lisp commun (
151122 octets)OK, CL n'est pas censé être "laconique" mais je suis juste surpris que ce ne soit pas le plus bavard pour celui-ci.
Voici la version 122 octets, qui nécessite une entrée à position fixe.
0145pm
ou145p
sont acceptables (avec l'espace de tête dans la première position de caractère).PPRINT:
Plus agréable mais plus grand
Utiliser uniquement le
Common-Lisp
package. Accepte (uniquement) la saisie sous forme d'heures entières (avec ou sans interligne0
), littérales:
, minutes à deux chiffres et facultatif à la finam
oupm
(en minuscules uniquement). Autorise les espaces autour de l'heure et autour de l'AM / PM, mais pas directement après le:
.Tester:
pprint
la définition de la fonction:Désobscurci:
la source
Rétine ,
6160 octetsL'entrée est donnée sans séparer les deux-points, interligne obligatoire
0
et en utilisant uniquementa
ou à lap
place deam
oupm
, par exemple0134a
est 01h34. Sorties en temps militaire simple en utilisant 0000 comme minuit. (Je pourrais économiser quelques octets si je suis autorisé à convertir, par exemple, 12h30 en2430
, mais je doute que cela soit acceptable).Essayez-le en ligne!
Explication
Les deux premiers cas concernent les "12" heures, car am / pm est inversé pour 12:
Si l'heure est comprise entre minuit (12 h) et 1 h, remplacez-la par 00 au lieu de 12 et supprimez le
a
.Si l'heure est comprise entre midi (12 h) et 13 h, retirez le p pour obtenir simplement l'heure de 24 heures.
Pour toute autre heure:
Si l'heure est am, retirez simplement le
a
pour obtenir l'heure de 24 heures.Si l'heure est pm, retirez le
p
. Convertissez le composant horaire en unaire, ajoutez 12 et reconvertissez en décimal. Laissez les minutes inchangées.la source
Lot, 40 octets
Prend l'entrée comme trois arguments. Suppose que le deuxième argument a un zéro en tête si nécessaire, le troisième argument est soit
a
oup
. Fonctionne en traitant le troisième argument comme un nom de variable indirecte, l'ajoutant donc au nombre d'heures; le nombre de minutes n'est pas affecté, il est donc simplement émis directement. Si le mélange de différents formats est OK, le dernier espace peut être supprimé pour enregistrer un octet.(Plutôt ennuyeux, cette question n'apparaissait pas sur la page des questions lorsque je l'ai chargée à l'origine, et je ne suis tombée dessus que parce que je cherchais une autre question.)
la source