Init
This commit is contained in:
commit
b77c6a8dce
30
Makefile
Normal file
30
Makefile
Normal 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
8
Readme
Normal 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
26
grid0.dot
Normal 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
26
grid1.dot
Normal 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
26
grid2.dot
Normal 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
43
grid3.dot
Normal 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
50
grid4.dot
Normal 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
92
hamilton.go
Normal 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)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user