Initial Commit
This commit is contained in:
		
						commit
						aff4e4c693
					
				
					 17 changed files with 800 additions and 0 deletions
				
			
		
							
								
								
									
										9
									
								
								.editorconfig
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.editorconfig
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | ||||||
|  | # Editor configuration, see https://editorconfig.org | ||||||
|  | root = true | ||||||
|  | 
 | ||||||
|  | [*] | ||||||
|  | charset = utf-8 | ||||||
|  | indent_style = space | ||||||
|  | indent_size = 2 | ||||||
|  | insert_final_newline = true | ||||||
|  | trim_trailing_whitespace = true | ||||||
							
								
								
									
										84
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,84 @@ | ||||||
|  | ### VS-Code ### | ||||||
|  | .vscode/ | ||||||
|  | *.code-workspace | ||||||
|  | .history/ | ||||||
|  | 
 | ||||||
|  | ### Intellij ### | ||||||
|  | .idea/ | ||||||
|  | *.iws | ||||||
|  | /out/ | ||||||
|  | *.iml | ||||||
|  | .idea_modules/ | ||||||
|  | atlassian-ide-plugin.xml | ||||||
|  | 
 | ||||||
|  | ### Eclipse ### | ||||||
|  | .metadata | ||||||
|  | bin/ | ||||||
|  | tmp/ | ||||||
|  | *.tmp | ||||||
|  | *.bak | ||||||
|  | *.swp | ||||||
|  | *~.nib | ||||||
|  | local.properties | ||||||
|  | .settings/ | ||||||
|  | .loadpath | ||||||
|  | .recommenders | ||||||
|  | .externalToolBuilders/ | ||||||
|  | *.launch | ||||||
|  | .factorypath | ||||||
|  | .recommenders/ | ||||||
|  | .apt_generated/ | ||||||
|  | .project | ||||||
|  | .classpath | ||||||
|  | 
 | ||||||
|  | ### Linux ### | ||||||
|  | *~ | ||||||
|  | .fuse_hidden* | ||||||
|  | .directory | ||||||
|  | .Trash-* | ||||||
|  | .nfs* | ||||||
|  | 
 | ||||||
|  | ### macOS ### | ||||||
|  | .DS_Store | ||||||
|  | .AppleDouble | ||||||
|  | .LSOverride | ||||||
|  | Icon | ||||||
|  | ._* | ||||||
|  | .DocumentRevisions-V100 | ||||||
|  | .fseventsd | ||||||
|  | .Spotlight-V100 | ||||||
|  | .TemporaryItems | ||||||
|  | .Trashes | ||||||
|  | .VolumeIcon.icns | ||||||
|  | .com.apple.timemachine.donotpresent | ||||||
|  | .AppleDB | ||||||
|  | .AppleDesktop | ||||||
|  | Network Trash Folder | ||||||
|  | Temporary Items | ||||||
|  | .apdisk | ||||||
|  | 
 | ||||||
|  | ### NetBeans ### | ||||||
|  | nbproject/private/ | ||||||
|  | build/ | ||||||
|  | nbbuild/ | ||||||
|  | dist/ | ||||||
|  | nbdist/ | ||||||
|  | .nb-gradle/ | ||||||
|  | 
 | ||||||
|  | ### Windows ### | ||||||
|  | # Windows thumbnail cache files | ||||||
|  | Thumbs.db | ||||||
|  | ehthumbs.db | ||||||
|  | ehthumbs_vista.db | ||||||
|  | *.stackdump | ||||||
|  | [Dd]esktop.ini | ||||||
|  | $RECYCLE.BIN/ | ||||||
|  | *.lnk | ||||||
|  | 
 | ||||||
|  | ### Gradle ### | ||||||
|  | .gradle | ||||||
|  | /build/ | ||||||
|  | out/ | ||||||
|  | gradle-app.setting | ||||||
|  | !gradle-wrapper.jar | ||||||
|  | .gradletasknamecache | ||||||
							
								
								
									
										40
									
								
								build.gradle.kts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								build.gradle.kts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,40 @@ | ||||||
|  | import org.jagrkt.submitter.submit | ||||||
|  | 
 | ||||||
|  | plugins { | ||||||
|  |   java | ||||||
|  |   application | ||||||
|  |   id("org.jagrkt.submitter").version("0.3.1") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | submit { | ||||||
|  |   assignmentId = "h07" // do not change assignmentId | ||||||
|  |   studentId = null | ||||||
|  |   firstName = null | ||||||
|  |   lastName = null | ||||||
|  |   // Optionally require tests for prepareSubmission task. Default is true | ||||||
|  |   requireTests = true | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | repositories { | ||||||
|  |   mavenCentral() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | dependencies { | ||||||
|  |   // JUnit only available in "test" source set (./src/test) | ||||||
|  |   testImplementation("org.junit.jupiter:junit-jupiter:5.7.1") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | java { | ||||||
|  |   sourceCompatibility = JavaVersion.VERSION_11 | ||||||
|  |   targetCompatibility = JavaVersion.VERSION_11 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | application { | ||||||
|  |   mainClass.set("h07.Main") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | tasks { | ||||||
|  |   test { | ||||||
|  |     useJUnitPlatform() | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										5
									
								
								gradle/wrapper/gradle-wrapper.properties
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								gradle/wrapper/gradle-wrapper.properties
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | ||||||
|  | distributionBase=GRADLE_USER_HOME | ||||||
|  | distributionPath=wrapper/dists | ||||||
|  | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-all.zip | ||||||
|  | zipStoreBase=GRADLE_USER_HOME | ||||||
|  | zipStorePath=wrapper/dists | ||||||
							
								
								
									
										184
									
								
								gradlew
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								gradlew
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,184 @@ | ||||||
|  | #!/usr/bin/env sh | ||||||
|  | 
 | ||||||
|  | # | ||||||
|  | # Copyright 2015 the original author or authors. | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #      https://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | ############################################################################## | ||||||
|  | ## | ||||||
|  | ##  Gradle start up script for UN*X | ||||||
|  | ## | ||||||
|  | ############################################################################## | ||||||
|  | 
 | ||||||
|  | # Attempt to set APP_HOME | ||||||
|  | # Resolve links: $0 may be a link | ||||||
|  | PRG="$0" | ||||||
|  | # Need this for relative symlinks. | ||||||
|  | while [ -h "$PRG" ]; do | ||||||
|  |   ls=$(ls -ld "$PRG") | ||||||
|  |   link=$(expr "$ls" : '.*-> \(.*\)$') | ||||||
|  |   if expr "$link" : '/.*' >/dev/null; then | ||||||
|  |     PRG="$link" | ||||||
|  |   else | ||||||
|  |     PRG=$(dirname "$PRG")"/$link" | ||||||
|  |   fi | ||||||
|  | done | ||||||
|  | SAVED="$(pwd)" | ||||||
|  | cd "$(dirname \"$PRG\")/" >/dev/null | ||||||
|  | APP_HOME="$(pwd -P)" | ||||||
|  | cd "$SAVED" >/dev/null | ||||||
|  | 
 | ||||||
|  | APP_NAME="Gradle" | ||||||
|  | APP_BASE_NAME=$(basename "$0") | ||||||
|  | 
 | ||||||
|  | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||||
|  | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | ||||||
|  | 
 | ||||||
|  | # Use the maximum available, or set MAX_FD != -1 to use that value. | ||||||
|  | MAX_FD="maximum" | ||||||
|  | 
 | ||||||
|  | warn() { | ||||||
|  |   echo "$*" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | die() { | ||||||
|  |   echo | ||||||
|  |   echo "$*" | ||||||
|  |   echo | ||||||
|  |   exit 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # OS specific support (must be 'true' or 'false'). | ||||||
|  | cygwin=false | ||||||
|  | msys=false | ||||||
|  | darwin=false | ||||||
|  | nonstop=false | ||||||
|  | case "$(uname)" in | ||||||
|  | CYGWIN*) | ||||||
|  |   cygwin=true | ||||||
|  |   ;; | ||||||
|  | Darwin*) | ||||||
|  |   darwin=true | ||||||
|  |   ;; | ||||||
|  | MINGW*) | ||||||
|  |   msys=true | ||||||
|  |   ;; | ||||||
|  | NONSTOP*) | ||||||
|  |   nonstop=true | ||||||
|  |   ;; | ||||||
|  | esac | ||||||
|  | 
 | ||||||
|  | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | ||||||
|  | 
 | ||||||
|  | # Determine the Java command to use to start the JVM. | ||||||
|  | if [ -n "$JAVA_HOME" ]; then | ||||||
|  |   if [ -x "$JAVA_HOME/jre/sh/java" ]; then | ||||||
|  |     # IBM's JDK on AIX uses strange locations for the executables | ||||||
|  |     JAVACMD="$JAVA_HOME/jre/sh/java" | ||||||
|  |   else | ||||||
|  |     JAVACMD="$JAVA_HOME/bin/java" | ||||||
|  |   fi | ||||||
|  |   if [ ! -x "$JAVACMD" ]; then | ||||||
|  |     die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | ||||||
|  | 
 | ||||||
|  | Please set the JAVA_HOME variable in your environment to match the | ||||||
|  | location of your Java installation." | ||||||
|  |   fi | ||||||
|  | else | ||||||
|  |   JAVACMD="java" | ||||||
|  |   which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||||
|  | 
 | ||||||
|  | Please set the JAVA_HOME variable in your environment to match the | ||||||
|  | location of your Java installation." | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Increase the maximum file descriptors if we can. | ||||||
|  | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ]; then | ||||||
|  |   MAX_FD_LIMIT=$(ulimit -H -n) | ||||||
|  |   if [ $? -eq 0 ]; then | ||||||
|  |     if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then | ||||||
|  |       MAX_FD="$MAX_FD_LIMIT" | ||||||
|  |     fi | ||||||
|  |     ulimit -n $MAX_FD | ||||||
|  |     if [ $? -ne 0 ]; then | ||||||
|  |       warn "Could not set maximum file descriptor limit: $MAX_FD" | ||||||
|  |     fi | ||||||
|  |   else | ||||||
|  |     warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" | ||||||
|  |   fi | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # For Darwin, add options to specify how the application appears in the dock | ||||||
|  | if $darwin; then | ||||||
|  |   GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # For Cygwin or MSYS, switch paths to Windows format before running java | ||||||
|  | if [ "$cygwin" = "true" -o "$msys" = "true" ]; then | ||||||
|  |   APP_HOME=$(cygpath --path --mixed "$APP_HOME") | ||||||
|  |   CLASSPATH=$(cygpath --path --mixed "$CLASSPATH") | ||||||
|  | 
 | ||||||
|  |   JAVACMD=$(cygpath --unix "$JAVACMD") | ||||||
|  | 
 | ||||||
|  |   # We build the pattern for arguments to be converted via cygpath | ||||||
|  |   ROOTDIRSRAW=$(find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null) | ||||||
|  |   SEP="" | ||||||
|  |   for dir in $ROOTDIRSRAW; do | ||||||
|  |     ROOTDIRS="$ROOTDIRS$SEP$dir" | ||||||
|  |     SEP="|" | ||||||
|  |   done | ||||||
|  |   OURCYGPATTERN="(^($ROOTDIRS))" | ||||||
|  |   # Add a user-defined pattern to the cygpath arguments | ||||||
|  |   if [ "$GRADLE_CYGPATTERN" != "" ]; then | ||||||
|  |     OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" | ||||||
|  |   fi | ||||||
|  |   # Now convert the arguments - kludge to limit ourselves to /bin/sh | ||||||
|  |   i=0 | ||||||
|  |   for arg in "$@"; do | ||||||
|  |     CHECK=$(echo "$arg" | egrep -c "$OURCYGPATTERN" -) | ||||||
|  |     CHECK2=$(echo "$arg" | egrep -c "^-") ### Determine if an option | ||||||
|  | 
 | ||||||
|  |     if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ]; then ### Added a condition | ||||||
|  |       eval $(echo args$i)=$(cygpath --path --ignore --mixed "$arg") | ||||||
|  |     else | ||||||
|  |       eval $(echo args$i)="\"$arg\"" | ||||||
|  |     fi | ||||||
|  |     i=$(expr $i + 1) | ||||||
|  |   done | ||||||
|  |   case $i in | ||||||
|  |   0) set -- ;; | ||||||
|  |   1) set -- "$args0" ;; | ||||||
|  |   2) set -- "$args0" "$args1" ;; | ||||||
|  |   3) set -- "$args0" "$args1" "$args2" ;; | ||||||
|  |   4) set -- "$args0" "$args1" "$args2" "$args3" ;; | ||||||
|  |   5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; | ||||||
|  |   6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; | ||||||
|  |   7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; | ||||||
|  |   8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; | ||||||
|  |   9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; | ||||||
|  |   esac | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Escape application args | ||||||
|  | save() { | ||||||
|  |   for i; do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/"; done | ||||||
|  |   echo " " | ||||||
|  | } | ||||||
|  | APP_ARGS=$(save "$@") | ||||||
|  | 
 | ||||||
|  | # Collect all arguments for the java command, following the shell quoting and substitution rules | ||||||
|  | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" | ||||||
|  | 
 | ||||||
|  | exec "$JAVACMD" "$@" | ||||||
							
								
								
									
										89
									
								
								gradlew.bat
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								gradlew.bat
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,89 @@ | ||||||
|  | @rem | ||||||
|  | @rem Copyright 2015 the original author or authors. | ||||||
|  | @rem | ||||||
|  | @rem Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | @rem you may not use this file except in compliance with the License. | ||||||
|  | @rem You may obtain a copy of the License at | ||||||
|  | @rem | ||||||
|  | @rem      https://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | @rem | ||||||
|  | @rem Unless required by applicable law or agreed to in writing, software | ||||||
|  | @rem distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | @rem See the License for the specific language governing permissions and | ||||||
|  | @rem limitations under the License. | ||||||
|  | @rem | ||||||
|  | 
 | ||||||
|  | @if "%DEBUG%" == "" @echo off | ||||||
|  | @rem ########################################################################## | ||||||
|  | @rem | ||||||
|  | @rem  Gradle startup script for Windows | ||||||
|  | @rem | ||||||
|  | @rem ########################################################################## | ||||||
|  | 
 | ||||||
|  | @rem Set local scope for the variables with windows NT shell | ||||||
|  | if "%OS%"=="Windows_NT" setlocal | ||||||
|  | 
 | ||||||
|  | set DIRNAME=%~dp0 | ||||||
|  | if "%DIRNAME%" == "" set DIRNAME=. | ||||||
|  | set APP_BASE_NAME=%~n0 | ||||||
|  | set APP_HOME=%DIRNAME% | ||||||
|  | 
 | ||||||
|  | @rem Resolve any "." and ".." in APP_HOME to make it shorter. | ||||||
|  | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi | ||||||
|  | 
 | ||||||
|  | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||||
|  | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | ||||||
|  | 
 | ||||||
|  | @rem Find java.exe | ||||||
|  | if defined JAVA_HOME goto findJavaFromJavaHome | ||||||
|  | 
 | ||||||
|  | set JAVA_EXE=java.exe | ||||||
|  | %JAVA_EXE% -version >NUL 2>&1 | ||||||
|  | if "%ERRORLEVEL%" == "0" goto execute | ||||||
|  | 
 | ||||||
|  | echo. | ||||||
|  | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||||
|  | echo. | ||||||
|  | echo Please set the JAVA_HOME variable in your environment to match the | ||||||
|  | echo location of your Java installation. | ||||||
|  | 
 | ||||||
|  | goto fail | ||||||
|  | 
 | ||||||
|  | :findJavaFromJavaHome | ||||||
|  | set JAVA_HOME=%JAVA_HOME:"=% | ||||||
|  | set JAVA_EXE=%JAVA_HOME%/bin/java.exe | ||||||
|  | 
 | ||||||
|  | if exist "%JAVA_EXE%" goto execute | ||||||
|  | 
 | ||||||
|  | echo. | ||||||
|  | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | ||||||
|  | echo. | ||||||
|  | echo Please set the JAVA_HOME variable in your environment to match the | ||||||
|  | echo location of your Java installation. | ||||||
|  | 
 | ||||||
|  | goto fail | ||||||
|  | 
 | ||||||
|  | :execute | ||||||
|  | @rem Setup the command line | ||||||
|  | 
 | ||||||
|  | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @rem Execute Gradle | ||||||
|  | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* | ||||||
|  | 
 | ||||||
|  | :end | ||||||
|  | @rem End local scope for the variables with windows NT shell | ||||||
|  | if "%ERRORLEVEL%"=="0" goto mainEnd | ||||||
|  | 
 | ||||||
|  | :fail | ||||||
|  | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | ||||||
|  | rem the _cmd.exe /c_ return code! | ||||||
|  | if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | ||||||
|  | exit /b 1 | ||||||
|  | 
 | ||||||
|  | :mainEnd | ||||||
|  | if "%OS%"=="Windows_NT" endlocal | ||||||
|  | 
 | ||||||
|  | :omega | ||||||
							
								
								
									
										1
									
								
								settings.gradle.kts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								settings.gradle.kts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | rootProject.name = "AuD-2021-H07-Student" | ||||||
							
								
								
									
										7
									
								
								src/main/java/h07/Main.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/main/java/h07/Main.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,7 @@ | ||||||
|  | package h07; | ||||||
|  | 
 | ||||||
|  | public class Main { | ||||||
|  |   public static void main(String[] args) { | ||||||
|  |     System.out.println("Hello World!"); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								src/main/java/h07/algebra/Monoid.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/main/java/h07/algebra/Monoid.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | package h07.algebra; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Modelliert eine binäre Operation über einem Datentypen mit neutralem Element. | ||||||
|  |  * | ||||||
|  |  * @param <M> die Trägermenge des Monoids | ||||||
|  |  */ | ||||||
|  | public interface Monoid<M> { | ||||||
|  |   /** | ||||||
|  |    * Liefert das neutrale Element dieses Monoids. | ||||||
|  |    * | ||||||
|  |    * @return das neutrale Element dieses Monoids | ||||||
|  |    */ | ||||||
|  |   M zero(); | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Die Verknüpfung zweier Operanden durch das Monoid. | ||||||
|  |    * | ||||||
|  |    * @param a der erste Operand | ||||||
|  |    * @param b der zweite Operand | ||||||
|  |    * @return das Ergebnis der Verknüpfung beider Operanden | ||||||
|  |    */ | ||||||
|  |   M add(M a, M b); | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								src/main/java/h07/algorithm/ShortestPathsAlgorithm.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/main/java/h07/algorithm/ShortestPathsAlgorithm.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | ||||||
|  | package h07.algorithm; | ||||||
|  | 
 | ||||||
|  | import h07.algebra.Monoid; | ||||||
|  | import h07.graph.DirectedGraph; | ||||||
|  | import h07.graph.Path; | ||||||
|  | 
 | ||||||
|  | import java.util.Comparator; | ||||||
|  | import java.util.Map; | ||||||
|  | 
 | ||||||
|  | public interface ShortestPathsAlgorithm<V, A> { | ||||||
|  |   Map<V, Path<V, A>> shortestPaths( | ||||||
|  |     DirectedGraph<V, A> graph, V startNode, | ||||||
|  |     Monoid<A> monoid, Comparator<? super A> comparator); | ||||||
|  | } | ||||||
							
								
								
									
										51
									
								
								src/main/java/h07/experiment/RoadTrip.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/main/java/h07/experiment/RoadTrip.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | ||||||
|  | package h07.experiment; | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | import h07.algebra.IntegerAddition; | ||||||
|  | import h07.algorithm.Dijkstra; | ||||||
|  | import h07.graph.AdjacencyMatrixFactory; | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | public class RoadTrip { | ||||||
|  |   public static void main(String[] args) { | ||||||
|  |     String[] nodes = { | ||||||
|  |       "München", | ||||||
|  |       "Augsburg", | ||||||
|  |       "Karlsruhe", | ||||||
|  |       "Erfurt", | ||||||
|  |       "Nürnberg", | ||||||
|  |       "Kassel", | ||||||
|  |       "Würzburg", | ||||||
|  |       "Stuttgart", | ||||||
|  |       "Mannheim", | ||||||
|  |       "Frankfurt" | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     Integer[][] adjacencyMatrix = { | ||||||
|  |       {null, 84, null, null, 167, 502, null, null, null, null}, | ||||||
|  |       {84, null, 250, null, null, null, null, null, null, null}, | ||||||
|  |       {null, 250, null, null, null, null, null, null, 80, null}, | ||||||
|  |       {null, null, null, null, null, null, 186, null, null, null}, | ||||||
|  |       {167, null, null, null, null, null, 103, 183, null, null}, | ||||||
|  |       {502, null, null, null, null, null, null, null, null, 173}, | ||||||
|  |       {null, null, null, 186, 103, null, null, null, null, 217}, | ||||||
|  |       {null, null, null, null, 183, null, null, null, null, null}, | ||||||
|  |       {null, null, 80, null, null, null, null, null, null, 85}, | ||||||
|  |       {null, null, null, null, null, 173, 217, null, 85, null} | ||||||
|  |     }; | ||||||
|  |     /* | ||||||
|  |     var factory = new AdjacencyMatrixFactory<>(nodes, adjacencyMatrix); | ||||||
|  |     var graph = factory.createDirectedGraph(); | ||||||
|  | 
 | ||||||
|  |     var dijkstra = new Dijkstra<String, Integer>(); | ||||||
|  |     var paths = dijkstra.shortestPaths( | ||||||
|  |       graph, "Frankfurt", | ||||||
|  |       new IntegerAddition(), | ||||||
|  |       Comparator.naturalOrder()); | ||||||
|  | 
 | ||||||
|  |     // Sollte "Frankfurt -217-> Würzburg -103-> Nürnberg -167-> München" | ||||||
|  |     // ausgeben. | ||||||
|  |     System.out.println(paths.get("München")); | ||||||
|  |     */ | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								src/main/java/h07/graph/AbstractPath.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/main/java/h07/graph/AbstractPath.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | ||||||
|  | package h07.graph; | ||||||
|  | 
 | ||||||
|  | abstract class AbstractPath<V, A> implements Path<V, A> { | ||||||
|  |   @Override | ||||||
|  |   public String toString() { | ||||||
|  |     var traverser = traverser(); | ||||||
|  |     var builder = new StringBuilder(traverser.getCurrentNode().toString()); | ||||||
|  |     while (traverser.hasNextNode()) { | ||||||
|  |       builder.append(" -"); | ||||||
|  |       builder.append(traverser.getDistanceToNextNode()); | ||||||
|  |       traverser.walkToNextNode(); | ||||||
|  |       builder.append("-> "); | ||||||
|  |       builder.append(traverser.getCurrentNode()); | ||||||
|  |     } | ||||||
|  |     return builder.toString(); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										108
									
								
								src/main/java/h07/graph/DirectedGraph.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								src/main/java/h07/graph/DirectedGraph.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,108 @@ | ||||||
|  | package h07.graph; | ||||||
|  | 
 | ||||||
|  | import java.util.Collection; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Repräsentiert einen endlichen gerichteten Graphen mit gewichteten Kanten. | ||||||
|  |  * | ||||||
|  |  * @param <V> der Typ der Knoten dieses Graphen | ||||||
|  |  * @param <A> der Typ der Kantengewichte dieses Graphen | ||||||
|  |  */ | ||||||
|  | public interface DirectedGraph<V, A> { | ||||||
|  |   /** | ||||||
|  |    * Liefert alle Knoten dieses Graphen als unveränderliche | ||||||
|  |    * {@link java.util.Collection} von Knoten. | ||||||
|  |    * | ||||||
|  |    * @return eine unveränderliche {@link java.util.Collection} mit allen | ||||||
|  |    * Knoten dieses Graphen als Elemente | ||||||
|  |    */ | ||||||
|  |   Collection<V> getAllNodes(); | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Liefert die Kinder eines Knoten als unveränderliche | ||||||
|  |    * {@link java.util.Collection} von Knoten. | ||||||
|  |    * | ||||||
|  |    * @param node der Knoten, dessen Kinder abgefragt werden sollen | ||||||
|  |    * @return eine unveränderliche {@link java.util.Collection} mit den Kindern | ||||||
|  |    * des übergebenen Knoten als Elemente | ||||||
|  |    * @throws NullPointerException             falls der übergebene Knoten {@code null} ist | ||||||
|  |    * @throws java.util.NoSuchElementException falls der übergebene Knoten | ||||||
|  |    *                                          nicht in diesem Graphen existiert | ||||||
|  |    */ | ||||||
|  |   Collection<V> getChildrenForNode(V node); | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Liefert das Gewicht der Kante zwischen zwei Knoten. | ||||||
|  |    * | ||||||
|  |    * @param from der Knoten, von dem die Kante ausgeht | ||||||
|  |    * @param to   der Knoten, auf den die Kante zeigt | ||||||
|  |    * @return das Gewicht der Kante zwischen den beiden Knoten | ||||||
|  |    * @throws NullPointerException             falls für einen der beiden Knoten | ||||||
|  |    *                                          {@code null} als Parameter übergeben wird | ||||||
|  |    * @throws java.util.NoSuchElementException falls einer der beiden Knoten | ||||||
|  |    *                                          nicht in diesem Graphen existiert oder falls keine Kante vom | ||||||
|  |    *                                          ersten zum zweiten Knoten existiert | ||||||
|  |    */ | ||||||
|  |   A getArcWeightBetween(V from, V to); | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Fügt diesem Graphen einen Knoten hinzu, der bisher noch nicht im Graphen | ||||||
|  |    * enthalten ist. | ||||||
|  |    * | ||||||
|  |    * @param node der Knoten, der hinzugefügt werden soll | ||||||
|  |    * @throws NullPointerException          falls der hinzuzufügende Knoten {@code null} | ||||||
|  |    *                                       ist | ||||||
|  |    * @throws IllegalArgumentException      falls der übergebene Knoten bereits in | ||||||
|  |    *                                       diesem Graphen enthalten ist | ||||||
|  |    * @throws UnsupportedOperationException falls das Hinzufügen von Knoten von | ||||||
|  |    *                                       diesem Graphen nicht unterstützt wird | ||||||
|  |    */ | ||||||
|  |   void addNode(V node); | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Entfernt einen Knoten aus diesem Graphen. | ||||||
|  |    * Gleichzeitig werden alle vom zu entfernenden Knoten ausgehenden Kanten | ||||||
|  |    * aus diesem Graphen gelöscht. | ||||||
|  |    * | ||||||
|  |    * @param node der Knoten, der entfernt werden soll | ||||||
|  |    * @throws NullPointerException             falls der zu entfernende Knoten {@code null} | ||||||
|  |    *                                          ist | ||||||
|  |    * @throws java.util.NoSuchElementException falls der übergebene Knoten | ||||||
|  |    *                                          nicht in diesem Graphen enthalten ist | ||||||
|  |    * @throws UnsupportedOperationException    falls das Entfernen von Knoten von | ||||||
|  |    *                                          diesem Graphen nicht unterstützt wird | ||||||
|  |    */ | ||||||
|  |   void removeNode(V node); | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Verbindet zwei Knoten mit einer Kante. | ||||||
|  |    * | ||||||
|  |    * @param from   der Knoten von dem aus die neue Kante ausgehen soll | ||||||
|  |    * @param weight das Gewicht der neuen Kante | ||||||
|  |    * @param to     der Knoten, auf den die neue Kante zeigen soll | ||||||
|  |    * @throws NullPointerException             falls für einen der Parameter {@code null} | ||||||
|  |    *                                          übergeben wird | ||||||
|  |    * @throws java.util.NoSuchElementException falls einer der beiden Knoten | ||||||
|  |    *                                          nicht in diesem Graphen existiert | ||||||
|  |    * @throws IllegalArgumentException         falls bereits eine Kante vom ersten zum | ||||||
|  |    *                                          zweiten Knoten existiert | ||||||
|  |    * @throws UnsupportedOperationException    falls das Hinzufügen von Kanten von | ||||||
|  |    *                                          diesem Graphen nicht unterstützt wird | ||||||
|  |    */ | ||||||
|  |   void connectNodes(V from, A weight, V to); | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Entfernt die bestehende Kante zwischen zwei Knoten. | ||||||
|  |    * | ||||||
|  |    * @param from der Knoten, von dem die zu löschende Kante ausgeht | ||||||
|  |    * @param to   der Knoten, auf den die zu löschende Kante zeigt | ||||||
|  |    * @throws NullPointerException             falls für einen der beiden Knoten | ||||||
|  |    *                                          {@code null} als Parameter übergeben wird | ||||||
|  |    * @throws java.util.NoSuchElementException falls einer der beiden Knoten | ||||||
|  |    *                                          nicht in diesem Graphen existiert oder falls keine Kante vom | ||||||
|  |    *                                          ersten zum zweiten Knoten existiert | ||||||
|  |    * @throws UnsupportedOperationException    falls das Entfernen von Kanten von | ||||||
|  |    *                                          diesem Graphen nicht unterstützt wird | ||||||
|  |    */ | ||||||
|  |   void disconnectNodes(V from, V to); | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								src/main/java/h07/graph/DirectedGraphFactory.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/main/java/h07/graph/DirectedGraphFactory.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | ||||||
|  | package h07.graph; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Eine abstrakte Fabrik zum Erzeugen von {@link DirectedGraph}-Objekten. | ||||||
|  |  * | ||||||
|  |  * @param <V> der Typ der Knoten dieses Graphen | ||||||
|  |  * @param <A> der Typ der Kantengewichte dieses Graphen | ||||||
|  |  */ | ||||||
|  | public interface DirectedGraphFactory<V, A> { | ||||||
|  |   /** | ||||||
|  |    * Erzeugt einen {@link DirectedGraph}. | ||||||
|  |    * | ||||||
|  |    * @return der {@code DirectedGraph}, der von dieses Fabrik erzeugt wird. | ||||||
|  |    */ | ||||||
|  |   DirectedGraph<V, A> createDirectedGraph(); | ||||||
|  | } | ||||||
							
								
								
									
										138
									
								
								src/main/java/h07/graph/Path.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								src/main/java/h07/graph/Path.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,138 @@ | ||||||
|  | package h07.graph; | ||||||
|  | 
 | ||||||
|  | import java.util.Objects; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Repräsentiert einen gewichteten Pfad als Teilmenge eines endlichen | ||||||
|  |  * gerichteten Graphs. | ||||||
|  |  * | ||||||
|  |  * @param <V> der Typ der Knoten dieses Pfades | ||||||
|  |  * @param <A> der Typ der Kantengewichte dieses Pfades | ||||||
|  |  */ | ||||||
|  | public interface Path<V, A> extends Iterable<V> { | ||||||
|  |   /** | ||||||
|  |    * Dieses Interface ermöglicht das Traversieren eines gerichteten Pfades. | ||||||
|  |    * Dabei läuft der {@code Traverser} von Knoten zu Knoten unter | ||||||
|  |    * Berücksichtigung der Gewichte der Kanten zwischen den Knoten. | ||||||
|  |    * Den Knoten, auf dem sich ein {@code Traverser} zu einem gegebenen | ||||||
|  |    * Zeitpunkt befindet, nennen wir den <em>aktuell betrachteten Knoten</em>. | ||||||
|  |    * | ||||||
|  |    * @param <V> der Typ der Knoten, über die dieser {@code Traverser} läuft | ||||||
|  |    * @param <A> der Typ der Gewichte der Kanten, die zwischen den einzelnen | ||||||
|  |    *            Knoten liegen | ||||||
|  |    */ | ||||||
|  |   interface Traverser<V, A> { | ||||||
|  |     /** | ||||||
|  |      * Liefert den von diesem {@code Traverser} aktuell betrachteten Knoten. | ||||||
|  |      * | ||||||
|  |      * @return der aktuell betrachtete Knoten | ||||||
|  |      */ | ||||||
|  |     V getCurrentNode(); | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Liefert das Gewicht der Kante vom aktuell betrachteten Knoten zu | ||||||
|  |      * seinem Nachfolgeknoten. | ||||||
|  |      * | ||||||
|  |      * @return die Distanz zum nächsten Knoten. | ||||||
|  |      * @throws IllegalStateException falls es sich beim aktuell betrachteten | ||||||
|  |      *                               Knoten um den letzten Knoten im Pfad dieses | ||||||
|  |      *                               {@code Traverser}s handelt | ||||||
|  |      */ | ||||||
|  |     A getDistanceToNextNode(); | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @throws java.util.NoSuchElementException falls es sich beim aktuell | ||||||
|  |      *                                          betrachteten Knoten um den letzten Knoten im Pfad dieses | ||||||
|  |      *                                          {@code Traverser}s handelt. | ||||||
|  |      */ | ||||||
|  |     void walkToNextNode(); | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Zeigt an, ob der aktuell betrachtete Knoten einen Nachfolgeknoten | ||||||
|  |      * besitzt. | ||||||
|  |      * | ||||||
|  |      * @return {@code true} genau dann, wenn es sich beim aktuell | ||||||
|  |      * betrachteten Knoten nicht um den letzten Knoten im Pfad | ||||||
|  |      * dieses {@code Traverser}s handelt | ||||||
|  |      */ | ||||||
|  |     boolean hasNextNode(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Liefert einen {@link Traverser}, mit dem sich dieser Pfad traversieren | ||||||
|  |    * lässt. | ||||||
|  |    * Beim aktuell betrachteten Knoten des {@code Traverser}s handelt es sich | ||||||
|  |    * zunächst um den ersten Knoten in diesem Pfad. | ||||||
|  |    * | ||||||
|  |    * @return ein {@code Traverser} für diesen Pfad | ||||||
|  |    */ | ||||||
|  |   Traverser<V, A> traverser(); | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Erzeugt einen neuen Pfad aus den Knoten und Kanten dieses Pfades und | ||||||
|  |    * einem weiteren Knoten. | ||||||
|  |    * Dieser wird durch eine neue Kante an den letzten Knoten dieses Pfades | ||||||
|  |    * angehängt. | ||||||
|  |    * Dieser Pfad wird durch diese Methode jedoch nicht verändert. | ||||||
|  |    * | ||||||
|  |    * @param node     der Knoten, der im neuen Pfad an den letzten Knoten | ||||||
|  |    *                 dieses Pfades angehängt werden soll | ||||||
|  |    * @param distance das Gewicht der neuen Kante, mit der der neue Knoten mit | ||||||
|  |    *                 dem letzten Knoten dieses Pfades verbunden werden soll | ||||||
|  |    * @return eine Kopie dieses Pfades mit einem zusätzlichen Knoten | ||||||
|  |    * @throws NullPointerException falls der neue Knoten oder das Gewicht der | ||||||
|  |    *                              neuen Kante {@code null} ist | ||||||
|  |    */ | ||||||
|  |   Path<V, A> concat(V node, A distance); | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Erzeugt einen gewichteten Pfad mit einem Knoten. | ||||||
|  |    * | ||||||
|  |    * @param v1  der erste Knoten im Pfad | ||||||
|  |    * @param <V> der Typ der Knoten des erzeugten Pfades | ||||||
|  |    * @param <A> der Typ der Kantengewichte erzeugten Pfades | ||||||
|  |    * @return ein Pfad mit dem übergebenen Knoten | ||||||
|  |    * @throws NullPointerException falls der Knoten {@code null} ist | ||||||
|  |    */ | ||||||
|  |   static <V, A> Path<V, A> of(V v1) { | ||||||
|  |     throw new UnsupportedOperationException("Noch nicht implementiert."); | ||||||
|  |     /* | ||||||
|  |     Objects.requireNonNull(v1, "Der Knoten eines Pfades darf nicht null sein"); | ||||||
|  |     return new PathImpl<>(v1); | ||||||
|  |     */ | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Erzeugt einen gewichteten Pfad mit zwei Knoten. | ||||||
|  |    * | ||||||
|  |    * @param v1  der erste Knoten im Pfad | ||||||
|  |    * @param w1  das Gewicht der Kante vom ersten zum zweiten Knoten | ||||||
|  |    * @param v2  der zweite Knoten im Pfad | ||||||
|  |    * @param <V> der Typ der Knoten des erzeugten Pfades | ||||||
|  |    * @param <A> der Typ der Kantengewichte erzeugten Pfades | ||||||
|  |    * @return ein Pfad mit den übergebenen Knoten und Kantengewichten | ||||||
|  |    * @throws NullPointerException falls einer der Knoten oder eines der | ||||||
|  |    *                              Kantengewichte {@code null} ist | ||||||
|  |    */ | ||||||
|  |   static <V, A> Path<V, A> of(V v1, A w1, V v2) { | ||||||
|  |     return Path.<V, A>of(v1).concat(v2, w1); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Erzeugt einen gewichteten Pfad mit drei Knoten. | ||||||
|  |    * | ||||||
|  |    * @param v1  der erste Knoten im Pfad | ||||||
|  |    * @param w1  das Gewicht der Kante vom ersten zum zweiten Knoten | ||||||
|  |    * @param v2  der zweite Knoten im Pfad | ||||||
|  |    * @param w2  das Gewicht der Kante vom zweiten zum dritten Knoten | ||||||
|  |    * @param v3  der dritte Knoten im Pfad | ||||||
|  |    * @param <V> der Typ der Knoten des erzeugten Pfades | ||||||
|  |    * @param <A> der Typ der Kantengewichte erzeugten Pfades | ||||||
|  |    * @return ein Pfad mit den übergebenen Knoten und Kantengewichten | ||||||
|  |    * @throws NullPointerException falls einer der Knoten oder eines der | ||||||
|  |    *                              Kantengewichte {@code null} ist | ||||||
|  |    */ | ||||||
|  |   static <V, A> Path<V, A> of(V v1, A w1, V v2, A w2, V v3) { | ||||||
|  |     return Path.of(v1, w1, v2).concat(v3, w2); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								src/test/java/h07/ExampleJUnitTest.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/test/java/h07/ExampleJUnitTest.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | ||||||
|  | package h07; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import static org.junit.jupiter.api.Assertions.*; | ||||||
|  | 
 | ||||||
|  | public class ExampleJUnitTest { | ||||||
|  | 
 | ||||||
|  |   @Test | ||||||
|  |   public void testAddition() { | ||||||
|  |     assertEquals(2, 1 + 1); | ||||||
|  |   } | ||||||
|  | } | ||||||
		Reference in a new issue
	
	 Alexander Staeding
						Alexander Staeding