Défi
Écrivez le programme le plus court qui convertit un intervalle de temps lisible par l'homme pour dater les composants du formulaire:
{±YEARS|±MONTHS|±DAYS|±HOURS|±MINUTES|±SECONDS}
Exemples de cas
Chaque scénario de test est composé de deux lignes, entrée suivie d'une sortie:
1 year 2 months 3 seconds
{1|2|0|0|0|3}
-2 day 5 year 8months
{5|8|-2|0|0|0}
3day 9 years 4 seconds -5 minute 4 years 4 years -3seconds
{17|0|3|0|-5|1}
Règles
- Vous ne pouvez pas utiliser
strtotime
ou toute fonction intégrée qui fait tout le travail. - Victoires de code les plus courtes (octets)
- Vous pouvez imprimer votre sortie
stdout
ou un fichier, le résultat peut également être retourné par une fonction, c'est à vous - Le jeton peut être au singulier ou au pluriel.
- Les composants peuvent être dans un ordre aléatoire
- Il ne doit pas y avoir d'espace blanc entre le numéro et le jeton
- Le signe est facultatif lorsque l'intervalle de temps est positif (entrée et sortie)
- Si un composant apparaît plus d'une fois, les valeurs doivent être ajoutées
- Chaque composant a son propre signe
- Les composants doivent être traités séparément (par exemple,
80 minutes
reste égal à 80 dans la sortie) - L'entrée est garantie en minuscules
Bon golf!
Sign is optional when the time interval is positive
Est-ce à dire que l'entrée peut contenir des+
signes?Réponses:
CJam, 60 octets
Après avoir été coincé dans les années 60 pendant longtemps, j'ai finalement réussi à le réduire à 60 octets. Assez bien! Expédier!
Essayez-le en ligne
Écrasé:
Développé et commenté:
J'ai d'abord commencé à utiliser une approche basée sur des jetons, mais celle-ci est restée assez fermement bloquée à ... 61 octets. Soupir. J'ai donc totalement changé de vitesse et suis passé à cette approche basée sur les personnages, qui est de toute façon beaucoup plus intéressante.
Ma méthode d'analyse fonctionne en ajoutant tous les caractères numériques valides atteints (
0
-9
et-
) à un tampon et en analysant le tampon comme un entier lorsqu'un certain caractère de l'un des noms d'unité de temps est atteint. Ces personnages sonty
,t
,d
,h
,i
etc
, qui remplissent tous les conditions d'apparition dans un nom d'unité de temps et n'apparaissent pas avant le caractère de reconnaissance dans un autre nom d'unité de temps. En d'autres termes, lorsque l'un de ces caractères de reconnaissance d'unité de temps est atteint, le tampon numérique sera rempli avec le dernier chiffre vu si cela signale réellement une unité de temps, ou le tampon numérique sera vide si cela n'apparaît que dans, mais ne devrait pas signal t, une autre unité de temps. Dans les deux cas, le tampon numérique est analysé comme un entier, ou 0 s'il était vide, et cela est ajouté à la valeur d'unité de temps correspondante. Ainsi, les caractères de reconnaissance apparaissant dans d'autres unités de temps après leur caractère de reconnaissance n'ont aucun effet.D'autres hacks fous incluent:
Pour toute personne curieuse de ma solution basée sur des jetons qui s'est bloquée à 61 octets, je la publierai ici également. Cependant, je n'ai jamais réussi à l'étendre ou à le commenter.
CJam, 61 octets
la source
Perl: 61 caractères
Merci à @nutki.
Exemple d'exécution:
Mes pauvres efforts:
7877 caractèresla source
s/(-?\d+) *(..)/$$2+=$1/ge;$_="{ye|mo|da|ho|mi|se}";s/\w./${$&}+0/ge
s/-?\d+ *(m.|.)/$$1+=$&/ge;$_="{y|mo|d|h|mi|s}";s/\w+/${$&}+0/ge
(m.|.)
->m?(.)
économise 4 supplémentaires.Ruby,
119106868584 octetsUn octet enregistré grâce au Sp3000.
Il s'agit d'une fonction sans nom, qui prend l'entrée sous forme de chaîne et renvoie le résultat (également sous forme de chaîne). Vous pouvez le tester en l'affectant
f
, disons et en l'appelant commela source
Python 2, 99 octets
Il s'agit d'une fonction lambda qui prend une chaîne et utilise simplement une expression régulière pour extraire les nombres nécessaires.
Merci à Martin d'avoir souligné que cela
\s*
pourrait être le cas<space>*
. Il est facile d'oublier que les expressions rationnelles correspondent littéralement aux espaces ...la source
JavaScript
100105112Modifier l' ajout de chaînes de modèle (mis en œuvre pour la première fois en décembre 2014, donc valable pour ce défi) - à l'époque, je ne les connaissais pas
Edit Eureka, j'ai enfin compris le sens de
m?
toutes les autres réponses!Tester
la source
R, 197 octets
Je me rends compte que ce n'est pas une entrée compétitive du tout, je voulais surtout trouver une solution dans R. Toute aide raccourcissant cela est bien sûr la bienvenue.
Comme la réponse de Martin, il s'agit d'une fonction sans nom. Pour l'appeler, affectez-le
f
et passez une chaîne.C'est assez hideux, alors jetons un coup d'œil à une version non golfée.
Sur la seule base de la structure, il est facile de voir ce qui se passe, même si vous n'êtes pas trop familier avec R. Je développerai certains aspects d'aspect étranger.
paste0()
est la façon dont R combine les chaînes sans séparateur.La
str_extract_all()
fonction provient dustringr
package de Hadley Wickham . La gestion par R des expressions régulières dans le package de base laisse beaucoup à désirer, c'est làstringr
qu'intervient. Cette fonction renvoie une liste de correspondances d'expressions régulières dans la chaîne d'entrée. Remarquez comment le regex est entouré dans une fonctionperl()
- c'est juste dire que le regex est de style Perl, pas de style R.gsub()
effectue une recherche et un remplacement à l'aide d'une expression régulière pour chaque élément du vecteur d'entrée. Ici, nous lui disons de remplacer tout ce qui n'est pas un nombre ou un signe moins par une chaîne vide.Et voila. De plus amples explications seront fournies avec plaisir sur demande.
la source
library(stringr)
dans votre source?Cobra - 165
la source
C ++ 14,
234229 octetsEdit: réduisez 5 octets en utilisant l'ancienne déclaration de style au lieu de
auto
.Je sais que le gagnant a déjà été choisi et que ce sera la soumission la plus longue jusqu'à présent, mais je viens de publier une solution C ++, car je parie que personne ne s'y attendait du tout :)
Pour être honnête, je suis assez satisfait de la brièveté du résultat (par des mesures C ++, bien sûr), et je suis sûr qu'il ne peut pas être plus court que cela (avec une seule remarque, voir ci-dessous) . C'est aussi une belle collection de fonctionnalités nouvelles pour C ++ 11/14.
Pas de bibliothèques tierces ici, seule la bibliothèque standard est utilisée.
La solution se présente sous une forme de fonction lambda:
Non golfé:
Pour une raison quelconque, j'ai dû écrire
au lieu de juste
parce que l'itérateur ne retournerait qu'une seule correspondance si je passe un objet temporaire. Cela ne me semble pas juste, donc je me demande s'il y a un problème avec la mise en œuvre des expressions régulières de GCC.
Fichier de test complet (compilé avec GCC 4.9.2 avec
-std=c++14
):Production:
la source
PHP, 141 octets
prend l'entrée du premier argument de la ligne de commande; utilise
[,]
pour la sortie au lieu de{|}
. Courez avec-r
.panne
la source