This commit is contained in:
gutmet 2021-06-10 21:27:25 +02:00
commit b77c6a8dce
8 changed files with 301 additions and 0 deletions

30
Makefile Normal file
View File

@ -0,0 +1,30 @@
SRC = $(wildcard *.dot)
FMT = jpg
OBJ = ${SRC:.dot=.${FMT}}
VID = search.mp4
all: search recurse movie
clean:
rm -f *.${FMT}
rm -f step*.dot
rm -f ${VID}
graphs: ${OBJ}
recurse:
@echo "Generating .${FMT}s..."
@$(MAKE) graphs
@echo "...done."
search:
@echo "Searching path..."
@go run hamilton.go || echo "Found nothing."
movie:
@ffmpeg -y -f image2 -r 2/1 -i step%07d.jpg -c:v libx264 -s "1920x1080" ${VID}
%.${FMT}: %.dot
@neato $< -T${FMT} -o $@
.PHONY: all clean search graphs recurse movie

8
Readme Normal file
View File

@ -0,0 +1,8 @@
Beispielcode für das Rätsel in Rezos Video ( https://youtu.be/MVajSA0Itq4?t=240 )
Was ihr braucht, um das Programm auszuführen und das Rätsel zu durchlaufen:
- make
- Go
- Graphviz
- ffmpeg

26
grid0.dot Normal file
View File

@ -0,0 +1,26 @@
graph grid
{
dpi=300;
layout=dot
labelloc = "c"
node [label="",shape=circle, style=filled, color=chartreuse4]
// arbitrary path on rigid grid
edge [weight=1000 color=dimgrey minlen=2.0 len=2.0]
// uncomment to hide the grid
edge [style=invis]
A0 -- A1 -- A2 -- A3 -- A4
B0 -- B1 -- B2 -- B3 -- B4
C0 -- C1 -- C2 -- C3 -- C4
D0 -- D1 -- D2 -- D3 -- D4
E0 -- E1 -- E2 -- E3 -- E4
rank=same {A0 -- B0 -- C0 -- D0 -- E0}
rank=same {A1 -- B1 -- C1 -- D1 -- E1}
rank=same {A2 -- B2 -- C2 -- D2 -- E2}
rank=same {A3 -- B3 -- C3 -- D3 -- E3}
rank=same {A4 -- B4 -- C4 -- D4 -- E4}
A0,A1,B0,B1,C1,D1,D2 [color=crimson]
}

26
grid1.dot Normal file
View File

@ -0,0 +1,26 @@
graph grid
{
dpi=300;
layout=dot
labelloc = "c"
node [label="",shape=circle, style=filled, color=chartreuse4]
// arbitrary path on rigid grid
edge [weight=1000 color=dimgrey minlen=2.0 len=2.0]
// uncomment to hide the grid
//edge [style=invis]
A0 -- A1 -- A2 -- A3 -- A4
B0 -- B1 -- B2 -- B3 -- B4
C0 -- C1 -- C2 -- C3 -- C4
D0 -- D1 -- D2 -- D3 -- D4
E0 -- E1 -- E2 -- E3 -- E4
rank=same {A0 -- B0 -- C0 -- D0 -- E0}
rank=same {A1 -- B1 -- C1 -- D1 -- E1}
rank=same {A2 -- B2 -- C2 -- D2 -- E2}
rank=same {A3 -- B3 -- C3 -- D3 -- E3}
rank=same {A4 -- B4 -- C4 -- D4 -- E4}
A0,A1,B0,B1,C1,D1,D2 [color=crimson]
}

26
grid2.dot Normal file
View File

@ -0,0 +1,26 @@
graph grid
{
dpi=300;
layout=dot
labelloc = "c"
node [label="",shape=circle, style=filled, color=chartreuse4]
// arbitrary path on rigid grid
edge [weight=1000 color=dimgrey minlen=2.0 len=2.0]
// uncomment to hide the grid
//edge [style=invis]
A2 -- A3 -- A4
B2 -- B3 -- B4
C2 -- C3 -- C4
D3 -- D4
E0 -- E1 -- E2 -- E3 -- E4
rank=same {C0 -- D0 -- E0}
rank=same {E1}
rank=same {A2 -- B2 -- C2}
rank=same {A3 -- B3 -- C3 -- D3 -- E3}
rank=same {A4 -- B4 -- C4 -- D4 -- E4}
//A0,A1,B0,B1,C1,D1,D2 [color=crimson]
}

43
grid3.dot Normal file
View File

@ -0,0 +1,43 @@
graph grid
{
dpi=300;
layout=dot
labelloc = "c"
node [label="",shape=circle, style=filled, color=chartreuse4]
// arbitrary path on rigid grid
edge [weight=1000 color=dimgrey minlen=2.0 len=2.0]
// uncomment to hide the grid
//edge [style=invis]
A2 -- A3 -- A4
B2 -- B3 -- B4
C2 -- C3 -- C4
D3 -- D4
E0 -- E1 -- E2 -- E3 -- E4
rank=same {C0 -- D0 -- E0}
rank=same {E1}
rank=same {A2 -- B2 -- C2}
rank=same {A3 -- B3 -- C3 -- D3 -- E3}
rank=same {A4 -- B4 -- C4 -- D4 -- E4}
C0 [xlabel="0"]
D0 [xlabel="1"]
E0 [xlabel="2"]
E1 [xlabel="3"]
E2 [xlabel="4"]
E3 [xlabel="5"]
E4 [xlabel="6"]
D4 [xlabel="7"]
C4 [xlabel="8"]
B4 [xlabel="9"]
A4 [xlabel="10"]
A3 [xlabel="11"]
B3 [xlabel="12"]
C3 [xlabel="13"]
D3 [xlabel="14"]
A2 [xlabel="15"]
B2 [xlabel="16"]
C2 [xlabel="17"]
}

50
grid4.dot Normal file
View File

@ -0,0 +1,50 @@
digraph {
dpi=200
node [shape=circle, style=filled]
0 -> 1
1 -> 0
1 -> 2
2 -> 1
2 -> 3
3 -> 2
3 -> 4
4 -> 3
4 -> 5
5 -> 4
5 -> 6
5 -> 14
6 -> 5
6 -> 7
7 -> 6
7 -> 8
7 -> 14
8 -> 7
8 -> 9
8 -> 13
9 -> 8
9 -> 10
9 -> 12
10 -> 9
10 -> 11
11 -> 10
11 -> 12
11 -> 15
12 -> 9
12 -> 11
12 -> 13
12 -> 16
13 -> 8
13 -> 12
13 -> 14
13 -> 17
14 -> 5
14 -> 7
14 -> 13
15 -> 11
15 -> 16
16 -> 12
16 -> 15
16 -> 17
17 -> 13
17 -> 16
}

92
hamilton.go Normal file
View File

@ -0,0 +1,92 @@
package main
import (
"fmt"
"os"
)
var g [][]int = [][]int{
[]int{1},
[]int{0, 2},
[]int{1, 3},
[]int{2, 4},
[]int{3, 5},
[]int{4, 6, 14},
[]int{5, 7},
[]int{6, 8, 14},
[]int{7, 9, 13},
[]int{8, 10, 12},
[]int{9, 11},
[]int{10, 12, 15},
[]int{9, 11, 13, 16},
[]int{8, 12, 14, 17},
[]int{5, 7, 13},
[]int{11, 16},
[]int{12, 15, 17},
[]int{13, 16},
}
var step int
func writeGraphfile(g [][]int, path []int) {
filename := fmt.Sprintf("step%07d.dot", step)
f, _ := os.Create(filename)
step++
fmt.Fprintln(f, "digraph {")
fmt.Fprintln(f, "dpi=200")
fmt.Fprintln(f, "node [shape=circle, style=filled, label=\"\"]")
for v1, adjlist := range g {
for _, v2 := range adjlist {
fmt.Fprintln(f, v1, " -> ", v2)
}
}
for i, _ := range g {
fmt.Fprintln(f, i, "[xlabel=x]")
}
for i, v := range path {
fmt.Fprintln(f, v, "[xlabel=", i, "]")
fillcolor := "red"
if i == 0 {
fillcolor = "blue"
} else if i == len(path)-1 {
fillcolor = "yellow"
}
fmt.Fprintln(f, v, "[fillcolor=", fillcolor, "]")
}
fmt.Fprintln(f, "}")
}
func contains(path []int, v int) bool {
for _, w := range path {
if w == v {
return true
}
}
return false
}
func DFS(g [][]int, path []int) {
deadend := true
for _, v2 := range g[path[len(path)-1]] {
if contains(path, v2) {
continue
}
deadend = false
path2 := append(path, v2)
DFS(g, path2)
}
if len(path) == len(g) {
fmt.Println("Found path: ", path)
writeGraphfile(g, path)
os.Exit(0)
} else if deadend {
writeGraphfile(g, path)
}
}
func main() {
step = 0
writeGraphfile(g, []int{})
DFS(g, []int{0})
os.Exit(-1)
}