C ++ 14, 234 229 바이트
편집하다: 대신 기존 스타일 선언을 사용하여 5 바이트를 줄입니다 auto
.
나는 승자가 이미 선택되었으며 이것이 지금까지 가장 긴 제출 일 것이라는 것을 알고 있지만 아무도 아무도 기대하지 않았기 때문에 C ++ 솔루션을 게시해야했습니다. :)
솔직히 말해서 (물론 C ++ 측정에 의해) 얼마나 짧아 졌는지에 매우 만족합니다. . 또한 C ++ 11 / 14에 새로 추가 된 기능들도 상당히 훌륭합니다.
여기에는 타사 라이브러리가 없으며 표준 라이브러리 만 사용됩니다.
해결책은 람다 함수의 형태입니다.
[](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}