aboutsummaryrefslogtreecommitdiff
path: root/challenge-238/deadmarshal/cpp/ch-2.cpp
diff options
context:
space:
mode:
author冯昶 <fengchang@novel-supertv.com>2023-10-16 16:39:52 +0800
committer冯昶 <fengchang@novel-supertv.com>2023-10-16 16:39:52 +0800
commit50febb3c84c6adc42c33005f8f85ae229ddde328 (patch)
treee41f1a1878b94c7a38e1de0bf18031a83f7f5254 /challenge-238/deadmarshal/cpp/ch-2.cpp
parent39dda85aa681328178935c4bc0c0fe87c9e63f60 (diff)
parentafac53ab966abe7e14039640d054f82eb323097c (diff)
downloadperlweeklychallenge-club-50febb3c84c6adc42c33005f8f85ae229ddde328.tar.gz
perlweeklychallenge-club-50febb3c84c6adc42c33005f8f85ae229ddde328.tar.bz2
perlweeklychallenge-club-50febb3c84c6adc42c33005f8f85ae229ddde328.zip
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'challenge-238/deadmarshal/cpp/ch-2.cpp')
-rw-r--r--challenge-238/deadmarshal/cpp/ch-2.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/challenge-238/deadmarshal/cpp/ch-2.cpp b/challenge-238/deadmarshal/cpp/ch-2.cpp
new file mode 100644
index 0000000000..e2c00022aa
--- /dev/null
+++ b/challenge-238/deadmarshal/cpp/ch-2.cpp
@@ -0,0 +1,55 @@
+#include<iostream>
+#include<vector>
+#include<algorithm>
+
+template<typename T>
+T product(T n)
+{
+ T prod = 1;
+ while(n)
+ {
+ prod *= n % 10;
+ n /= 10;
+ }
+ return prod;
+}
+
+template<typename T>
+T helper(T n)
+{
+ T sum = 0;
+ while(n >= 10)
+ {
+ sum++;
+ n = product<T>(n);
+ }
+ return sum;
+}
+
+template<typename T>
+void persistence_sort(std::vector<T>& v)
+{
+ std::sort(v.begin(),v.end(),[](T a, T b){
+ T ha = helper<T>(a), hb = helper<T>(b);
+ return ha == hb ? a < b : ha < hb;
+ });
+}
+
+template<typename T>
+std::ostream &operator<<(std::ostream &os,
+ const std::vector<T>& vec)
+{
+ for(const auto &e : vec) os << e << ' ';
+ os << "\n";
+ return os;
+}
+
+int main()
+{
+ std::vector<int> vec1{15,99,1,34},vec2{50,25,33,22};
+ persistence_sort(vec1);
+ persistence_sort(vec2);
+ std::cout << vec1 << vec2;
+ return 0;
+}
+