Convert human readable time interval to date components
Perl: 61 characters
Thanks to @nutki.
s/-?\d+ *m?(.)/$$1+=$&/ge;$_="{y|o|d|h|i|s}";s/\w/${$&}+0/ge
Sample run:
bash-4.3$ perl -pe 's/-?\d+ *m?(.)/$$1+=$&/ge;$_="{y|o|d|h|i|s}";s/\w/${$&}+0/ge' <<< '1 year 2 months 3 seconds'
{1|2|0|0|0|3}
bash-4.3$ perl -pe 's/-?\d+ *m?(.)/$$1+=$&/ge;$_="{y|o|d|h|i|s}";s/\w/${$&}+0/ge' <<< '-2 day 5 year 8months'
{5|8|-2|0|0|0}
bash-4.3$ perl -pe 's/-?\d+ *m?(.)/$$1+=$&/ge;$_="{y|o|d|h|i|s}";s/\w/${$&}+0/ge' <<< '3day 9 years 4 seconds -5 minute 4 years 4 years -3seconds'
{17|0|3|0|-5|1}
My poor efforts: 78 77 characters
s/([+-]?\d+) *(..)/$a{$2}+=$1/ge;$_="{ye|mo|da|ho|mi|se}";s/\w./$a{$&}||0/ge
Python 2, 99 bytes
import re
f=lambda I:"{%s}"%"|".join(`sum(map(int,re.findall("(-?\d+) *m?"+t,I)))`for t in"yodhis")
This is a lambda function which takes in a string and simply uses a regex to extract the necessary numbers.
Thanks to Martin for pointing out that \s*
could just be <space>*
. It's easy to forget that regexes match spaces literally...
Ruby, 119 106 86 85 84 bytes
One byte saved thanks to Sp3000.
->i{?{+"yodhis".chars.map{|w|s=0;i.scan(/-?\d+(?= *m?#{w})/){|n|s+=n.to_i};s}*?|+?}}
This is an unnamed function, which takes the input as a string, and returns the result (also as a string). You can test it by assigning it to f
, say, and calling it like
f["3day 9 years 4 seconds -5 minute 4 years 4 years -3seconds"]