code.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "os"
  7. "strings"
  8. )
  9. func readInput(file *os.File) map[string][]string {
  10. scanner := bufio.NewScanner(file)
  11. devices := make(map[string][]string)
  12. for scanner.Scan() {
  13. line := scanner.Text()
  14. if line == "" {
  15. continue
  16. }
  17. parts := strings.Split(line, ": ")
  18. if len(parts) < 2 {
  19. log.Fatalf("Bad input: %s", line)
  20. }
  21. name := parts[0]
  22. connections := strings.Split(parts[1], " ")
  23. devices[name] = connections
  24. }
  25. return devices
  26. }
  27. func part1(entry string, devices map[string][]string) int {
  28. if entry == "out" {
  29. return 1
  30. }
  31. var count int
  32. for _, device := range devices[entry] {
  33. count += part1(device, devices)
  34. }
  35. return count
  36. }
  37. func findPaths(entry string, devices map[string][]string, visited map[string]bool) int {
  38. if entry == "out" {
  39. if visited["dac"] && visited["fft"] {
  40. return 1
  41. }
  42. return 0
  43. }
  44. visited[entry] = true
  45. var count int
  46. for _, device := range devices[entry] {
  47. visited[device] = true
  48. count += findPaths(device, devices, visited)
  49. }
  50. return count
  51. }
  52. func part2(entry string, devices map[string][]string) int {
  53. var count int
  54. for _, device := range devices[entry] {
  55. visited := make(map[string]bool)
  56. visited[device] = true
  57. count += findPaths(device, devices, visited)
  58. }
  59. return count
  60. }
  61. func main() {
  62. if len(os.Args) < 2 {
  63. log.Fatal("You need to specify a file!")
  64. }
  65. filePath := os.Args[1]
  66. file, err := os.Open(filePath)
  67. if err != nil {
  68. log.Fatalf("Failed to open %s!\n", filePath)
  69. }
  70. devices := readInput(file)
  71. fmt.Println("Part1:", part1("you", devices))
  72. fmt.Println("Part2:", part2("svr", devices))
  73. }