aboutsummaryrefslogtreecommitdiff
path: root/challenge-180/massa/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-180/massa/cpp')
-rw-r--r--challenge-180/massa/cpp/CMakeLists.txt7
-rw-r--r--challenge-180/massa/cpp/ch-1.cc25
-rw-r--r--challenge-180/massa/cpp/ch-2.cc19
3 files changed, 51 insertions, 0 deletions
diff --git a/challenge-180/massa/cpp/CMakeLists.txt b/challenge-180/massa/cpp/CMakeLists.txt
new file mode 100644
index 0000000000..dc8ce5f7ef
--- /dev/null
+++ b/challenge-180/massa/cpp/CMakeLists.txt
@@ -0,0 +1,7 @@
+cmake_minimum_required(VERSION 2.8)
+
+project(ch-1)
+SET(CMAKE_CXX_COMPILER "/usr/bin/clang++")
+SET(CMAKE_CXX_STANDARD 20)
+add_executable(${PROJECT_NAME} ch-1.cc)
+add_executable(ch-2 ch-2.cc)
diff --git a/challenge-180/massa/cpp/ch-1.cc b/challenge-180/massa/cpp/ch-1.cc
new file mode 100644
index 0000000000..f6e69de7f2
--- /dev/null
+++ b/challenge-180/massa/cpp/ch-1.cc
@@ -0,0 +1,25 @@
+
+#include <span>
+#include <ranges>
+#include <iostream>
+#include <string_view>
+
+template <std::input_iterator It, std::sentinel_for<It> S>
+It first_unique(It begin, S end) {
+ for( auto it = begin; it != end; ++it )
+ if( std::find(begin, it, *it) == it && std::find(it+1, end, *it) == end )
+ return it;
+ return end;
+}
+
+auto first_unique(std::ranges::input_range auto range) {
+ return first_unique(begin(range), end(range));
+}
+
+int main(int argc, char **argv) {
+ for( std::string_view a: std::span { argv+1, argv+argc } ) {
+ auto u = first_unique(a);
+ std::cout << (u == std::end(a) ? -1 : u - std::begin(a)) << ' ' << a << '\n';
+ }
+}
+
diff --git a/challenge-180/massa/cpp/ch-2.cc b/challenge-180/massa/cpp/ch-2.cc
new file mode 100644
index 0000000000..a878f2dbf5
--- /dev/null
+++ b/challenge-180/massa/cpp/ch-2.cc
@@ -0,0 +1,19 @@
+
+#include <span>
+#include <ranges>
+#include <iostream>
+#include <string_view>
+
+std::ostream& operator<<(std::ostream &o, std::ranges::range auto r) {
+ if( begin(r) == end(r) ) return o;
+ std::copy(begin(r), end(r)-1, std::ostream_iterator<decltype(*begin(r))>{o, ", "});
+ return o << end(r)[-1];
+}
+
+int main(int argc, char **argv) {
+ if( argc <= 1 ) return 0;
+ int needle = std::stoi(argv[1]);
+ auto e = std::remove_if(argv+2, argv+argc, [=](auto x){ return std::stoi(x) <= needle; });
+ std::cout << std::span{ argv+2, e } << '\n';
+}
+