C ++ 14,234个 229字节
编辑:通过使用旧样式声明而不是削减5个字节auto
。
我知道获胜者已经被选中,这将是迄今为止提交时间最长的,但是我只需要发布一个C ++解决方案,因为我敢打赌没有人期望得到一个:)
老实说,我对它的短时长度感到非常满意(当然,通过C ++测量),而且我敢肯定,它不会再短了(仅一句话,请参阅下文) 。它也是C ++ 11/14新增功能的不错集合。
这里没有第三方库,仅使用标准库。
该解决方案采用lambda函数的形式:
[](auto&s){sregex_iterator e;auto r="{"s;for(auto&t:{"y","mo","d","h","mi","s"}){int a=0;regex g("-?\\d+ *"s+t);decltype(e)i(begin(s),end(s),g);for_each(i,e,[&](auto&b){a+=stoi(b.str());});r+=to_string(a)+"|";}r.back()='}';s=r;};
取消高尔夫:
[](auto&s)
{
sregex_iterator e;
auto r="{"s;
for(auto&t:{"y","mo","d","h","mi","s"})
{
int a=0;
regex g("-?\\d+\\s*"s+t);
decltype(e)i(begin(s),end(s),g);
for_each(i,e,[&](auto&b)
{
a+=stoi(b.str());
});
r+=to_string(a)+"|";
}
r.back()='}';
s=r;
}
由于某种原因,我不得不写
regex g("-?\\d+\\s*"s+t);
decltype(e)i(begin(s),end(s),g);
而不只是
decltype(e)i(begin(s),end(s),regex("-?\\d+\\s*"s+t));
因为如果我传入一个临时对象,迭代器只会返回一个匹配项。这对我来说似乎不对,所以我想知道GCC的正则表达式实现是否存在问题。
完整的测试文件(与GCC 4.9.2一起使用编译-std=c++14
):
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main()
{
string arr[] = {"1 year 2 months 3 seconds",
"-2 day 5 year 8months",
"3day 9 years 4 seconds -5 minute 4 years 4 years -3seconds"};
for_each(begin(arr), end(arr), [](auto&s){sregex_iterator e;auto r="{"s;for(auto&t:{"y","mo","d","h","mi","s"}){int a=0;auto g=regex("-?\\d+ *"s+t);decltype(e)i(begin(s),end(s),g);for_each(i,e,[&](auto&b){a+=stoi(b.str());});r+=to_string(a)+"|";}r.back()='}';s=r;});
for(auto &s : arr) {cout << s << endl;}
}
输出:
{1|2|0|0|0|3}
{5|8|-2|0|0|0}
{17|0|3|0|-5|1}