package main import ( "flag" "fmt" "strings" "github.com/alexchao26/advent-of-code-go/mathutil" "github.com/alexchao26/advent-of-code-go/util" ) func main() { var part int flag.IntVar(&part, "part", 1, "part 1 or 2") flag.Parse() fmt.Println("Running part", part) if part == 1 { ans := part1(util.ReadFile("./input.txt"), 256) fmt.Println("Output:", ans) } else { ans := part2(util.ReadFile("./input.txt")) fmt.Println("Output:", ans) } } func part1(input string, listLength int) int { lengths := parseInput(input) nums := make([]int, listLength) for i := range nums { nums[i] = i } var position, skipSize int for _, length := range lengths { if length > 0 { nums = reverse(nums, position, position+length-1) } position += skipSize + length position %= len(nums) skipSize++ } return nums[0] * nums[1] } func part2(input string) string { lengths := parseInputASCII(input) nums := make([]int, 256) for i := range nums { nums[i] = i } var position, skipSize int for round := 0; round < 64; round++ { for _, length := range lengths { if length > 0 { nums = reverse(nums, position, position+length-1) } position += skipSize + length position %= len(nums) skipSize++ } } var denseHash []int for i := 0; i < 16; i++ { var xord int for j := i * 16; j < (i+1)*16; j++ { xord ^= nums[j] } denseHash = append(denseHash, xord) } var hexdHash string for _, dense := range denseHash { // use %x to get hexadecimal version & 02 ensures leading 0 if needed hexdHash += fmt.Sprintf("%02x", dense) } return hexdHash } func reverse(nums []int, left, right int) []int { right %= len(nums) if right < left { right += len(nums) } for left < right { leftModded := left % len(nums) rightModded := right % len(nums) nums[leftModded], nums[rightModded] = nums[rightModded], nums[leftModded] left++ right-- } return nums } func parseInput(input string) (ans []int) { nums := strings.Split(input, ",") for _, num := range nums { ans = append(ans, mathutil.StrToInt(num)) } return ans } func parseInputASCII(input string) (ans []int) { for _, char := range input { ans = append(ans, int(char)) } // add default lengths to end ans = append(ans, 17, 31, 73, 47, 23) return ans }