From df7d8919e1f8920972e667cfeb0e8dc6cbce2085 Mon Sep 17 00:00:00 2001
From: Sandipan Mohanty <s.mohanty@fz-juelich.de>
Date: Sun, 8 May 2022 20:44:47 +0200
Subject: [PATCH] Add first day examples and solutions

---
 day1/examples/fibonacci.cc   | 12 +++++++++++
 day1/examples/gcd.cc         | 21 +++++++++++++++++++
 day1/examples/hanoi.cc       | 19 +++++++++++++++++
 day1/examples/hello_qa.cc    | 12 +++++++++++
 day1/examples/hello_xyz.cc   | 10 +++++++++
 day1/examples/namespaces.cc  | 17 +++++++++++++++
 day1/examples/namespaces2.cc | 22 ++++++++++++++++++++
 day1/examples/numsort.cc     | 40 ++++++++++++++++++++++++++++++++++++
 day1/examples/onespace.cc    | 24 ++++++++++++++++++++++
 day1/examples/raw1.cc        |  8 ++++++++
 day1/examples/rawstring.cc   | 14 +++++++++++++
 day1/solutions/fibonacci.cc  | 17 +++++++++++++++
 day1/solutions/gcd.cc        | 24 ++++++++++++++++++++++
 day1/solutions/raw1.cc       | 12 +++++++++++
 14 files changed, 252 insertions(+)
 create mode 100644 day1/examples/fibonacci.cc
 create mode 100644 day1/examples/gcd.cc
 create mode 100644 day1/examples/hanoi.cc
 create mode 100644 day1/examples/hello_qa.cc
 create mode 100644 day1/examples/hello_xyz.cc
 create mode 100644 day1/examples/namespaces.cc
 create mode 100644 day1/examples/namespaces2.cc
 create mode 100644 day1/examples/numsort.cc
 create mode 100644 day1/examples/onespace.cc
 create mode 100644 day1/examples/raw1.cc
 create mode 100644 day1/examples/rawstring.cc
 create mode 100644 day1/solutions/fibonacci.cc
 create mode 100644 day1/solutions/gcd.cc
 create mode 100644 day1/solutions/raw1.cc

diff --git a/day1/examples/fibonacci.cc b/day1/examples/fibonacci.cc
new file mode 100644
index 0000000..61f74e0
--- /dev/null
+++ b/day1/examples/fibonacci.cc
@@ -0,0 +1,12 @@
+#include <iostream>
+#include <limits>
+
+int main()
+{
+    size_t umax{ std::numeric_limits<size_t>::max() };
+    unsigned nfib = 0;
+    size_t f0{ 0 }, f1{ 1 };
+    // Insert your code here
+    std::cout << "The largest number in the Fibonacci sequence under " << umax << " is " << f1 << "\n";
+    std::cout << "Number of entries in the Fibonacci sequence under " << umax << " is " << nfib << "\n";
+}
diff --git a/day1/examples/gcd.cc b/day1/examples/gcd.cc
new file mode 100644
index 0000000..b355e66
--- /dev/null
+++ b/day1/examples/gcd.cc
@@ -0,0 +1,21 @@
+#include <iostream>
+
+unsigned long euclid_gcd(unsigned long smaller, unsigned long larger)
+{
+    if (smaller > larger)
+        std::swap(smaller, larger);
+    // Fill in your code to implement Euclid's algorithm here.
+
+    return ? ? ? ;
+}
+
+int main(int argc, char* argv[])
+{
+    if (argc != 3) {
+        std::cout << "Usage:\n"
+                  << argv[0] << " number1 number2\n";
+        return 1;
+    }
+    unsigned long n1 = std::stoul(argv[1]), n2 = std::stoul(argv[2]);
+    std::cout << euclid_gcd(n1, n2) << "\n";
+}
diff --git a/day1/examples/hanoi.cc b/day1/examples/hanoi.cc
new file mode 100644
index 0000000..3f457bd
--- /dev/null
+++ b/day1/examples/hanoi.cc
@@ -0,0 +1,19 @@
+#include <iostream>
+#include <string>
+int the_other(int i, int j) { return 3 - i - j; }
+
+void transfer(unsigned long n, int from, int to)
+{
+    int oth = the_other(from, to);
+    if (n > 1)
+        transfer(n - 1, from, oth);
+    std::cout << n << ": " << from << "->" << to << "\n";
+    if (n > 1)
+        transfer(n - 1, oth, to);
+}
+
+int main()
+{
+    size_t N = 6;
+    transfer(N, 0, 1);
+}
diff --git a/day1/examples/hello_qa.cc b/day1/examples/hello_qa.cc
new file mode 100644
index 0000000..55fd5b2
--- /dev/null
+++ b/day1/examples/hello_qa.cc
@@ -0,0 +1,12 @@
+// examples/hello_qa.cc
+#include <string>
+#include <iostream>
+
+int main()
+{
+    std::string name;
+    std::cout << "What's your name ? ";
+    std::cin >> name;
+    std::cout << "Hello, " << name << "\n";
+}
+
diff --git a/day1/examples/hello_xyz.cc b/day1/examples/hello_xyz.cc
new file mode 100644
index 0000000..b75bb49
--- /dev/null
+++ b/day1/examples/hello_xyz.cc
@@ -0,0 +1,10 @@
+// examples/hello_xyz.cc
+#include <iostream>
+auto main(int argc, char* argv[]) -> int
+{
+    std::cout << "Hello, ";
+    if (argc > 1)
+        std::cout << argv[1] << "!\n";
+    else
+        std::cout << "world!\n";
+}
diff --git a/day1/examples/namespaces.cc b/day1/examples/namespaces.cc
new file mode 100644
index 0000000..8d908bd
--- /dev/null
+++ b/day1/examples/namespaces.cc
@@ -0,0 +1,17 @@
+#include <iostream>
+
+using namespace std;
+
+namespace UnitedKingdom {
+string London = "Big city";
+}
+namespace UnitedStates {
+string London = "Small town in Kentucky";
+}
+int main()
+{
+    using namespace UnitedKingdom;
+    cout << London << endl;
+    cout << UnitedStates::London << endl;
+    return 0;
+}
\ No newline at end of file
diff --git a/day1/examples/namespaces2.cc b/day1/examples/namespaces2.cc
new file mode 100644
index 0000000..481dbf2
--- /dev/null
+++ b/day1/examples/namespaces2.cc
@@ -0,0 +1,22 @@
+#include <iostream>
+namespace UnitedKingdom {
+std::string London = "Big city";
+}
+namespace UnitedStates {
+namespace KY {
+    std::string London = "Small town in Kentucky";
+}
+namespace OH {
+    std::string London = "Small town in Ohio";
+}
+}
+// The following definition is ok in C++17
+//namespace mylibrary::onefeature {
+//    double solve(int i);
+//}
+int main()
+{
+    namespace USOH = UnitedStates::OH;
+    std::cout << USOH::London << std::endl;
+    return 0;
+}
diff --git a/day1/examples/numsort.cc b/day1/examples/numsort.cc
new file mode 100644
index 0000000..90589b3
--- /dev/null
+++ b/day1/examples/numsort.cc
@@ -0,0 +1,40 @@
+#include <iostream>
+#include <string>
+#include <fstream>
+#include <filesystem>
+#include <vector>
+#include <sstream>
+
+namespace fs = std::filesystem;
+auto as_lines(fs::path file) -> std::vector<std::string>
+{
+    std::ifstream fin{ file };
+    std::string line;
+    std::vector<std::string> lines;
+    while (getline(fin, line)) lines.push_back(line);
+    return lines;
+}
+
+auto main(int argc, char* argv[]) -> int
+{
+    if (argc != 2) {
+        std::cerr << "Usage:\n"
+                  << argv[0] << " filename\n";
+        return 1;
+    }
+    auto content = as_lines(argv[1]);
+    std::sort(content.begin(), content.end(),
+                 [](auto l1, auto l2) {
+                     std::istringstream istr1{ l1 };
+                     std::istringstream istr2{ l2 };
+                     auto x1{0.}, x2{0.};
+                     istr1 >> x1;
+                     istr2 >> x2;
+                     return x1 < x2;
+                 }
+             );
+    for (std::string_view line : content) {
+        std::cout << line << "\n";
+    }
+}
+
diff --git a/day1/examples/onespace.cc b/day1/examples/onespace.cc
new file mode 100644
index 0000000..8b1037a
--- /dev/null
+++ b/day1/examples/onespace.cc
@@ -0,0 +1,24 @@
+// examples/onespace.cc
+#include <iostream>
+
+auto main(int argc, char* argv[]) -> int
+{
+    std::string line;
+    while (getline(std::cin, line)) {
+        if (line.empty()) {
+            continue;
+        }
+        bool sp{true};
+        for (auto c : line) {
+            if (isspace(c)) {
+                if (not sp) std::cout << '\t';
+                sp = true;
+            } else {
+                sp = false;
+                std::cout << c;
+            }
+        }
+        std::cout << "\n";
+    }
+}
+
diff --git a/day1/examples/raw1.cc b/day1/examples/raw1.cc
new file mode 100644
index 0000000..0781800
--- /dev/null
+++ b/day1/examples/raw1.cc
@@ -0,0 +1,8 @@
+#include <iostream>
+#include <string>
+
+int main()
+{
+    std::cout << "Use a single backslash character at the end of the line to continue input to the next line, as shown ...\n"
+              << "OBJ=a.o \\\n\tb.o\\\n\tc.o\n";
+}
diff --git a/day1/examples/rawstring.cc b/day1/examples/rawstring.cc
new file mode 100644
index 0000000..2c57d2d
--- /dev/null
+++ b/day1/examples/rawstring.cc
@@ -0,0 +1,14 @@
+#include <iostream>
+#include <string>
+
+int main()
+{
+    // clang-format off
+    std::string s = R"xyz(This is a " raw " C++11 string.)xyz";
+    std::cout << s << '\n';
+    s = R"(Inside a raw string \n does not create a new line.)";
+    std::cout << s << '\n';
+    s = R"(The regular expression to match a sequence of up to 3 digits is \d{3})";
+    // clang-format on
+    std::cout << s << '\n';
+}
diff --git a/day1/solutions/fibonacci.cc b/day1/solutions/fibonacci.cc
new file mode 100644
index 0000000..fc9cf96
--- /dev/null
+++ b/day1/solutions/fibonacci.cc
@@ -0,0 +1,17 @@
+#include <iostream>
+#include <limits>
+
+auto main() -> int
+{
+    size_t umax{ std::numeric_limits<size_t>::max() };
+    unsigned nfib = 0;
+    size_t f0{ 0 }, f1{ 1 };
+    do {
+        size_t f2 = f0 + f1;
+        f0 = f1;
+        f1 = f2;
+        ++nfib;
+    } while (f1 < umax - f0);
+    std::cout << "The largest number in the Fibonacci sequence under " << umax << " is " << f1 << "\n";
+    std::cout << "Number of entries in the Fibonacci sequence under " << umax << " is " << nfib << "\n";
+}
diff --git a/day1/solutions/gcd.cc b/day1/solutions/gcd.cc
new file mode 100644
index 0000000..f545c4e
--- /dev/null
+++ b/day1/solutions/gcd.cc
@@ -0,0 +1,24 @@
+#include <iostream>
+
+auto euclid_gcd(unsigned long smaller, unsigned long larger) -> unsigned long 
+{
+    if (smaller > larger)
+        std::swap(smaller, larger);
+    while (smaller != 0) {
+        auto rem = larger % smaller;
+        larger = smaller;
+        smaller = rem;
+    }
+    return larger;
+}
+
+auto main(int argc, char* argv[]) -> int 
+{
+    if (argc != 3) {
+        std::cout << "Usage:\n"
+                  << argv[0] << " number1 number2\n";
+        return 1;
+    }
+    unsigned long n1 = std::stoul(argv[1]), n2 = std::stoul(argv[2]);
+    std::cout << euclid_gcd(n1, n2) << "\n";
+}
diff --git a/day1/solutions/raw1.cc b/day1/solutions/raw1.cc
new file mode 100644
index 0000000..abe1558
--- /dev/null
+++ b/day1/solutions/raw1.cc
@@ -0,0 +1,12 @@
+#include <iostream>
+#include <string>
+
+auto main() -> int
+{
+    using namespace std;
+    cout << "Use a single backslash character at the end of the line to continue input to the next line, as shown ...\n"
+         << R"(OBJ=a.o \
+	b.o\
+	c.o
+)";
+}
-- 
GitLab