4 changed files with 1974 additions and 19 deletions
@ -0,0 +1,111 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"AoC2020/helper" |
||||
"fmt" |
||||
"os" |
||||
"regexp" |
||||
"strconv" |
||||
"strings" |
||||
) |
||||
|
||||
var lineBreak = "\n" |
||||
|
||||
type tile struct { |
||||
neighbourID [4]int |
||||
edges [4]string |
||||
} |
||||
|
||||
func main() { |
||||
args := os.Args[1:] |
||||
input, err := helper.GetFile(args[0]) |
||||
if err != nil { |
||||
fmt.Println(err) |
||||
} |
||||
tileInput := strings.Split(input, lineBreak+lineBreak) |
||||
fmt.Println(len(tileInput)) |
||||
tiles := getTiles(tileInput) |
||||
corners := findCorners(tiles) |
||||
fmt.Println(corners) |
||||
product := corners[0] |
||||
for _,val := range corners[1:]{ |
||||
product *= val |
||||
} |
||||
fmt.Println(product) |
||||
} |
||||
|
||||
func getTiles(input []string) map[int][4]string{ |
||||
var tiles = make(map[int][4]string) |
||||
for _, val := range input { |
||||
id, edges := getTile(val) |
||||
fmt.Printf("ID:%v \n",id ) |
||||
tiles[id] = edges |
||||
} |
||||
return tiles |
||||
} |
||||
|
||||
func getTile(input string) (int, [4]string) { |
||||
tilesRow := strings.Split(input, lineBreak) |
||||
var edges [4]string |
||||
edges[0] = tilesRow[1] |
||||
edges[2] = tilesRow[len(tilesRow)-1] |
||||
for _, val := range tilesRow[1:] { |
||||
edges[3] = edges[3]+val[0:1] |
||||
edges[1] = edges[1]+val[len(val)-1:] |
||||
} |
||||
r, _ := regexp.Compile("[0-9]{4}") |
||||
number, _ := strconv.Atoi(r.FindString(tilesRow[0])) |
||||
return number, edges |
||||
} |
||||
|
||||
func getAllEdges(tiles map[int][4]string, id int) []string{ |
||||
var edges []string |
||||
for key,val := range tiles { |
||||
if key != id { |
||||
for _, edge := range val { |
||||
edges = append(edges, edge) |
||||
edges = append(edges, reverse(edge)) |
||||
} |
||||
} |
||||
} |
||||
return edges |
||||
} |
||||
|
||||
func findCorners(tiles map[int][4]string) []int{ |
||||
var cornerIds []int |
||||
for key,val := range tiles{ |
||||
edgesOfOtherTiles := getAllEdges(tiles,key) |
||||
fmt.Printf("ID: %v, MatchingEdges: %v \n",key,countMatchingEges(edgesOfOtherTiles,val)) |
||||
if countMatchingEges(edgesOfOtherTiles,val) <= 2{ |
||||
cornerIds= append(cornerIds,key) |
||||
} |
||||
} |
||||
return cornerIds |
||||
} |
||||
|
||||
func countMatchingEges(allEdges []string, tileEdges [4]string) int{ |
||||
count := 0 |
||||
for _, val := range tileEdges{ |
||||
if hasMatchingEdge(allEdges,val){ |
||||
count ++ |
||||
} |
||||
} |
||||
return count |
||||
} |
||||
|
||||
func hasMatchingEdge(edges []string, edge string) bool { |
||||
for _, val := range edges { |
||||
if val == edge{ |
||||
return true |
||||
} |
||||
} |
||||
return false |
||||
} |
||||
|
||||
func reverse(s string) string { |
||||
runes := []rune(s) |
||||
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 { |
||||
runes[i], runes[j] = runes[j], runes[i] |
||||
} |
||||
return string(runes) |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,107 @@ |
||||
Tile 2311: |
||||
..##.#..#. |
||||
##..#..... |
||||
#...##..#. |
||||
####.#...# |
||||
##.##.###. |
||||
##...#.### |
||||
.#.#.#..## |
||||
..#....#.. |
||||
###...#.#. |
||||
..###..### |
||||
|
||||
Tile 1951: |
||||
#.##...##. |
||||
#.####...# |
||||
.....#..## |
||||
#...###### |
||||
.##.#....# |
||||
.###.##### |
||||
###.##.##. |
||||
.###....#. |
||||
..#.#..#.# |
||||
#...##.#.. |
||||
|
||||
Tile 1171: |
||||
####...##. |
||||
#..##.#..# |
||||
##.#..#.#. |
||||
.###.####. |
||||
..###.#### |
||||
.##....##. |
||||
.#...####. |
||||
#.##.####. |
||||
####..#... |
||||
.....##... |
||||
|
||||
Tile 1427: |
||||
###.##.#.. |
||||
.#..#.##.. |
||||
.#.##.#..# |
||||
#.#.#.##.# |
||||
....#...## |
||||
...##..##. |
||||
...#.##### |
||||
.#.####.#. |
||||
..#..###.# |
||||
..##.#..#. |
||||
|
||||
Tile 1489: |
||||
##.#.#.... |
||||
..##...#.. |
||||
.##..##... |
||||
..#...#... |
||||
#####...#. |
||||
#..#.#.#.# |
||||
...#.#.#.. |
||||
##.#...##. |
||||
..##.##.## |
||||
###.##.#.. |
||||
|
||||
Tile 2473: |
||||
#....####. |
||||
#..#.##... |
||||
#.##..#... |
||||
######.#.# |
||||
.#...#.#.# |
||||
.######### |
||||
.###.#..#. |
||||
########.# |
||||
##...##.#. |
||||
..###.#.#. |
||||
|
||||
Tile 2971: |
||||
..#.#....# |
||||
#...###... |
||||
#.#.###... |
||||
##.##..#.. |
||||
.#####..## |
||||
.#..####.# |
||||
#..#.#..#. |
||||
..####.### |
||||
..#.#.###. |
||||
...#.#.#.# |
||||
|
||||
Tile 2729: |
||||
...#.#.#.# |
||||
####.#.... |
||||
..#.#..... |
||||
....#..#.# |
||||
.##..##.#. |
||||
.#.####... |
||||
####.#.#.. |
||||
##.####... |
||||
##..#.##.. |
||||
#.##...##. |
||||
|
||||
Tile 3079: |
||||
#.#.#####. |
||||
.#..###### |
||||
..#....... |
||||
######.... |
||||
####.#..#. |
||||
.#...#.##. |
||||
#.#####.## |
||||
..#.###... |
||||
..#....... |
||||
..#.###... |
Loading…
Reference in new issue