From 38c9efb30cb4a45c51e03b858e0f275c001352a8 Mon Sep 17 00:00:00 2001
From: Martin Goik <goik@hdm-stuttgart.de>
Date: Mon, 5 Feb 2024 18:18:05 +0100
Subject: [PATCH] Exam winter 2023/24

---
 Doc/Sd1/Appendix/Exam/2023/Winter/exam.xml    | 202 ++++++++++++++++++
 Doc/Sd1/Appendix/appendix.xml                 |   4 +
 Klausuren/Sd1/2023winter/Exam/Readme.md       |  55 +++++
 Klausuren/Sd1/2023winter/Exam/pom.xml         | 129 +++++++++++
 .../Exam/src/main/assembly/assembly.xml       |  36 ++++
 .../mi/sd1/task1/A_TrafficLight.java          |  94 ++++++++
 .../de/hdm_stuttgart/mi/sd1/task1/B_Max.java  |  59 +++++
 .../hdm_stuttgart/mi/sd1/task1/C_WebUrl.java  |  77 +++++++
 .../hdm_stuttgart/mi/sd1/task1/D_Array.java   |  67 ++++++
 .../mi/sd1/task1/package-info.java            |  22 ++
 .../hdm_stuttgart/mi/sd1/task2/Direction.java |  47 ++++
 .../mi/sd1/task2/WindForecast.java            |  37 ++++
 .../mi/sd1/task2/package-info.java            |  18 ++
 .../mi/sd1/task1/doc-files/weburlBlank.png    | Bin 0 -> 13604 bytes
 .../mi/sd1/task1/doc-files/weburlProtocol.png | Bin 0 -> 10900 bytes
 .../main/javadoc/resources/fonts/dejavu.css   |   3 +
 .../main/javadoc/resources/jdocSupplement.css |  72 +++++++
 .../main/javadoc/resources/jdocSupplement.js  |   7 +
 .../Exam/src/main/resources/log4j2.xml        |  21 ++
 .../mi/sd1/ShowReachedPoints.java             |  26 +++
 .../mi/sd1/task1/A_TrafficLightTest.java      |  28 +++
 .../hdm_stuttgart/mi/sd1/task1/B_MaxTest.java |  37 ++++
 .../mi/sd1/task1/C_WebUrlTest.java            |  66 ++++++
 .../mi/sd1/task1/D_ArrayTest.java             | 118 ++++++++++
 .../mi/sd1/task2/WindForecastTest.java        |  56 +++++
 Klausuren/Sd1/2023winter/Solve/Readme.md      |  55 +++++
 Klausuren/Sd1/2023winter/Solve/pom.xml        | 129 +++++++++++
 .../Solve/src/main/assembly/assembly.xml      |  36 ++++
 .../hdm_stuttgart/mi/sd1/ignore_me/Error.java |  19 ++
 .../mi/sd1/ignore_me/WindSearch.java          |  26 +++
 .../mi/sd1/task1/A_TrafficLight.java          |  97 +++++++++
 .../de/hdm_stuttgart/mi/sd1/task1/B_Max.java  |  49 +++++
 .../hdm_stuttgart/mi/sd1/task1/C_WebUrl.java  |  83 +++++++
 .../hdm_stuttgart/mi/sd1/task1/D_Array.java   |  77 +++++++
 .../mi/sd1/task1/package-info.java            |  22 ++
 .../hdm_stuttgart/mi/sd1/task2/Direction.java |  42 ++++
 .../mi/sd1/task2/WindForecast.java            |  64 ++++++
 .../mi/sd1/task2/package-info.java            |  18 ++
 .../mi/sd1/task1/doc-files/weburlBlank.png    | Bin 0 -> 13604 bytes
 .../mi/sd1/task1/doc-files/weburlProtocol.png | Bin 0 -> 10900 bytes
 .../main/javadoc/resources/fonts/dejavu.css   |   3 +
 .../main/javadoc/resources/jdocSupplement.css |  72 +++++++
 .../main/javadoc/resources/jdocSupplement.js  |   7 +
 .../Solve/src/main/resources/log4j2.xml       |  21 ++
 .../mi/sd1/ShowReachedPoints.java             |  26 +++
 .../mi/sd1/task1/A_TrafficLightTest.java      |  28 +++
 .../hdm_stuttgart/mi/sd1/task1/B_MaxTest.java |  37 ++++
 .../mi/sd1/task1/C_WebUrlTest.java            |  66 ++++++
 .../mi/sd1/task1/D_ArrayTest.java             | 118 ++++++++++
 .../mi/sd1/task2/WindForecastTest.java        |  56 +++++
 50 files changed, 2432 insertions(+)
 create mode 100644 Doc/Sd1/Appendix/Exam/2023/Winter/exam.xml
 create mode 100644 Klausuren/Sd1/2023winter/Exam/Readme.md
 create mode 100644 Klausuren/Sd1/2023winter/Exam/pom.xml
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/assembly/assembly.xml
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlBlank.png
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlProtocol.png
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/fonts/dejavu.css
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.css
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.js
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/main/resources/log4j2.xml
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java
 create mode 100644 Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/Readme.md
 create mode 100644 Klausuren/Sd1/2023winter/Solve/pom.xml
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/assembly/assembly.xml
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/Error.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/WindSearch.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlBlank.png
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlProtocol.png
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/fonts/dejavu.css
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.css
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.js
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/main/resources/log4j2.xml
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java
 create mode 100644 Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java

diff --git a/Doc/Sd1/Appendix/Exam/2023/Winter/exam.xml b/Doc/Sd1/Appendix/Exam/2023/Winter/exam.xml
new file mode 100644
index 000000000..e072eb5e2
--- /dev/null
+++ b/Doc/Sd1/Appendix/Exam/2023/Winter/exam.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section version="5.0" xml:id="sd1_exam_2023_winter" xml:lang="en"
+         xmlns="http://docbook.org/ns/docbook"
+         xmlns:xlink="http://www.w3.org/1999/xlink"
+         xmlns:xila="http://www.w3.org/2001/XInclude/local-attributes"
+         xmlns:xi="http://www.w3.org/2001/XInclude"
+         xmlns:trans="http://docbook.org/ns/transclusion"
+         xmlns:svg="http://www.w3.org/2000/svg"
+         xmlns:m="http://www.w3.org/1998/Math/MathML"
+         xmlns:html="http://www.w3.org/1999/xhtml"
+         xmlns:db="http://docbook.org/ns/docbook">
+  <title>SD1 examination winter 2023</title>
+
+  <section xml:id="sd1_exam_2023_winter_task1">
+    <title>Implementing tasks</title>
+
+    <section xml:id="sd1_exam_2023_winter_task1_preparation">
+      <title>Preparation</title>
+
+      <orderedlist>
+        <listitem>
+          <para>Download and unzip the above file
+          <filename>exam.zip</filename>. You should see a directory
+          »<filename>Exam</filename>« containing a
+          <filename>pom.xml</filename> file.</para>
+        </listitem>
+
+        <listitem>
+          <para>Open this project in your <productname>IDEA</productname> IDE
+          by selecting the <filename>Exam/pom.xml</filename> file. Your home
+          directory is <filename>/home/student</filename>.</para>
+        </listitem>
+      </orderedlist>
+    </section>
+
+    <section xml:id="sd1_exam_2023_winter_task1_task">
+      <title>Task</title>
+
+      <qandaset defaultlabel="qanda" xml:id="sd1_exam_2023_winter_task1Qanda">
+        <qandadiv>
+          <qandaentry>
+            <question>
+              <para>Open the <filename>Readme.md</filename> file in your
+              project's root. It contains all necessary instructions for
+              solving the implementation tasks.</para>
+            </question>
+
+            <answer>
+              <para>Solution see <link
+              xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/-/tree/master/Klausuren/Sd1/2023winter/Solve">winter
+              2023 exam</link>.</para>
+            </answer>
+          </qandaentry>
+        </qandadiv>
+      </qandaset>
+    </section>
+
+    <section xml:id="sd1_exam_2023_winter_task1Caveats">
+      <title>Caveats</title>
+
+      <itemizedlist>
+        <listitem>
+          <para>When approaching end of examination check your input for
+          completeness prior to being automatically logged out by the system.
+          Remember: There is 120 minutes for the examination and another 5
+          minutes to check for completeness.</para>
+        </listitem>
+
+        <listitem>
+          <para>Projects residing just on your local workstation's file system
+          cannot be recovered after finishing the exam.</para>
+        </listitem>
+      </itemizedlist>
+    </section>
+  </section>
+
+  <section xml:id="sd1_exam_2023_winter_task2">
+    <title>Beginner's nightmare</title>
+
+    <qandaset defaultlabel="qanda" xml:id="sd1_exam_2023_winter_task3Qanda">
+      <qandadiv>
+        <qandaentry>
+          <question>
+            <para>We consider the following class method
+            <methodname>sum</methodname>:</para>
+
+            <programlisting language="none">01 /**
+02  * Summing up an int array's values
+03  *
+04  * @param values An array of int values
+05  * @return The sum of all array values
+06  */
+07 public static int sum(int[] values) {
+08
+09    int sum;
+10
+11    for (i = 0; i &lt;= values.length; i++) {
+12        sum += values[i];
+13    }
+14    return sum;
+15 }</programlisting>
+
+            <para>This code does contain errors. Explain and correct each of
+            those. Line numbers are being provided for your convenience</para>
+          </question>
+
+          <answer>
+            <para>There are errors:</para>
+
+            <glosslist>
+              <glossentry>
+                <glossterm>Line 9</glossterm>
+
+                <glossdef>
+                  <para>The variable <code language="java">sum</code> lacks
+                  initialization <code language="java">int sum =
+                  0</code>.</para>
+                </glossdef>
+              </glossentry>
+
+              <glossentry>
+                <glossterm>Line 16</glossterm>
+
+                <glossdef>
+                  <para>There are two errors here:</para>
+
+                  <itemizedlist>
+                    <listitem>
+                      <para>Variable i has not been declared: <code
+                      language="java">int i = 0; ...</code></para>
+                    </listitem>
+
+                    <listitem>
+                      <para>The loop's upper limit is being breached: <code
+                      language="java">i &lt; values.length</code> rather then
+                      <code language="java">i &lt;= values.length</code> is
+                      being required.</para>
+                    </listitem>
+                  </itemizedlist>
+                </glossdef>
+              </glossentry>
+            </glosslist>
+          </answer>
+        </qandaentry>
+      </qandadiv>
+    </qandaset>
+  </section>
+
+  <section xml:id="sd1_exam_2023_winter_task3">
+    <title>Strange endless loop result</title>
+
+    <qandaset defaultlabel="qanda" xml:id="sd1_exam_2023_winter_task2Qanda">
+      <qandadiv>
+        <qandaentry>
+          <question>
+            <para>We consider:</para>
+
+            <programlisting language="java">for (byte b = 0; b &lt;= Byte.MAX_VALUE; b++);</programlisting>
+
+            <para>This snippet causes an endless loop. Give an
+            explanation.</para>
+
+            <tip>
+              <para>Consider the ++ operator's behavior when reaching variable
+              <code>b</code>'s upper limit.</para>
+            </tip>
+          </question>
+
+          <answer>
+            <para>The operator ++ acting on a byte variable will cycle between
+            <code language="java">Byte.MIN_VALUE</code> and <code
+            language="java">Byte.MAX_VALUE</code>. Consider:</para>
+
+            <informaltable border="1">
+              <tr>
+                <th>Code</th>
+
+                <th>Output</th>
+              </tr>
+
+              <tr>
+                <td valign="top"><programlisting language="java">byte b = Byte.MAX_VALUE;
+System.out.println(b);
+b++;
+System.out.println(b);</programlisting></td>
+
+                <td valign="top"><screen>127
+-128</screen></td>
+              </tr>
+            </informaltable>
+
+            <para>Before breeching the loop's upper limit <code
+            language="java">Byte.MAX_VALUE</code> our variable <code
+            language="java">b will thus transition</code> from Byte.MAX_VALUE
+            to <code language="java">Byte.MIN_VALUE</code>. The loop will thus
+            continue forever.</para>
+          </answer>
+        </qandaentry>
+      </qandadiv>
+    </qandaset>
+  </section>
+</section>
diff --git a/Doc/Sd1/Appendix/appendix.xml b/Doc/Sd1/Appendix/appendix.xml
index cb9d8e3c6..c7ed5a8fc 100644
--- a/Doc/Sd1/Appendix/appendix.xml
+++ b/Doc/Sd1/Appendix/appendix.xml
@@ -2353,6 +2353,10 @@ Value 2147483645 is not prime.
       </listitem>
     </orderedlist>
 
+    
+    <xi:include href="Exam/2023/Winter/exam.xml" xpointer="element(/1)"
+    		ns:idfixup="auto"/>
+
     <xi:include href="Exam/2023/Summer/exam.xml" xpointer="element(/1)"
                 ns:idfixup="auto"/>
 
diff --git a/Klausuren/Sd1/2023winter/Exam/Readme.md b/Klausuren/Sd1/2023winter/Exam/Readme.md
new file mode 100644
index 000000000..caf9ae0dd
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/Readme.md
@@ -0,0 +1,55 @@
+# Generate and open class/method javadoc for browsing
+
+Grab a terminal in this IDE (By lower left icon or Alt+F12) and issue the following command:
+
+<pre>Exam> mvn javadoc:javadoc
+...
+[<span style="color:blue;font-weight:bold;">INFO</span>] Executing tasks
+[<span style="color:orange;font-weight:bold;">WARNING</span>]     [echo] Javadoc root at <span style="color:blue;">file:///home/.../Downloads/Exam/target/site/apidocs/index.html</span>
+[<span style="color:blue;font-weight:bold;">INFO</span>] Executed tasks
+...</pre>
+
+Click the <span style="color:blue;">file:///.../index.html</span> link opening your project's  `index.html` Javadoc root
+in your system's default web browser.
+
+# Implementation tasks
+
+Your project's following packages do contain implementation tasks:
+
+- `de.hdm_stuttgart.mi.sd1.task1` (50 Points)
+
+- `de.hdm_stuttgart.mi.sd1.task2` (20 points, more difficult)
+
+Read the generated documentation and implement the skeleton methods and classes.
+
+Your project's  `test` branch does contain corresponding unit tests for verifying your solutions' correctness.
+
+# Hints
+
+- Your score solely depends on the number of successfully executing unit tests. A »nearly correct« implementation failing
+with respect to a given unit tests will not contribute any points at all.
+
+- General advice: Implement less but correctly.
+
+- Mind special cases i.e. `null` variable values or null values being contained in arrays.
+
+- In case of test failures both the IDEA debugger and logging statements are your friend.
+
+Executing `de.hdm_stuttgart.mi.sd1.ShowReachedPoints` in your project's test branch as a Java application
+(not as Junit test!) shows your number of points reached so far.
+
+Do not model your implementations along unit test definitions i.e. avoid cheating this way! Such behaviour will be
+regarded as an attempt at deception (Täuschungsversuch).
+
+# Exam system upload
+
+After finishing implementing:
+
+1. Export this project by hitting **»File ➔ Export ➔ Project to Zip File«**.
+1. Use a self-explanatory file name like e.g. `solution1.zip`.
+1. Go to your exam browser window and upload `solution1.zip` .
+1. Complete by  **clicking the »<span style="background: #527A35;color:white;">Speichern + weiter ➞ </span>«** button.
+1. Hit **<span style="background: #446684;color:white;"> 🠬 Speichern + zurück</span>** and check if your
+   upload is visible.
+1. If you advance on implementing: Repeat steps 1. to 5.: Only the least uploaded `.zip` archive will become subject to
+    marking.
diff --git a/Klausuren/Sd1/2023winter/Exam/pom.xml b/Klausuren/Sd1/2023winter/Exam/pom.xml
new file mode 100644
index 000000000..b8ab3bc98
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/pom.xml
@@ -0,0 +1,129 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>de.hdm_stuttgart.mi.sd1</groupId>
+    <artifactId>sd1_2023winter_exam</artifactId>
+    <version>0.9</version>
+    <packaging>jar</packaging>
+
+    <name>sd1_2023winter_exam</name>
+
+    <url>https://freedocs.mi.hdm-stuttgart.de/sd1_sect_mavenCli.html</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.compiler.release>17</maven.compiler.release>
+
+        <freedocs.url>https://freedocs.mi.hdm-stuttgart.de</freedocs.url>
+        <mathjax.url>${freedocs.url}/lib/MathJax/es5/tex-chtml.js</mathjax.url>
+        <libhighlight.url>${freedocs.url}/lib/highlight.js</libhighlight.url>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>hdm-mi-internal-maven-repo</id>
+            <url>https://maven.mi.hdm-stuttgart.de/nexus/repository/mi-maven</url>
+        </repository>
+    </repositories>
+
+    <dependencies>
+        <dependency>
+            <groupId>de.hdm_stuttgart.mi.exam</groupId>
+            <artifactId>unitmarking</artifactId>
+            <version>1.3</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.11.0</version>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <version>3.1.0</version>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                        <configuration>
+                            <target>
+                                <echo>Javadoc root at file://${project.basedir}/target/site/apidocs/index.html</echo>
+                            </target>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+		        <artifactId>maven-javadoc-plugin</artifactId>
+		        <version>3.5.0</version>
+                <configuration>
+                    <release>17</release>
+                    <doclint>all</doclint>
+                    <show>public</show>
+                    <docfilessubdirs>true</docfilessubdirs>
+                    <addStylesheets>
+                        <stylesheet>resources/jdocSupplement.css</stylesheet>
+                    </addStylesheets>
+
+                    <windowtitle>Exam documentation</windowtitle>
+                    <links>
+                        <link>${freedocs.url}/doc/openjdk-21-doc/api/</link>
+                    </links>
+                    <additionalOptions>
+                        <additionalOption>-html5 --allow-script-in-comments</additionalOption>
+                    </additionalOptions>
+                    <nohelp>true</nohelp>
+
+                    <header><![CDATA[
+            <script type="text/javascript" src="${mathjax.url}"></script>
+            <script type="text/javascript" src="{@docRoot}/resources/jdocSupplement.js"></script>
+	    
+            <link rel="stylesheet" href="${libhighlight.url}/styles/idea.min.css">
+            <script src="${libhighlight.url}/highlight.min.js"></script>
+            <script type="text/javascript">hljs.highlightAll();</script>]]>
+                    </header>
+                    <bottom><![CDATA[Copyright © 2023 Stuttgart Media University / MI. Licensed under
+        <a style="font-weight:bold;" href="https://creativecommons.org/licenses/by/4.0/legalcode" target="_blank"
+          >Creative Commons Attribution 4.0 International Public License</a>.]]></bottom>
+	            </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>3.6.0</version>
+                <configuration>
+                    <descriptors>
+                        <descriptor>src/main/assembly/assembly.xml</descriptor>
+                    </descriptors>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <archive>
+                                <manifest>
+                                    <mainClass>de.hdm_stuttgart.mi.sd1.ShowReachedPoints</mainClass>
+                                </manifest>
+                            </archive>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/assembly/assembly.xml b/Klausuren/Sd1/2023winter/Exam/src/main/assembly/assembly.xml
new file mode 100644
index 000000000..85268e296
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/assembly/assembly.xml
@@ -0,0 +1,36 @@
+<assembly
+    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
+    <id>fat-tests</id>
+    <formats>
+        <format>jar</format>
+    </formats>
+    <includeBaseDirectory>false</includeBaseDirectory>
+    <dependencySets>
+        <dependencySet>
+            <outputDirectory/>
+            <useProjectArtifact>true</useProjectArtifact>
+            <unpack>true</unpack>
+            <scope>test</scope>
+        </dependencySet>
+    </dependencySets>
+    <fileSets>
+        <fileSet>
+            <directory>${project.build.directory}/test-classes</directory>
+            <outputDirectory/>
+            <includes>
+                <include>**/*.class</include>
+            </includes>
+            <useDefaultExcludes>true</useDefaultExcludes>
+        </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}/classes</directory>
+            <outputDirectory/>
+            <includes>
+                <include>**/*.class</include>
+            </includes>
+            <useDefaultExcludes>true</useDefaultExcludes>
+        </fileSet>
+    </fileSets>
+</assembly>
\ No newline at end of file
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java
new file mode 100644
index 000000000..24f51ff2d
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java
@@ -0,0 +1,94 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+/**
+ * <p>Valid German traffic light states.</p>
+ */
+public class A_TrafficLight {
+    /**
+     * <p>Traffic light state validation.</p>
+     *
+     * <p>German traffic lights feature three different colours red, yellow and green. Only the following four states
+     * are valid:</p>
+     *
+     * <table style="outline: 2px solid;border-spacing: 10ex 0;">
+     *     <caption style="background: lightgrey;text-align: left;"><em>Valid German traffic light states</em></caption>
+     *     <tr>
+     *         <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;">
+     *           <ul>
+     *             <li style="color:red;"></li>
+     *             <li style="color:black;"></li>
+     *             <li style="color:black;"></li>
+     *           </ul>
+     *         </td>
+     *         <td>Wait</td>
+     *         <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;">
+     *           <ul>
+     *             <li style="color:red;"></li>
+     *             <li style="color:yellow;"></li>
+     *             <li style="color:black;"></li>
+     *           </ul>
+     *         </td>
+     *         <td>Start</td>
+     *         <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;">
+     *           <ul>
+     *             <li style="color:black;"></li>
+     *             <li style="color:black;"></li>
+     *             <li style="color:green;"></li>
+     *           </ul>
+     *         </td>
+     *         <td>Go</td>
+     *         <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;">
+     *           <ul>
+     *             <li style="color:black;"></li>
+     *             <li style="color:yellow;"></li>
+     *             <li style="color:black;"></li>
+     *           </ul>
+     *         </td>
+     *         <td>Stop</td>
+     *     </tr>
+     * </table>
+     *
+     * <p>On contrary <em>any</em> other pattern due to e.g. broken bulbs or other technical failures is invalid:</p>
+     *
+     * <table style="outline: 2px solid;border-spacing: 10ex 0;">
+     *     <caption style="background:lightgrey;text-align:left;">
+     *         <em>Invalid German traffic light state examples</em>
+     *     </caption>
+     *     <tr>
+     *         <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;">
+     *           <ul >
+     *             <li style="color:red;"></li>
+     *             <li style="color:black;"></li>
+     *             <li style="color:green;"></li>
+     *           </ul>
+     *         </td>
+     *         <td>
+     *             <p>Wait or go?</p>
+     *             <p>(Fix my</p>
+     *             <p>control</p>
+     *             <p>unit!)</p>
+     *         </td>
+     *         <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;">
+     *           <ul >
+     *             <li style="color:black;"></li>
+     *             <li style="color:black;"></li>
+     *             <li style="color:black;"></li>
+     *           </ul>
+     *         </td>
+     *         <td>Broken bulb(s)</td>
+     *         <td>...</td>
+     *     </tr>
+     * </table>
+     *
+     * @param red <code>true</code> represents »on«, <code>false</code> represents »off«.
+     * @param yellow <code>true</code> represents »on«, <code>false</code> represents »off«.
+     * @param green <code>true</code> represents »on«, <code>false</code> represents »off«.
+     *
+     * @return <code>true</code> if in a valid state, <code>false</code> otherwise.
+     */
+    static public boolean stateIsValid(boolean red, boolean yellow, boolean green) {
+        return true; //TODO: Implement me!
+    }
+
+    private A_TrafficLight(){/* Ignore me: My sole purpose is suppressing default constructor javadoc generation */}
+}
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java
new file mode 100644
index 000000000..6bd47576d
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java
@@ -0,0 +1,59 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+/**
+ * <p>Doing basic calculations.</p>
+ */
+public class B_Max {
+    /**
+     * <p>Get the largest basic calculation result of two values.</p>
+     *
+     * <p>We have four different basic calculation operations:</p>
+     *
+     * <ul style="list-style:none">
+     *     <li><code style="font-weight: bolder">+</code>: Addition</li>
+     *     <li><code style="font-weight: bolder">-</code>: Subtraction</li>
+     *     <li><code style="font-weight: bolder">*</code>: Multiplication</li>
+     *     <li><code style="font-weight: bolder">/</code>: Division</li>
+     * </ul>
+     *
+     * <p>Given two values like e.g 4 and 0.1 we can construct four different basic calculation terms:</p>
+     *
+     * <ul style="list-style:none">
+     *     <li><code>4 + 0.1 == 4.1</code></li>
+     *     <li><code>4 - 0.1 == 3.9</code></li>
+     *     <li><code>4 * 0.1 == 0.4</code></li>
+     *     <li><code style="background: lightgreen">4 / 0.1 == 40</code></li>
+     * </ul>
+     *
+     * <p>The above example features a maximum result value of 40 resulting from dividing 4 by 0.1 .
+     * Depending on both values the maximum may result from either of our four basic operations. We take a
+     * second set of example values 3 and -1:</p>
+     *
+     * <ul style="list-style:none">
+     *     <li><code>3 + (-1) == 2</code></li>
+     *     <li><code style="background: lightgreen">3 - (-1) == 4</code></li>
+     *     <li><code>3 * (-1) == -3</code></li>
+     *     <li><code>3 / (-1) == -3</code></li>
+     * </ul>
+     *
+     * <p>This time we get a maximum of 4 by subtracting -1 from 3 .</p>
+     *
+     * @param first The first operand
+     * @param second The second operand
+     * @return The largest basic calculation result taking both arguments in their respective order.
+     *
+     * <section class="implementationHints">
+     *     <h4 class="implementationHints">Hints:</h4>
+     *
+     *     <ol>
+     *       <li>Create all four possible arithmetic results</li>
+     *       <li>Then choose the largest among these four values</li>
+     *     </ol>
+     *
+     * </section>
+     */
+    public static double getBasicCalculationMax(final double first, final double second) {
+        return 42.0; //TODO: Implement me!
+    }
+    private B_Max(){/* Ignore me, suppressing implicit default constructor Javadoc HTML generation */}
+}
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java
new file mode 100644
index 000000000..02916a8d2
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java
@@ -0,0 +1,77 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+/**
+ * <p>Handle web addresses.</p>
+ */
+public class C_WebUrl {
+
+    /**
+     * <p>Accessing web sites e.g. <code>www.wikipedia.org</code> requires entering the address in a web browser:</p>
+     *
+     * <img style="outline: 2px solid;"
+     *     src="doc-files/weburlBlank.png" alt="A web address without protocol specification" >
+     *
+     * <p>Entering <code>www.wikipedia.org</code> fulfills its purpose. However behind the scenes either a
+     * <code>http://</code> or <code>https://</code> protocol specification is being silently prepended:</p>
+     *
+     * <img style="outline: 2px solid;"
+     *     src="doc-files/weburlProtocol.png" alt="A web address including a protocol specification">
+     *
+     * <p>The current method adds a missing protocol specification according to the following rules:</p>
+     *
+     * <ul>
+     *     <li>An address already starting with either <code>http://</code> or <code>https://</code> is just being
+     *      copied.</li>
+     *
+     *     <li>
+     *        <p>An address not starting with either <code>http://</code> or <code>https://</code> receives a
+     *             protocol prefix according to the <code>tlsSupport</code> parameter.</p>
+     *     </li>
+     *  </ul>
+     *  <p>Some examples:</p>
+     *  <table class="goikTableDefaults">
+     *     <caption>Optional protocol prefix examples for <code>www.wikipedia.org</code></caption>
+     *     <tr>
+     *         <th><code>address</code></th>
+     *         <th><code>tlsSupport</code></th>
+     *         <th>Return value</th>
+     *     </tr>
+     *     <tr>
+     *         <td style="color:blue"><code>www.wikipedia.org</code></td>
+     *         <td><code style="color:red">true</code></td>
+     *         <td><code style="color:red">https</code>://<code style="color:blue">www.wikipedia.org</code></td>
+     *     </tr>
+     *     <tr>
+     *         <td style="color:blue"><code>www.wikipedia.org</code></td>
+     *         <td><code style="color:red">false</code></td>
+     *         <td><code style="color:red">http</code>://<code style="color:blue">www.wikipedia.org</code></td>
+     *     </tr>
+     *     <tr>
+     *         <td style="color:blue"><code>http://www.wikipedia.org</code></td>
+     *         <td>Protocol specification <code>http://</code> present, value irrelevant</td>
+     *         <td style="color:blue"><code>http://www.wikipedia.org</code></td>
+     *     </tr>
+     *     <tr>
+     *         <td style="color:blue"><code>https://www.wikipedia.org</code></td>
+     *         <td>Protocol specification <code>https://</code> present, value irrelevant</td>
+     *         <td style="color:blue"><code>https://www.wikipedia.org</code></td>
+     *     </tr>
+     * </table>
+     *
+     * @param address A website's address. May either be a raw name or a full http/https prefixed protocol address.
+     * @param tlsSupport If <code>true</code> the server supports
+     *                   <code><span style="color:red">https</span>://...</code> connections. Otherwise, only
+     *                   <code><span style="color:red">http</span>://...</code> is being supported.
+     *
+     * @return A fully <code>http://</code> or <code>https://</code> prefixed protocol address.
+     *
+     * <section class="implementationHints">
+     *     <h4 class="implementationHints">Hint:</h4>
+     *     
+     *     <p>{@link String#startsWith(String)}</p>
+     * </section>
+     */
+    public static String amendWebAddress(final String address, final boolean tlsSupport) {
+        return "Not yet implemented!"; //TODO: Implement me!
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java
new file mode 100644
index 000000000..752b2f02b
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java
@@ -0,0 +1,67 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+/**
+ * Array helper method.
+ */
+public class D_Array {
+
+    /**
+     * The special value -1 indicating two arrays are not being related by any sequence of right cyclic rotations.
+     * Example: {1, 2} and {1, 3}.
+     */
+    static public final int NOT_CYCLICALLY_RELATED = -1 ;
+
+    /**
+     * <p>Part 2: Check two arrays for being related by an integer number of successive right cyclic rotations or not.</p>
+     *
+     * <p>Consider a right cyclic array rotating example:</p>
+     *
+     * <pre>
+     *      <span style="color:red">⬐─────┐</span>
+     *     {1, 7, <span style="color:blue">3</span>} ⇨ {<span style="color:blue">3</span>, 1, 7}
+     *       <span style="color:red">⤻  ⤻</span>
+     * </pre>
+     *
+     * <p>The arrays <code>{1, 7, 3}</code> and <code>{3, 1, 7}</code> are thus being related by one right
+     * cyclic rotation.</p>
+     *
+     * <p>Arrays may also be related by a succession of multiple right cyclic rotations. Example:</p>
+     *
+     * <p><code>{1, 8, 3, 4}</code> and <code>{3, 4, 1, 8}</code> are being related by a sequence of two right cyclic
+     * rotations:</p>
+     *
+     * <pre>
+     * <span style="color:red">     ⬐────────┐    ⬐────────┐</span>
+     *     {1, 8, 3, <span style="color:blue">4</span>} ⇨ {<span style="color:blue">4</span>, 1, 8, <span
+     *     style="color:orange">3</span>} ⇨ {<span style="color:orange">3</span>, <span style="color:blue">4</span>, 1, 8}
+     * <span style="color:red">      ⤻  ⤻ ⤻       ⤻  ⤻ ⤻</span>
+     * </pre>
+     *
+     * <p>In this case a value of 2 rotations is being returned.</p>
+     *
+     * <h4>Special cases: </h4>
+     *
+     * <ul>
+     *     <li>Two identical arrays are being related by zero rotations.</li>
+     *     <li>Two arrays of different size are always unrelated / {@link #NOT_CYCLICALLY_RELATED} .</li>
+     * </ul>
+     *
+     * @param array1 The first array. Values must remain untouched.
+     * @param array2 The second array. Values must remain untouched.
+     *
+     * @return Either the number of right cyclic rotations or the special value {@link #NOT_CYCLICALLY_RELATED} if both
+     * arrays are not being related by a sequence of cyclic rotations.
+     *
+     * <section class="implementationHints">
+     *     <h4 class="implementationHints">Hints:</h4>
+     *
+     *     <p>You likely need two nested loops: One representing all possible array shift values. A second one
+     *     comparing all index positions with respect to the given shift value.</p>
+     *
+     * </section>
+     */
+    static public int isRotatedBy(final int[] array1, int[] array2) {
+        return 42; //TODO: Implement me!
+    }
+    private D_Array(){/* Ignore me, suppressing implicit default constructor Javadoc HTML generation */}
+}
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java
new file mode 100644
index 000000000..6152c2c29
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java
@@ -0,0 +1,22 @@
+/**
+ * <p>Classes here mostly (if not completely) contain static methods to be implemented.</p>
+ *
+ * <p>The ordering being implied by (test) class names and related methods reflect the author's opinion about ascending
+ * implementation difficulty. You are free to proceed differently. Hints:</p>
+ *
+ * <ul>
+ *     <li>Run <code>mvn javadoc:javadoc</code> and open the generated
+ *     <code>&lt;projectroot&gt;/target/site/apidocs/index.html</code> file in your browser of choice.</li>
+ *
+ *     <li>Read the generated documentation thoroughly. Make sure you do understand the intended method behaviour prior
+ *     to implementing.</li>
+ *
+ *     <li>Use the corresponding unit tests from your project's »test« branch checking your implementation's
+ *     correctness. Executing <code>de.hdm_stuttgart.mi.sd1.ShowReachedPoints</code> reveals your number
+ *     of examination points reached so far.</li>
+ *
+ *     <li>The debugger is your friend</li>
+ * </ul>
+ *
+ */
+package de.hdm_stuttgart.mi.sd1.task1;
\ No newline at end of file
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java
new file mode 100644
index 000000000..999e98a8c
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java
@@ -0,0 +1,47 @@
+package de.hdm_stuttgart.mi.sd1.task2;
+
+// You probably don't want to edit this auxiliary class. Start with
+
+/** <p>The 8 main wind directions.</p>
+ *
+ * <p>You probably don't want to edit this auxiliary class. Start working on class {@link WindForecast} </p>
+ *
+ */
+public enum Direction {
+    /**
+     * North
+     */
+    N,
+    /**
+     * Northeast
+     */
+    NE,
+    /**
+     * East
+     */
+    E,
+
+    /**
+     * Southeast
+     */
+    SE,
+
+    /**
+     * South
+     */
+    S,
+
+    /**
+     * Southwest
+     */
+    SW,
+
+    /**
+     * West
+     */
+    W,
+    /**
+     * Northwest
+     */
+    NW
+}
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java
new file mode 100644
index 000000000..97dfecfe1
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java
@@ -0,0 +1,37 @@
+package de.hdm_stuttgart.mi.sd1.task2;
+
+/**
+ * <p>Check for matching wind conditions.</p>
+ *
+ * <p>Many water sport addicts depend on suitable wind conditions being described by wind speed and
+ * optionally wind direction.</p>
+ *
+ * <p>We start an example forecasting <span style="color:green">40</span> Km Wind speed from north using
+ * enum {@link Direction}:</p>
+ *
+ * <pre style="background-color: lightgray"><code class="nohighlight"> final WindForecast forecast = new WindForecast(<span style="color:green">40</span>, Direction.N);</code></pre>
+ *
+ * <p>A kitesurfer wants to get notified if the wind forecast at his or her spot predicts
+ * wind ranging from <span style="color:blue">30</span> Km/h to <span style="color:red">50</span> Km/h in speed coming
+ * either from northern ({@link Direction#N}) or northwestern ({@link Direction#NW}) directions.</p>
+ *
+ * <p>The <code>matchingConditions(...)</code> method in the following code snippet expects minimum and maximum desired
+ * wind speed and a (possibly empty) list of desired wind directions. One of our surfer's desired directions being
+ * {@link Direction#N} and the forcast of <span style="color:green">40</span> Km/h being within the desired <span style="color:blue">30</span> Km/h to
+ * <span style="color:red">50</span> Km/h range calling <code>matchingConditions(...)</code> will thus return
+ * <code>true</code>:</p>
+ *
+ * <pre  style="background-color: lightgray"><code class="nohighlight"> final WindForecast forecast = new WindForecast(<span style="color:green">40</span>, Direction.N);
+ *
+ * if (forecast.matchingConditions(<span style="color:blue">30</span>, <span style="color:red">50</span>, new Direction[]{Direction.N, Direction.NW})) {
+ *    System.out.println("Yeah, let's go for it! \uD83D\uDE0E");
+ * else {
+ *    System.out.println("I hate waiting for the wind! \uD83E\uDD2C");
+ * }</code></pre>
+ *
+ * <p>Complete the implementation of {@link WindForecast} allowing to run code like above using the
+ * pre-defined enum {@link Direction}.</p>
+ */
+public class WindForecast {
+    //TODO: Implement me!
+}
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java
new file mode 100644
index 000000000..b12e6627a
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java
@@ -0,0 +1,18 @@
+/**
+ * <p>This package hosts more advanced implementation tasks.</p>
+ *
+ * <ul>
+ *     <li>Run <code>mvn javadoc:javadoc</code> and open the generated
+ *     <code>&lt;projectroot&gt;/target/site/apidocs/index.html</code> file in your browser of choice.</li>
+ *
+ *     <li>Read the generated documentation thoroughly. Make sure you do understand the intended method behaviour prior
+ *     to implementing.</li>
+ *
+ *     <li>Use the corresponding unit tests from your project's »test« branch checking your implementation's
+ *     correctness. Executing <code>de.hdm_stuttgart.mi.sd1.ShowReachedPoints</code> reveals your number
+ *     of examination points reached so far.</li>
+ *
+ *     <li>The debugger is your friend</li>
+ * </ul>
+ */
+package de.hdm_stuttgart.mi.sd1.task2;
\ No newline at end of file
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlBlank.png b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlBlank.png
new file mode 100644
index 0000000000000000000000000000000000000000..01376dac6c420ef680afbbb82f147dfa569b0766
GIT binary patch
literal 13604
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
Ynz`xU#kc<i-*bXUeUulg5HSq=FK2LcivR!s

literal 0
HcmV?d00001

diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlProtocol.png b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlProtocol.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9c648b8d28812201ab15b272b7e953c7c0fb642
GIT binary patch
literal 10900
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

literal 0
HcmV?d00001

diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/fonts/dejavu.css b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/fonts/dejavu.css
new file mode 100644
index 000000000..4fec2b593
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/fonts/dejavu.css
@@ -0,0 +1,3 @@
+/* shame on you, javadoc! Still providing
+@import url('resources/fonts/dejavu.css') line in stylesheet.css
+*/
\ No newline at end of file
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.css b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.css
new file mode 100644
index 000000000..08840cdbf
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.css
@@ -0,0 +1,72 @@
+/* Javadoc extensions: */
+
+ul > li > ul {
+    list-style-type: circle;
+}
+
+table.goikTableDefaults,
+table.goikTableDefaults>caption,
+table.goikTableDefaults>tr>th,
+table.goikTableDefaults>tr>td,
+table.goikTableDefaults>tbody>tr>th,
+table.goikTableDefaults>tbody>tr>td {
+    border: 2px solid black;
+    border-collapse: collapse;
+    padding: 1ex;
+    vertical-align: top;
+}
+
+table.goikTableDefaults>caption {
+    /* border-top-style: solid; border-left-style: solid; border-right-style: solid' */
+    border-bottom-style: none;
+    font-weight: bold;
+    background:#dee3e9;
+    text-align:left;
+    padding:8px 3px 3px 7px;
+}
+
+table.goikTableDefaults>tbody>tr>td {
+    vertical-align:top;
+}
+table.goikTableDefaults {
+    border-spacing: 0px !important;
+}
+
+table.indexTable {
+    border-collapse: collapse;
+    border-style: hidden;
+}
+
+table.indexTable caption {
+    text-align: left;
+}
+
+table.indexTable td, table.indexTable th {
+    border: 1px solid black;
+    padding: 0.5ex;
+}
+
+em {
+    font-weight: bold;
+    font-style: normal;
+}
+section.implementationHints>h3 {
+    font-weight: bold;
+    background-color: rgb(222, 227, 233);
+}
+
+code {
+    white-space: pre;
+}
+
+.implementationHints {
+    background-color: hsl(120, 100%, 95%) !important;
+}
+
+.myRed {
+    color: red;
+}
+
+.myGreen {
+    color: limegreen;
+}
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.js b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.js
new file mode 100644
index 000000000..97911e558
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/javadoc/resources/jdocSupplement.js
@@ -0,0 +1,7 @@
+for(var i in document.links) {
+   var link = document.links[i];
+   if (link.href && link.href.indexOf('http') === 0) { 
+       link.target = '_blank';
+   }
+}
+
diff --git a/Klausuren/Sd1/2023winter/Exam/src/main/resources/log4j2.xml b/Klausuren/Sd1/2023winter/Exam/src/main/resources/log4j2.xml
new file mode 100644
index 000000000..130f87a14
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/main/resources/log4j2.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <File name="A1" fileName="A1.log" append="false">
+            <PatternLayout pattern="%t %-5p %c{2} - %m%n"/>
+        </File>
+        <Console name="STDOUT" target="SYSTEM_OUT">
+            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+
+        <!-- You my want to define class or package level per-logger rules -->
+        <Logger name="de.hdm_stuttgart.mi.sd1.App" level="debug">
+            <AppenderRef ref="A1"/>
+        </Logger>
+        <Root level="info">
+            <AppenderRef ref="STDOUT"/>
+        </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java
new file mode 100644
index 000000000..651f0a5cd
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java
@@ -0,0 +1,26 @@
+package de.hdm_stuttgart.mi.sd1;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.RunTests;
+
+import de.hdm_stuttgart.mi.sd1.task1.A_TrafficLightTest;
+import de.hdm_stuttgart.mi.sd1.task1.B_MaxTest;
+import de.hdm_stuttgart.mi.sd1.task1.C_WebUrlTest;
+import de.hdm_stuttgart.mi.sd1.task1.D_ArrayTest;
+
+import de.hdm_stuttgart.mi.sd1.task2.WindForecastTest;
+
+public class ShowReachedPoints {
+
+  /**
+   * Revealing total number of reached points from all tasks.
+   *
+   * @param args Unused
+   */
+  public static void main(String[] args) {
+    RunTests.exec(
+      "Task 1",
+            A_TrafficLightTest.class, B_MaxTest.class, C_WebUrlTest.class, D_ArrayTest.class
+      );
+    RunTests.exec("Task 2", WindForecastTest.class);
+  }
+}
diff --git a/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java
new file mode 100644
index 000000000..3e3960d04
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java
@@ -0,0 +1,28 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+import static de.hdm_stuttgart.mi.sd1.task1.A_TrafficLight.stateIsValid;
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class A_TrafficLightTest extends ExaminationTestDefaults {
+
+    @Test
+    @Marking(points = 18)
+    public void test_100() {
+        Assert.assertFalse( stateIsValid(false, false, false));
+        Assert.assertTrue( stateIsValid(false, false, true));
+        Assert.assertTrue( stateIsValid(false, true, false));
+        Assert.assertFalse( stateIsValid(false, true, true));
+        Assert.assertTrue( stateIsValid(true, false, false));
+        Assert.assertFalse( stateIsValid(true, false, true));
+        Assert.assertTrue( stateIsValid(true, true, false));
+        Assert.assertFalse( stateIsValid(true, true, true));
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java
new file mode 100644
index 000000000..d1e177907
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java
@@ -0,0 +1,37 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class B_MaxTest extends ExaminationTestDefaults {
+    static final public double PRECISION = 1.E-12;
+
+    @Test
+    @Marking(points = 15)
+    public void test() {
+        assertMaximum(12, 4, 3, '*');
+        assertMaximum(5, 2, -3, '-');
+        assertMaximum(5.1, 0.1, 5, '+');
+        assertMaximum(35, 7, 0.2, '/');
+        assertMaximum(-1.4,-7, 0.2, '*');
+        assertMaximum(4,2, 2, '+');
+    }
+
+    private static void assertMaximum(final double expected, final double first, final double second, char operation) {
+
+        final StringBuilder errMsg = new StringBuilder("Expected maximum is " + expected + " == " + first + " " +
+                operation + " ");
+
+        if (second < 0) {
+            errMsg.append("(" + second + ")");
+        } else {
+            errMsg.append(second);
+        }
+        Assert.assertEquals(errMsg.toString(), expected, B_Max.getBasicCalculationMax(first, second), PRECISION);
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java
new file mode 100644
index 000000000..4df40473b
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java
@@ -0,0 +1,66 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class C_WebUrlTest extends ExaminationTestDefaults {
+
+    static private final String dnsNames[] = {
+            "www.der-postillon.com", "www.duh.de", "www.amnesty.org"
+    };
+
+
+    @Test
+    @Marking(points = 14)
+    public void test() {
+
+        for(final String dns: dnsNames) {
+            final String
+                    httpUrl = "http://" + dns,
+                    httpsUrl = "https://" + dns,
+
+                    actualByHttpsTlsTrue = C_WebUrl.amendWebAddress(httpsUrl, true),
+                    actualByHttpsTlsFalse = C_WebUrl.amendWebAddress(httpsUrl, false),
+
+                    actualByHttpTlsTrue = C_WebUrl.amendWebAddress(httpUrl, true),
+                    actualByHttpTlsFalse = C_WebUrl.amendWebAddress(httpUrl, false),
+
+                    actualByDnsTlsTrue = C_WebUrl.amendWebAddress(dns, true),
+                    actualByDnsTlsFalse = C_WebUrl.amendWebAddress(dns, false);
+
+            Assert.assertEquals(
+                    "Passing '" + httpsUrl + "' should return '" + httpsUrl + "' rather than '" + actualByHttpsTlsTrue + "'",
+                    httpsUrl, actualByHttpsTlsTrue);
+
+            Assert.assertEquals(
+                    "Passing '" + httpsUrl + "' should return '" + httpsUrl + "' rather than '" + actualByHttpsTlsFalse + "'",
+                    httpsUrl, actualByHttpsTlsFalse);
+
+            Assert.assertEquals(
+                    "Passing '" + httpUrl + "' should return '" + httpUrl + "' rather than '" + actualByHttpTlsTrue + "'",
+                    httpUrl, actualByHttpTlsTrue);
+
+            Assert.assertEquals(
+                    "Passing '" + httpUrl + "' should return '" + httpUrl + "' rather than '" + actualByHttpTlsFalse + "'",
+                    httpUrl, actualByHttpTlsFalse);
+
+
+            Assert.assertEquals(
+                    "Passing '" + dns + "' when tlsSupport is 'true' should return '"  + httpsUrl + "' rather than " + actualByDnsTlsTrue,
+                    httpsUrl, actualByDnsTlsTrue);
+
+            Assert.assertEquals(
+                    "Passing '" + dns + "' when tlsSupport is 'false' should return '"  + httpUrl + "' rather than " + actualByDnsTlsFalse,
+                    httpUrl, actualByDnsTlsFalse);
+
+        }
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java
new file mode 100644
index 000000000..24b763ada
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java
@@ -0,0 +1,118 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+import java.util.Arrays;
+
+import static de.hdm_stuttgart.mi.sd1.task1.D_Array.NOT_CYCLICALLY_RELATED;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class D_ArrayTest extends ExaminationTestDefaults {
+
+    private static void assertRelatedByRotation(final int expectedRotation, final int[] array1, int[] array2) {
+
+        final int[] array1Copy = Arrays.copyOf(array1, array1.length),
+                array2Copy = Arrays.copyOf(array2, array2.length);
+
+        final String errorMessage;
+        if (NOT_CYCLICALLY_RELATED == expectedRotation) {
+            errorMessage = Arrays.toString(array1) + " and " + Arrays.toString(array2) +
+                    " are not being cyclically related.";
+        } else {
+            errorMessage = Arrays.toString(array1) + " and " + Arrays.toString(array2) +
+                    " are being cyclically related by " + expectedRotation + " right rotation(s).";
+        }
+        Assert.assertEquals(errorMessage, expectedRotation, D_Array.isRotatedBy(array1, array2));
+
+        Assert.assertArrayEquals("You must not change values in array1 parameter", array1Copy, array1);
+        Assert.assertArrayEquals("You must not change values in array2 parameter", array2Copy, array2);
+    }
+
+    @Test
+    public void test010_Minimum() {
+        assertRelatedByRotation(0, new int[]{}, new int[]{});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{}, new int[]{1});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{3}, new int[]{});
+    }
+    @Test
+    public void test020One() {
+        assertRelatedByRotation(0,  new int[]{77}, new int[]{77});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{8}, new int[]{77});
+    }
+
+    @Test
+    @Marking(points = 2)
+    public void test030Two() {
+        assertRelatedByRotation(0,  new int[]{-1, 5}, new int[]{-1, 5});
+        assertRelatedByRotation(1,  new int[]{-1, 5}, new int[]{5, -1});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{-1, 5}, new int[]{-5, 1});
+    }
+    @Test
+    @Marking(points = 2)
+    public void test040Three() {
+        assertRelatedByRotation( 0,  new int[]{2, -6, 9}, new int[]{ 2, -6,  9});
+        assertRelatedByRotation( 1,  new int[]{2, -6, 9}, new int[]{ 9,  2, -6});
+        assertRelatedByRotation( 2,  new int[]{2, -6, 9}, new int[]{-6,  9,  2});
+
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{2, -6, 9}, new int[]{ 2,  9, -6});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{2, -6, 9}, new int[]{-6,  2,  9});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{2, -6, 9}, new int[]{-6,  2});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{-1, 2, 4}, new int[]{-1, 2, 5});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{-1, 2, 4}, new int[]{-2, 2, 4});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{-1, 2, 4}, new int[]{-1, 3, 4});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{-1, 2, 4}, new int[]{-1, 3, 4, 3});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{-1, 2, 4, 1}, new int[]{-1, 3, 4});
+    }
+    @Test
+    @Marking(points = 2)
+    public void test050Twenty() {
+        assertRelatedByRotation( 0,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
+
+        assertRelatedByRotation( 1,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{10, 1, 2, 3, 4, 5, 6, 7, 8, 9});
+
+        assertRelatedByRotation( 2,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{9, 10, 1, 2, 3, 4, 5, 6, 7, 8});
+
+        assertRelatedByRotation( 3,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{8, 9, 10, 1, 2, 3, 4, 5, 6, 7});
+
+        assertRelatedByRotation( 4,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{7, 8, 9, 10, 1, 2, 3, 4, 5, 6});
+
+        assertRelatedByRotation( 5,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{6, 7, 8, 9, 10, 1, 2, 3, 4, 5});
+
+        assertRelatedByRotation( 6,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{5, 6, 7, 8, 9, 10, 1, 2, 3, 4});
+
+        assertRelatedByRotation( 7,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{4, 5, 6, 7, 8, 9, 10, 1, 2, 3});
+
+        assertRelatedByRotation( 8,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{3, 4, 5, 6, 7, 8, 9, 10, 1, 2});
+
+        assertRelatedByRotation( 9,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{2, 3, 4, 5, 6, 7, 8, 9, 10, 1});
+
+        assertRelatedByRotation( NOT_CYCLICALLY_RELATED,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                                 */     new int[]{1, 2, 3, 4, 6, 5, 7, 8, 9, 10});
+
+        assertRelatedByRotation( NOT_CYCLICALLY_RELATED,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                                 */     new int[]{1, 2, 3, 4, 6, 5, 7, 8, 9});
+
+        assertRelatedByRotation( NOT_CYCLICALLY_RELATED,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9},
+                /*                                 */     new int[]{1, 2, 3, 4, 6, 5, 7, 8, 9, 10});
+
+        assertRelatedByRotation( NOT_CYCLICALLY_RELATED,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                                 */     new int[]{});
+
+
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java
new file mode 100644
index 000000000..00f5f04be
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Exam/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java
@@ -0,0 +1,56 @@
+package de.hdm_stuttgart.mi.sd1.task2;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+import de.hdm_stuttgart.mi.exam.unitmarking.reflect.ObjectWrapper;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+import static de.hdm_stuttgart.mi.sd1.task2.Direction.*;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+
+public class WindForecastTest extends ExaminationTestDefaults {
+
+    final ObjectWrapper<WindForecast> forecast_30_S =
+            new ObjectWrapper<>(WindForecast.class, 30, S);
+
+    @Test
+    @Marking(points = 10)
+    public void test_100_noDirection() {
+
+        Assert.assertTrue("Forecast speed 30 being within [30, 40] expects true",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 30, 40, new Direction[]{}));
+
+        Assert.assertTrue("Forecast speed 30 being within [10, 40] expects true",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 10, 40, new Direction[]{}));
+
+        Assert.assertTrue("Forecast speed 30 being within [20, 30] expects true",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 20, 30, new Direction[]{}));
+
+        Assert.assertFalse("Forecast speed 30 outside [31, 40] expects false",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 31, 40, new Direction[]{}));
+
+        Assert.assertFalse("Forecast speed 30 outside [20, 29] expects false",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 20, 29, new Direction[]{}));
+    }
+
+    @Test
+    @Marking(points = 5)
+    public void test_200_Direction() {
+
+        Assert.assertTrue("Forecast speed 30 being within [30, 40] and direction containing S expects true",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 30, 40,
+                        new Direction[]{SE, SW, S}));
+
+        Assert.assertFalse("Forecast speed 30 not within [31, 40] expects false",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 31, 40,
+                        new Direction[]{SE, SW, S}));
+
+        Assert.assertFalse("Forecast speed 30 being within [30, 40] but direction not containing S expects false",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 30, 40,
+                        new Direction[]{N,NE,E,W,NW}));
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/Readme.md b/Klausuren/Sd1/2023winter/Solve/Readme.md
new file mode 100644
index 000000000..caf9ae0dd
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/Readme.md
@@ -0,0 +1,55 @@
+# Generate and open class/method javadoc for browsing
+
+Grab a terminal in this IDE (By lower left icon or Alt+F12) and issue the following command:
+
+<pre>Exam> mvn javadoc:javadoc
+...
+[<span style="color:blue;font-weight:bold;">INFO</span>] Executing tasks
+[<span style="color:orange;font-weight:bold;">WARNING</span>]     [echo] Javadoc root at <span style="color:blue;">file:///home/.../Downloads/Exam/target/site/apidocs/index.html</span>
+[<span style="color:blue;font-weight:bold;">INFO</span>] Executed tasks
+...</pre>
+
+Click the <span style="color:blue;">file:///.../index.html</span> link opening your project's  `index.html` Javadoc root
+in your system's default web browser.
+
+# Implementation tasks
+
+Your project's following packages do contain implementation tasks:
+
+- `de.hdm_stuttgart.mi.sd1.task1` (50 Points)
+
+- `de.hdm_stuttgart.mi.sd1.task2` (20 points, more difficult)
+
+Read the generated documentation and implement the skeleton methods and classes.
+
+Your project's  `test` branch does contain corresponding unit tests for verifying your solutions' correctness.
+
+# Hints
+
+- Your score solely depends on the number of successfully executing unit tests. A »nearly correct« implementation failing
+with respect to a given unit tests will not contribute any points at all.
+
+- General advice: Implement less but correctly.
+
+- Mind special cases i.e. `null` variable values or null values being contained in arrays.
+
+- In case of test failures both the IDEA debugger and logging statements are your friend.
+
+Executing `de.hdm_stuttgart.mi.sd1.ShowReachedPoints` in your project's test branch as a Java application
+(not as Junit test!) shows your number of points reached so far.
+
+Do not model your implementations along unit test definitions i.e. avoid cheating this way! Such behaviour will be
+regarded as an attempt at deception (Täuschungsversuch).
+
+# Exam system upload
+
+After finishing implementing:
+
+1. Export this project by hitting **»File ➔ Export ➔ Project to Zip File«**.
+1. Use a self-explanatory file name like e.g. `solution1.zip`.
+1. Go to your exam browser window and upload `solution1.zip` .
+1. Complete by  **clicking the »<span style="background: #527A35;color:white;">Speichern + weiter ➞ </span>«** button.
+1. Hit **<span style="background: #446684;color:white;"> 🠬 Speichern + zurück</span>** and check if your
+   upload is visible.
+1. If you advance on implementing: Repeat steps 1. to 5.: Only the least uploaded `.zip` archive will become subject to
+    marking.
diff --git a/Klausuren/Sd1/2023winter/Solve/pom.xml b/Klausuren/Sd1/2023winter/Solve/pom.xml
new file mode 100644
index 000000000..d22d8efbc
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/pom.xml
@@ -0,0 +1,129 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>de.hdm_stuttgart.mi.sd1</groupId>
+    <artifactId>sd1_2023winter_solve</artifactId>
+    <version>0.9</version>
+    <packaging>jar</packaging>
+
+    <name>sd1_2023winter</name>
+
+    <url>https://freedocs.mi.hdm-stuttgart.de/sd1_sect_mavenCli.html</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.compiler.release>17</maven.compiler.release>
+
+        <freedocs.url>https://freedocs.mi.hdm-stuttgart.de</freedocs.url>
+        <mathjax.url>${freedocs.url}/lib/MathJax/es5/tex-chtml.js</mathjax.url>
+        <libhighlight.url>${freedocs.url}/lib/highlight.js</libhighlight.url>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>hdm-mi-internal-maven-repo</id>
+            <url>https://maven.mi.hdm-stuttgart.de/nexus/repository/mi-maven</url>
+        </repository>
+    </repositories>
+
+    <dependencies>
+        <dependency>
+            <groupId>de.hdm_stuttgart.mi.exam</groupId>
+            <artifactId>unitmarking</artifactId>
+            <version>1.3</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.11.0</version>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <version>3.1.0</version>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                        <configuration>
+                            <target>
+                                <echo>Javadoc root at file://${project.basedir}/target/site/apidocs/index.html</echo>
+                            </target>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+		        <artifactId>maven-javadoc-plugin</artifactId>
+		        <version>3.5.0</version>
+                <configuration>
+                    <release>17</release>
+                    <doclint>all</doclint>
+                    <show>public</show>
+                    <docfilessubdirs>true</docfilessubdirs>
+                    <addStylesheets>
+                        <stylesheet>resources/jdocSupplement.css</stylesheet>
+                    </addStylesheets>
+
+                    <windowtitle>Exam documentation</windowtitle>
+                    <links>
+                        <link>${freedocs.url}/doc/openjdk-21-doc/api/</link>
+                    </links>
+                    <additionalOptions>
+                        <additionalOption>-html5 --allow-script-in-comments</additionalOption>
+                    </additionalOptions>
+                    <nohelp>true</nohelp>
+
+                    <header><![CDATA[
+            <script type="text/javascript" src="${mathjax.url}"></script>
+            <script type="text/javascript" src="{@docRoot}/resources/jdocSupplement.js"></script>
+	    
+            <link rel="stylesheet" href="${libhighlight.url}/styles/idea.min.css">
+            <script src="${libhighlight.url}/highlight.min.js"></script>
+            <script type="text/javascript">hljs.highlightAll();</script>]]>
+                    </header>
+                    <bottom><![CDATA[Copyright © 2023 Stuttgart Media University / MI. Licensed under
+        <a style="font-weight:bold;" href="https://creativecommons.org/licenses/by/4.0/legalcode" target="_blank"
+          >Creative Commons Attribution 4.0 International Public License</a>.]]></bottom>
+	            </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>3.6.0</version>
+                <configuration>
+                    <descriptors>
+                        <descriptor>src/main/assembly/assembly.xml</descriptor>
+                    </descriptors>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <archive>
+                                <manifest>
+                                    <mainClass>de.hdm_stuttgart.mi.sd1.ShowReachedPoints</mainClass>
+                                </manifest>
+                            </archive>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/assembly/assembly.xml b/Klausuren/Sd1/2023winter/Solve/src/main/assembly/assembly.xml
new file mode 100644
index 000000000..85268e296
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/assembly/assembly.xml
@@ -0,0 +1,36 @@
+<assembly
+    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
+    <id>fat-tests</id>
+    <formats>
+        <format>jar</format>
+    </formats>
+    <includeBaseDirectory>false</includeBaseDirectory>
+    <dependencySets>
+        <dependencySet>
+            <outputDirectory/>
+            <useProjectArtifact>true</useProjectArtifact>
+            <unpack>true</unpack>
+            <scope>test</scope>
+        </dependencySet>
+    </dependencySets>
+    <fileSets>
+        <fileSet>
+            <directory>${project.build.directory}/test-classes</directory>
+            <outputDirectory/>
+            <includes>
+                <include>**/*.class</include>
+            </includes>
+            <useDefaultExcludes>true</useDefaultExcludes>
+        </fileSet>
+        <fileSet>
+            <directory>${project.build.directory}/classes</directory>
+            <outputDirectory/>
+            <includes>
+                <include>**/*.class</include>
+            </includes>
+            <useDefaultExcludes>true</useDefaultExcludes>
+        </fileSet>
+    </fileSets>
+</assembly>
\ No newline at end of file
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/Error.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/Error.java
new file mode 100644
index 000000000..608afde27
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/Error.java
@@ -0,0 +1,19 @@
+package de.hdm_stuttgart.mi.sd1.ignore_me;
+
+public class Error {
+    /**
+     * Summing up an int array's values
+     *
+     * @param values An array of int values
+     * @return The sum of all array values
+     */
+//    public static int sum(int[] values) {
+//
+//        int sum;
+//
+//        for (i = 0; i <= values.length; i++) {
+//            sum += values[i];
+//        }
+//        return sum;
+//    }
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/WindSearch.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/WindSearch.java
new file mode 100644
index 000000000..fff07aa2d
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/ignore_me/WindSearch.java
@@ -0,0 +1,26 @@
+package de.hdm_stuttgart.mi.sd1.ignore_me;
+
+import de.hdm_stuttgart.mi.sd1.task2.Direction;
+import de.hdm_stuttgart.mi.sd1.task2.WindForecast;
+
+/**
+ * Sample code
+ */
+public class WindSearch {
+
+    /**
+     * Main entry point
+     *
+     * @param args not used
+     */
+    public static void main(String[] args) {
+
+        final WindForecast forcast = new WindForecast(40, Direction.N);
+
+        if (forcast.matchingConditions(30, 50, new Direction[]{Direction.N, Direction.NW})) {
+            System.out.println("Yeah, let's go for it! \uD83D\uDE0E");
+        } else {
+            System.out.println("I hate waiting for the wind! \uD83E\uDD2C");
+        }
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java
new file mode 100644
index 000000000..bf35b2a8d
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLight.java
@@ -0,0 +1,97 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+/**
+ * <p>Valid German traffic light states.</p>
+ */
+public class A_TrafficLight {
+    /**
+     * <p>Traffic light state validation.</p>
+     *
+     * <p>German traffic lights feature three different colours red, yellow and green. Only the following four states
+     * are valid:</p>
+     *
+     * <table style="outline: 2px solid;border-spacing: 10ex 0;">
+     *     <caption style="background: lightgrey;text-align: left;"><em>Valid German traffic light states</em></caption>
+     *     <tr>
+     *         <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;">
+     *           <ul>
+     *             <li style="color:red;"></li>
+     *             <li style="color:black;"></li>
+     *             <li style="color:black;"></li>
+     *           </ul>
+     *         </td>
+     *         <td>Wait</td>
+     *         <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;">
+     *           <ul>
+     *             <li style="color:red;"></li>
+     *             <li style="color:yellow;"></li>
+     *             <li style="color:black;"></li>
+     *           </ul>
+     *         </td>
+     *         <td>Start</td>
+     *         <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;">
+     *           <ul>
+     *             <li style="color:black;"></li>
+     *             <li style="color:black;"></li>
+     *             <li style="color:green;"></li>
+     *           </ul>
+     *         </td>
+     *         <td>Go</td>
+     *         <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;">
+     *           <ul>
+     *             <li style="color:black;"></li>
+     *             <li style="color:yellow;"></li>
+     *             <li style="color:black;"></li>
+     *           </ul>
+     *         </td>
+     *         <td>Stop</td>
+     *     </tr>
+     * </table>
+     *
+     * <p>On contrary <em>any</em> other pattern due to e.g. broken bulbs or other technical failures is invalid:</p>
+     *
+     * <table style="outline: 2px solid;border-spacing: 10ex 0;">
+     *     <caption style="background:lightgrey;text-align:left;">
+     *         <em>Invalid German traffic light state examples</em>
+     *     </caption>
+     *     <tr>
+     *         <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;">
+     *           <ul >
+     *             <li style="color:red;"></li>
+     *             <li style="color:black;"></li>
+     *             <li style="color:green;"></li>
+     *           </ul>
+     *         </td>
+     *         <td>
+     *             <p>Wait or go?</p>
+     *             <p>(Fix my</p>
+     *             <p>control</p>
+     *             <p>unit!)</p>
+     *         </td>
+     *         <td style="border: 2px solid black;border-radius: 10px;font-size:40px;background:black;">
+     *           <ul >
+     *             <li style="color:black;"></li>
+     *             <li style="color:black;"></li>
+     *             <li style="color:black;"></li>
+     *           </ul>
+     *         </td>
+     *         <td>Broken bulb(s)</td>
+     *         <td>...</td>
+     *     </tr>
+     * </table>
+     *
+     * @param red <code>true</code> represents »on«, <code>false</code> represents »off«.
+     * @param yellow <code>true</code> represents »on«, <code>false</code> represents »off«.
+     * @param green <code>true</code> represents »on«, <code>false</code> represents »off«.
+     *
+     * @return <code>true</code> if in a valid state, <code>false</code> otherwise.
+     */
+    static public boolean stateIsValid(boolean red, boolean yellow, boolean green) {
+        return true == red & false == green |    // (red, yellow, -) and (red, -,     -)
+               false == red  & (yellow ^ green); // (  -, yellow, -) and (  -, -, green)
+
+        // Hint: yellow ^ green is equivalent to (yellow & !green) | (!yellow & green)
+    }
+
+    private A_TrafficLight(){/* Ignore me: My sole purpose is suppressing default constructor javadoc generation */}
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java
new file mode 100644
index 000000000..ba8ac4751
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/B_Max.java
@@ -0,0 +1,49 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+/**
+ * <p>Doing basic calculations.</p>
+ */
+public class B_Max {
+    /**
+     * <p>Get the largest basic calculation result of two values.</p>
+     *
+     * <p>We have four different basic calculation operations:</p>
+     *
+     * <ul style="list-style:none">
+     *     <li><code style="font-weight: bolder">+</code>: Addition</li>
+     *     <li><code style="font-weight: bolder">-</code>: Subtraction</li>
+     *     <li><code style="font-weight: bolder">*</code>: Multiplication</li>
+     *     <li><code style="font-weight: bolder">/</code>: Division</li>
+     * </ul>
+     *
+     * <p>Given two values like e.g 4 and 0.1 we can construct four different basic calculation terms:</p>
+     *
+     * <ul style="list-style:none">
+     *     <li><code>4 + 0.1 == 4.1</code></li>
+     *     <li><code>4 - 0.1 == 3.9</code></li>
+     *     <li><code>4 * 0.1 == 0.4</code></li>
+     *     <li><code style="background: lightgreen">4 / 0.1 == 40</code></li>
+     * </ul>
+     *
+     * <p>The above example features a maximum result value of 40 resulting from dividing 4 by 0.1 .
+     * Depending on both values the maximum may result from either of our four basic operations. We take a
+     * second set of example values 3 and -1:</p>
+     *
+     * <ul style="list-style:none">
+     *     <li><code>3 + (-1) == 2</code></li>
+     *     <li><code style="background: lightgreen">3 - (-1) == 4</code></li>
+     *     <li><code>3 * (-1) == -3</code></li>
+     *     <li><code>3 / (-1) == -3</code></li>
+     * </ul>
+     *
+     * <p>This time we get a maximum of 4 by subtracting -1 from 3 .</p>
+     *
+     * @param first The first operand
+     * @param second The second operand
+     * @return The largest basic calculation result taking both arguments in their respective order.
+     */
+    public static double getBasicCalculationMax(final double first, final double second) {
+        return Math.max(Math.max(Math.max(first + second, first - second), first * second), first / second);
+    }
+    private B_Max(){/* Ignore me, suppressing implicit default constructor Javadoc HTML generation */}
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java
new file mode 100644
index 000000000..5c678eeb6
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrl.java
@@ -0,0 +1,83 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+/**
+ * <p>Handle web addresses.</p>
+ */
+public class C_WebUrl {
+
+    /**
+     * <p>Accessing web sites e.g. <code>www.wikipedia.org</code> requires entering the address in a web browser:</p>
+     *
+     * <img style="outline: 2px solid;"
+     *     src="doc-files/weburlBlank.png" alt="A web address without protocol specification" >
+     *
+     * <p>Entering <code>www.wikipedia.org</code> fulfills its purpose. However behind the scenes either a
+     * <code>http://</code> or <code>https://</code> protocol specification is being silently prepended:</p>
+     *
+     * <img style="outline: 2px solid;"
+     *     src="doc-files/weburlProtocol.png" alt="A web address including a protocol specification">
+     *
+     * <p>The current method adds a missing protocol specification according to the following rules:</p>
+     *
+     * <ul>
+     *     <li>An address already starting with either <code>http://</code> or <code>https://</code> is just being
+     *      copied.</li>
+     *
+     *     <li>
+     *        <p>An address not starting with either <code>http://</code> or <code>https://</code> receives a
+     *             protocol prefix according to the <code>tlsSupport</code> parameter.</p>
+     *     </li>
+     *  </ul>
+     *  <p>Some examples:</p>
+     *  <table class="goikTableDefaults">
+     *     <caption>Optional protocol prefix examples for <code>www.wikipedia.org</code></caption>
+     *     <tr>
+     *         <th><code>address</code></th>
+     *         <th><code>tlsSupport</code></th>
+     *         <th>Return value</th>
+     *     </tr>
+     *     <tr>
+     *         <td style="color:blue"><code>www.wikipedia.org</code></td>
+     *         <td><code style="color:red">true</code></td>
+     *         <td><code style="color:red">https</code>://<code style="color:blue">www.wikipedia.org</code></td>
+     *     </tr>
+     *     <tr>
+     *         <td style="color:blue"><code>www.wikipedia.org</code></td>
+     *         <td><code style="color:red">false</code></td>
+     *         <td><code style="color:red">http</code>://<code style="color:blue">www.wikipedia.org</code></td>
+     *     </tr>
+     *     <tr>
+     *         <td style="color:blue"><code>http://www.wikipedia.org</code></td>
+     *         <td>Protocol specification <code>http://</code> present, value irrelevant</td>
+     *         <td style="color:blue"><code>http://www.wikipedia.org</code></td>
+     *     </tr>
+     *     <tr>
+     *         <td style="color:blue"><code>https://www.wikipedia.org</code></td>
+     *         <td>Protocol specification <code>https://</code> present, value irrelevant</td>
+     *         <td style="color:blue"><code>https://www.wikipedia.org</code></td>
+     *     </tr>
+     * </table>
+     *
+     * @param address A website's address. May either be a raw name or a full http/https prefixed protocol address.
+     * @param tlsSupport If <code>true</code> the server supports
+     *                   <code><span style="color:red">https</span>://...</code> connections. Otherwise, only
+     *                   <code><span style="color:red">http</span>://...</code> is being supported.
+     *
+     * @return A fully <code>http://</code> or <code>https://</code> prefixed protocol address.
+     *
+     * <section class="implementationHints">
+     *     <h4 class="implementationHints">Hint:</h4>
+     *     
+     *     <p>{@link String#startsWith(String)}</p>
+     * </section>
+     */
+    public static String amendWebAddress(final String address, final boolean tlsSupport) {
+        if (address.startsWith("http://") | address.startsWith("https://")) {
+            return address;
+        } else if (tlsSupport){
+            return "https://" + address;
+        } else {
+            return "http://" + address;
+        }
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java
new file mode 100644
index 000000000..c2e8c019e
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/D_Array.java
@@ -0,0 +1,77 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+/**
+ * Array helper method.
+ */
+public class D_Array {
+
+    /**
+     * The special value -1 indicating two arrays are not being related by any sequence of right cyclic rotations.
+     * Example: {1, 2} and {1, 3}.
+     */
+    static public final int NOT_CYCLICALLY_RELATED = -1 ;
+
+    /**
+     * <p>Part 2: Check two arrays for being related by an integer number of successive right cyclic rotations or not.</p>
+     *
+     * <p>Consider a right cyclic array rotating example:</p>
+     *
+     * <pre>
+     *      <span style="color:red">⬐─────┐</span>
+     *     {1, 7, <span style="color:blue">3</span>} ⇨ {<span style="color:blue">3</span>, 1, 7}
+     *       <span style="color:red">⤻  ⤻</span>
+     * </pre>
+     *
+     * <p>The arrays <code>{1, 7, 3}</code> and <code>{3, 1, 7}</code> are thus being related by one right
+     * cyclic rotation.</p>
+     *
+     * <p>Arrays may also be related by a succession of multiple right cyclic rotations. Example:</p>
+     *
+     * <p><code>{1, 8, 3, 4}</code> and <code>{3, 4, 1, 8}</code> are being related by a sequence of two right cyclic
+     * rotations:</p>
+     *
+     * <pre>
+     * <span style="color:red">     ⬐────────┐    ⬐────────┐</span>
+     *     {1, 8, 3, <span style="color:blue">4</span>} ⇨ {<span style="color:blue">4</span>, 1, 8, <span
+     *     style="color:orange">3</span>} ⇨ {<span style="color:orange">3</span>, <span style="color:blue">4</span>, 1, 8}
+     * <span style="color:red">      ⤻  ⤻ ⤻       ⤻  ⤻ ⤻</span>
+     * </pre>
+     *
+     * <p>In this case a value of 2 rotations is being returned.</p>
+     *
+     * <h4>Special cases: </h4>
+     *
+     * <ul>
+     *     <li>Two identical arrays are being related by zero rotations.</li>
+     *     <li>Two arrays of different size are always unrelated / {@link #NOT_CYCLICALLY_RELATED} .</li>
+     * </ul>
+     *
+     * @param array1 The first array. Values must remain untouched.
+     * @param array2 The second array. Values must remain untouched.
+     *
+     * @return Either the number of right cyclic rotations or the special value {@link #NOT_CYCLICALLY_RELATED} if both
+     * arrays are not being related by a sequence of cyclic rotations.
+     */
+    static public int isRotatedBy(final int[] array1, int[] array2) {
+        final int length = array1.length;
+        if (length == array2.length) {
+            if (0 == length) {
+                return 0;
+            }
+            for (int rotation = 0; rotation < length; rotation++) {
+                boolean allValuesEqual = true;
+                for (int i = 0; i < length; i++) {
+                    if (array1[i] != array2[(i + rotation) % length]) {
+                        allValuesEqual = false;
+                        break;
+                    }
+                }
+                if (allValuesEqual) {
+                    return rotation;
+                }
+            }
+        }
+        return NOT_CYCLICALLY_RELATED; // No rotation found
+    }
+    private D_Array(){/* Ignore me, suppressing implicit default constructor Javadoc HTML generation */}
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java
new file mode 100644
index 000000000..6152c2c29
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/package-info.java
@@ -0,0 +1,22 @@
+/**
+ * <p>Classes here mostly (if not completely) contain static methods to be implemented.</p>
+ *
+ * <p>The ordering being implied by (test) class names and related methods reflect the author's opinion about ascending
+ * implementation difficulty. You are free to proceed differently. Hints:</p>
+ *
+ * <ul>
+ *     <li>Run <code>mvn javadoc:javadoc</code> and open the generated
+ *     <code>&lt;projectroot&gt;/target/site/apidocs/index.html</code> file in your browser of choice.</li>
+ *
+ *     <li>Read the generated documentation thoroughly. Make sure you do understand the intended method behaviour prior
+ *     to implementing.</li>
+ *
+ *     <li>Use the corresponding unit tests from your project's »test« branch checking your implementation's
+ *     correctness. Executing <code>de.hdm_stuttgart.mi.sd1.ShowReachedPoints</code> reveals your number
+ *     of examination points reached so far.</li>
+ *
+ *     <li>The debugger is your friend</li>
+ * </ul>
+ *
+ */
+package de.hdm_stuttgart.mi.sd1.task1;
\ No newline at end of file
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java
new file mode 100644
index 000000000..9ecc88117
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/Direction.java
@@ -0,0 +1,42 @@
+package de.hdm_stuttgart.mi.sd1.task2;
+
+/** <p>The 8 main wind directions.</p>
+ */
+public enum Direction {
+    /**
+     * North
+     */
+    N,
+    /**
+     * Northeast
+     */
+    NE,
+    /**
+     * East
+     */
+    E,
+
+    /**
+     * Southeast
+     */
+    SE,
+
+    /**
+     * South
+     */
+    S,
+
+    /**
+     * Southwest
+     */
+    SW,
+
+    /**
+     * West
+     */
+    W,
+    /**
+     * Northwest
+     */
+    NW
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java
new file mode 100644
index 000000000..640cc343c
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/WindForecast.java
@@ -0,0 +1,64 @@
+package de.hdm_stuttgart.mi.sd1.task2;
+
+/**
+ * <p>Matching wind forecast conditions</p>
+ */
+public class WindForecast {
+
+    private final Direction direction;
+
+    private final int windSpeed;
+
+    /**
+     * <p>Wind forecast by range and directions.</p>
+     *
+     * @param windSpeed Expected wind speed in Km/h.
+     * @param directions The main wid direction to be expected
+     */
+    public WindForecast(final int windSpeed, final Direction directions) {
+        this.direction = directions;
+        this.windSpeed = windSpeed;
+    }
+
+    /**
+     * <p>Check for matching conditions.</p>
+     *
+     * <p>Many water sports addicts depend on suitable wind conditions being described by wind speed and
+     * optionally wind direction.</p>
+     *
+     * <p>As an example a kitesurfer might want to get notified if the wind forecast at his or her suitable spot predicts
+     * wind ranging from 30 Km/h to 50 Km/h in speed and coming either from northern or northwestern direction. The
+     * wind prediction is wind at 40 Km from north. Corresponding code sample:</p>
+     *
+     * <pre><code class="java"> final WindForecast forecast = new WindForecast(40, Direction.N);
+     *
+     * if (forecast.matchingConditions(30, 50, new Direction[]{Direction.N, Direction.NW})) {
+     *    System.out.println("Yeah, let's go for it! \uD83D\uDE0E");
+     * else {
+     *    System.out.println("I hate waiting for the wind! \uD83E\uDD2C");
+     * }</code></pre>
+     *
+     * @param speedMinimum Minimum required wind speed.
+     * @param speedMaximum Maximum tolerable wind speed.
+     * @param directions List of favourable wind directions
+     * @return <code>true</code> if current wind's speed and one of the provided directions match the
+     * {@link #WindForecast(int, Direction)} criteria, <code>false</code> otherwise.
+     */
+    public boolean matchingConditions(final int speedMinimum, final int speedMaximum, final Direction[] directions) {
+
+        if (windSpeed < speedMinimum || speedMaximum < windSpeed) {
+            return false;
+        }
+
+        if (0 == directions.length) { // Direction does not matter to customer
+            return true;
+        } else {
+            for (final Direction d: directions) {
+                if (d == direction) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java
new file mode 100644
index 000000000..b12e6627a
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/package-info.java
@@ -0,0 +1,18 @@
+/**
+ * <p>This package hosts more advanced implementation tasks.</p>
+ *
+ * <ul>
+ *     <li>Run <code>mvn javadoc:javadoc</code> and open the generated
+ *     <code>&lt;projectroot&gt;/target/site/apidocs/index.html</code> file in your browser of choice.</li>
+ *
+ *     <li>Read the generated documentation thoroughly. Make sure you do understand the intended method behaviour prior
+ *     to implementing.</li>
+ *
+ *     <li>Use the corresponding unit tests from your project's »test« branch checking your implementation's
+ *     correctness. Executing <code>de.hdm_stuttgart.mi.sd1.ShowReachedPoints</code> reveals your number
+ *     of examination points reached so far.</li>
+ *
+ *     <li>The debugger is your friend</li>
+ * </ul>
+ */
+package de.hdm_stuttgart.mi.sd1.task2;
\ No newline at end of file
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlBlank.png b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlBlank.png
new file mode 100644
index 0000000000000000000000000000000000000000..01376dac6c420ef680afbbb82f147dfa569b0766
GIT binary patch
literal 13604
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
Ynz`xU#kc<i-*bXUeUulg5HSq=FK2LcivR!s

literal 0
HcmV?d00001

diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlProtocol.png b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/de/hdm_stuttgart/mi/sd1/task1/doc-files/weburlProtocol.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9c648b8d28812201ab15b272b7e953c7c0fb642
GIT binary patch
literal 10900
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

literal 0
HcmV?d00001

diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/fonts/dejavu.css b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/fonts/dejavu.css
new file mode 100644
index 000000000..4fec2b593
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/fonts/dejavu.css
@@ -0,0 +1,3 @@
+/* shame on you, javadoc! Still providing
+@import url('resources/fonts/dejavu.css') line in stylesheet.css
+*/
\ No newline at end of file
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.css b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.css
new file mode 100644
index 000000000..08840cdbf
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.css
@@ -0,0 +1,72 @@
+/* Javadoc extensions: */
+
+ul > li > ul {
+    list-style-type: circle;
+}
+
+table.goikTableDefaults,
+table.goikTableDefaults>caption,
+table.goikTableDefaults>tr>th,
+table.goikTableDefaults>tr>td,
+table.goikTableDefaults>tbody>tr>th,
+table.goikTableDefaults>tbody>tr>td {
+    border: 2px solid black;
+    border-collapse: collapse;
+    padding: 1ex;
+    vertical-align: top;
+}
+
+table.goikTableDefaults>caption {
+    /* border-top-style: solid; border-left-style: solid; border-right-style: solid' */
+    border-bottom-style: none;
+    font-weight: bold;
+    background:#dee3e9;
+    text-align:left;
+    padding:8px 3px 3px 7px;
+}
+
+table.goikTableDefaults>tbody>tr>td {
+    vertical-align:top;
+}
+table.goikTableDefaults {
+    border-spacing: 0px !important;
+}
+
+table.indexTable {
+    border-collapse: collapse;
+    border-style: hidden;
+}
+
+table.indexTable caption {
+    text-align: left;
+}
+
+table.indexTable td, table.indexTable th {
+    border: 1px solid black;
+    padding: 0.5ex;
+}
+
+em {
+    font-weight: bold;
+    font-style: normal;
+}
+section.implementationHints>h3 {
+    font-weight: bold;
+    background-color: rgb(222, 227, 233);
+}
+
+code {
+    white-space: pre;
+}
+
+.implementationHints {
+    background-color: hsl(120, 100%, 95%) !important;
+}
+
+.myRed {
+    color: red;
+}
+
+.myGreen {
+    color: limegreen;
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.js b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.js
new file mode 100644
index 000000000..97911e558
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/javadoc/resources/jdocSupplement.js
@@ -0,0 +1,7 @@
+for(var i in document.links) {
+   var link = document.links[i];
+   if (link.href && link.href.indexOf('http') === 0) { 
+       link.target = '_blank';
+   }
+}
+
diff --git a/Klausuren/Sd1/2023winter/Solve/src/main/resources/log4j2.xml b/Klausuren/Sd1/2023winter/Solve/src/main/resources/log4j2.xml
new file mode 100644
index 000000000..130f87a14
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/main/resources/log4j2.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <File name="A1" fileName="A1.log" append="false">
+            <PatternLayout pattern="%t %-5p %c{2} - %m%n"/>
+        </File>
+        <Console name="STDOUT" target="SYSTEM_OUT">
+            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+
+        <!-- You my want to define class or package level per-logger rules -->
+        <Logger name="de.hdm_stuttgart.mi.sd1.App" level="debug">
+            <AppenderRef ref="A1"/>
+        </Logger>
+        <Root level="info">
+            <AppenderRef ref="STDOUT"/>
+        </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java
new file mode 100644
index 000000000..c408929ee
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/ShowReachedPoints.java
@@ -0,0 +1,26 @@
+package de.hdm_stuttgart.mi.sd1;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.RunTests;
+
+import de.hdm_stuttgart.mi.sd1.task1.A_TrafficLightTest;
+import de.hdm_stuttgart.mi.sd1.task1.B_MaxTest;
+import de.hdm_stuttgart.mi.sd1.task1.C_WebUrlTest;
+import de.hdm_stuttgart.mi.sd1.task1.D_ArrayTest;
+
+import de.hdm_stuttgart.mi.sd1.task2.WindForecastTest;
+
+public class ShowReachedPoints {
+
+  /**
+   * Revealing total number of reached points from all tasks.
+   *
+   * @param args Unused
+   */
+  public static void main(String[] args) {
+    RunTests.exec(
+            "Task 1",
+            A_TrafficLightTest.class, B_MaxTest.class, C_WebUrlTest.class, D_ArrayTest.class
+    );
+    RunTests.exec("Task 2", WindForecastTest.class);
+  }
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java
new file mode 100644
index 000000000..3e3960d04
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/A_TrafficLightTest.java
@@ -0,0 +1,28 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+import static de.hdm_stuttgart.mi.sd1.task1.A_TrafficLight.stateIsValid;
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class A_TrafficLightTest extends ExaminationTestDefaults {
+
+    @Test
+    @Marking(points = 18)
+    public void test_100() {
+        Assert.assertFalse( stateIsValid(false, false, false));
+        Assert.assertTrue( stateIsValid(false, false, true));
+        Assert.assertTrue( stateIsValid(false, true, false));
+        Assert.assertFalse( stateIsValid(false, true, true));
+        Assert.assertTrue( stateIsValid(true, false, false));
+        Assert.assertFalse( stateIsValid(true, false, true));
+        Assert.assertTrue( stateIsValid(true, true, false));
+        Assert.assertFalse( stateIsValid(true, true, true));
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java
new file mode 100644
index 000000000..d1e177907
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/B_MaxTest.java
@@ -0,0 +1,37 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class B_MaxTest extends ExaminationTestDefaults {
+    static final public double PRECISION = 1.E-12;
+
+    @Test
+    @Marking(points = 15)
+    public void test() {
+        assertMaximum(12, 4, 3, '*');
+        assertMaximum(5, 2, -3, '-');
+        assertMaximum(5.1, 0.1, 5, '+');
+        assertMaximum(35, 7, 0.2, '/');
+        assertMaximum(-1.4,-7, 0.2, '*');
+        assertMaximum(4,2, 2, '+');
+    }
+
+    private static void assertMaximum(final double expected, final double first, final double second, char operation) {
+
+        final StringBuilder errMsg = new StringBuilder("Expected maximum is " + expected + " == " + first + " " +
+                operation + " ");
+
+        if (second < 0) {
+            errMsg.append("(" + second + ")");
+        } else {
+            errMsg.append(second);
+        }
+        Assert.assertEquals(errMsg.toString(), expected, B_Max.getBasicCalculationMax(first, second), PRECISION);
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java
new file mode 100644
index 000000000..4df40473b
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/C_WebUrlTest.java
@@ -0,0 +1,66 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+
+
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class C_WebUrlTest extends ExaminationTestDefaults {
+
+    static private final String dnsNames[] = {
+            "www.der-postillon.com", "www.duh.de", "www.amnesty.org"
+    };
+
+
+    @Test
+    @Marking(points = 14)
+    public void test() {
+
+        for(final String dns: dnsNames) {
+            final String
+                    httpUrl = "http://" + dns,
+                    httpsUrl = "https://" + dns,
+
+                    actualByHttpsTlsTrue = C_WebUrl.amendWebAddress(httpsUrl, true),
+                    actualByHttpsTlsFalse = C_WebUrl.amendWebAddress(httpsUrl, false),
+
+                    actualByHttpTlsTrue = C_WebUrl.amendWebAddress(httpUrl, true),
+                    actualByHttpTlsFalse = C_WebUrl.amendWebAddress(httpUrl, false),
+
+                    actualByDnsTlsTrue = C_WebUrl.amendWebAddress(dns, true),
+                    actualByDnsTlsFalse = C_WebUrl.amendWebAddress(dns, false);
+
+            Assert.assertEquals(
+                    "Passing '" + httpsUrl + "' should return '" + httpsUrl + "' rather than '" + actualByHttpsTlsTrue + "'",
+                    httpsUrl, actualByHttpsTlsTrue);
+
+            Assert.assertEquals(
+                    "Passing '" + httpsUrl + "' should return '" + httpsUrl + "' rather than '" + actualByHttpsTlsFalse + "'",
+                    httpsUrl, actualByHttpsTlsFalse);
+
+            Assert.assertEquals(
+                    "Passing '" + httpUrl + "' should return '" + httpUrl + "' rather than '" + actualByHttpTlsTrue + "'",
+                    httpUrl, actualByHttpTlsTrue);
+
+            Assert.assertEquals(
+                    "Passing '" + httpUrl + "' should return '" + httpUrl + "' rather than '" + actualByHttpTlsFalse + "'",
+                    httpUrl, actualByHttpTlsFalse);
+
+
+            Assert.assertEquals(
+                    "Passing '" + dns + "' when tlsSupport is 'true' should return '"  + httpsUrl + "' rather than " + actualByDnsTlsTrue,
+                    httpsUrl, actualByDnsTlsTrue);
+
+            Assert.assertEquals(
+                    "Passing '" + dns + "' when tlsSupport is 'false' should return '"  + httpUrl + "' rather than " + actualByDnsTlsFalse,
+                    httpUrl, actualByDnsTlsFalse);
+
+        }
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java
new file mode 100644
index 000000000..24b763ada
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task1/D_ArrayTest.java
@@ -0,0 +1,118 @@
+package de.hdm_stuttgart.mi.sd1.task1;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+import java.util.Arrays;
+
+import static de.hdm_stuttgart.mi.sd1.task1.D_Array.NOT_CYCLICALLY_RELATED;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class D_ArrayTest extends ExaminationTestDefaults {
+
+    private static void assertRelatedByRotation(final int expectedRotation, final int[] array1, int[] array2) {
+
+        final int[] array1Copy = Arrays.copyOf(array1, array1.length),
+                array2Copy = Arrays.copyOf(array2, array2.length);
+
+        final String errorMessage;
+        if (NOT_CYCLICALLY_RELATED == expectedRotation) {
+            errorMessage = Arrays.toString(array1) + " and " + Arrays.toString(array2) +
+                    " are not being cyclically related.";
+        } else {
+            errorMessage = Arrays.toString(array1) + " and " + Arrays.toString(array2) +
+                    " are being cyclically related by " + expectedRotation + " right rotation(s).";
+        }
+        Assert.assertEquals(errorMessage, expectedRotation, D_Array.isRotatedBy(array1, array2));
+
+        Assert.assertArrayEquals("You must not change values in array1 parameter", array1Copy, array1);
+        Assert.assertArrayEquals("You must not change values in array2 parameter", array2Copy, array2);
+    }
+
+    @Test
+    public void test010_Minimum() {
+        assertRelatedByRotation(0, new int[]{}, new int[]{});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{}, new int[]{1});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED, new int[]{3}, new int[]{});
+    }
+    @Test
+    public void test020One() {
+        assertRelatedByRotation(0,  new int[]{77}, new int[]{77});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{8}, new int[]{77});
+    }
+
+    @Test
+    @Marking(points = 2)
+    public void test030Two() {
+        assertRelatedByRotation(0,  new int[]{-1, 5}, new int[]{-1, 5});
+        assertRelatedByRotation(1,  new int[]{-1, 5}, new int[]{5, -1});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{-1, 5}, new int[]{-5, 1});
+    }
+    @Test
+    @Marking(points = 2)
+    public void test040Three() {
+        assertRelatedByRotation( 0,  new int[]{2, -6, 9}, new int[]{ 2, -6,  9});
+        assertRelatedByRotation( 1,  new int[]{2, -6, 9}, new int[]{ 9,  2, -6});
+        assertRelatedByRotation( 2,  new int[]{2, -6, 9}, new int[]{-6,  9,  2});
+
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{2, -6, 9}, new int[]{ 2,  9, -6});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{2, -6, 9}, new int[]{-6,  2,  9});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{2, -6, 9}, new int[]{-6,  2});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{-1, 2, 4}, new int[]{-1, 2, 5});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{-1, 2, 4}, new int[]{-2, 2, 4});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{-1, 2, 4}, new int[]{-1, 3, 4});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{-1, 2, 4}, new int[]{-1, 3, 4, 3});
+        assertRelatedByRotation(NOT_CYCLICALLY_RELATED,  new int[]{-1, 2, 4, 1}, new int[]{-1, 3, 4});
+    }
+    @Test
+    @Marking(points = 2)
+    public void test050Twenty() {
+        assertRelatedByRotation( 0,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
+
+        assertRelatedByRotation( 1,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{10, 1, 2, 3, 4, 5, 6, 7, 8, 9});
+
+        assertRelatedByRotation( 2,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{9, 10, 1, 2, 3, 4, 5, 6, 7, 8});
+
+        assertRelatedByRotation( 3,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{8, 9, 10, 1, 2, 3, 4, 5, 6, 7});
+
+        assertRelatedByRotation( 4,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{7, 8, 9, 10, 1, 2, 3, 4, 5, 6});
+
+        assertRelatedByRotation( 5,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{6, 7, 8, 9, 10, 1, 2, 3, 4, 5});
+
+        assertRelatedByRotation( 6,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{5, 6, 7, 8, 9, 10, 1, 2, 3, 4});
+
+        assertRelatedByRotation( 7,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{4, 5, 6, 7, 8, 9, 10, 1, 2, 3});
+
+        assertRelatedByRotation( 8,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{3, 4, 5, 6, 7, 8, 9, 10, 1, 2});
+
+        assertRelatedByRotation( 9,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                          */     new int[]{2, 3, 4, 5, 6, 7, 8, 9, 10, 1});
+
+        assertRelatedByRotation( NOT_CYCLICALLY_RELATED,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                                 */     new int[]{1, 2, 3, 4, 6, 5, 7, 8, 9, 10});
+
+        assertRelatedByRotation( NOT_CYCLICALLY_RELATED,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                                 */     new int[]{1, 2, 3, 4, 6, 5, 7, 8, 9});
+
+        assertRelatedByRotation( NOT_CYCLICALLY_RELATED,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9},
+                /*                                 */     new int[]{1, 2, 3, 4, 6, 5, 7, 8, 9, 10});
+
+        assertRelatedByRotation( NOT_CYCLICALLY_RELATED,  new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+                /*                                 */     new int[]{});
+
+
+    }
+}
diff --git a/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java
new file mode 100644
index 000000000..00f5f04be
--- /dev/null
+++ b/Klausuren/Sd1/2023winter/Solve/src/test/java/de/hdm_stuttgart/mi/sd1/task2/WindForecastTest.java
@@ -0,0 +1,56 @@
+package de.hdm_stuttgart.mi.sd1.task2;
+
+import de.hdm_stuttgart.mi.exam.unitmarking.ExaminationTestDefaults;
+import de.hdm_stuttgart.mi.exam.unitmarking.Marking;
+import de.hdm_stuttgart.mi.exam.unitmarking.reflect.ObjectWrapper;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+import static de.hdm_stuttgart.mi.sd1.task2.Direction.*;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+
+public class WindForecastTest extends ExaminationTestDefaults {
+
+    final ObjectWrapper<WindForecast> forecast_30_S =
+            new ObjectWrapper<>(WindForecast.class, 30, S);
+
+    @Test
+    @Marking(points = 10)
+    public void test_100_noDirection() {
+
+        Assert.assertTrue("Forecast speed 30 being within [30, 40] expects true",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 30, 40, new Direction[]{}));
+
+        Assert.assertTrue("Forecast speed 30 being within [10, 40] expects true",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 10, 40, new Direction[]{}));
+
+        Assert.assertTrue("Forecast speed 30 being within [20, 30] expects true",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 20, 30, new Direction[]{}));
+
+        Assert.assertFalse("Forecast speed 30 outside [31, 40] expects false",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 31, 40, new Direction[]{}));
+
+        Assert.assertFalse("Forecast speed 30 outside [20, 29] expects false",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 20, 29, new Direction[]{}));
+    }
+
+    @Test
+    @Marking(points = 5)
+    public void test_200_Direction() {
+
+        Assert.assertTrue("Forecast speed 30 being within [30, 40] and direction containing S expects true",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 30, 40,
+                        new Direction[]{SE, SW, S}));
+
+        Assert.assertFalse("Forecast speed 30 not within [31, 40] expects false",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 31, 40,
+                        new Direction[]{SE, SW, S}));
+
+        Assert.assertFalse("Forecast speed 30 being within [30, 40] but direction not containing S expects false",
+                forecast_30_S.invoke(boolean.class, "matchingConditions", 30, 40,
+                        new Direction[]{N,NE,E,W,NW}));
+    }
+}
-- 
GitLab