|  | @@ -81,6 +81,76 @@ func sum() int64 {
 | 
	
		
			
				|  |  |  	return sum
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +var masks []string
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func permuteMask(index int64, masksSoFar []string) []string {
 | 
	
		
			
				|  |  | +	if index < 0 {
 | 
	
		
			
				|  |  | +		return masksSoFar
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	var newMasks []string
 | 
	
		
			
				|  |  | +	for _, mask := range masksSoFar {
 | 
	
		
			
				|  |  | +		if mask[index] != 'X' {
 | 
	
		
			
				|  |  | +			newMasks = append(newMasks, mask)
 | 
	
		
			
				|  |  | +			continue
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		newMask1 := []byte(mask)
 | 
	
		
			
				|  |  | +		newMask1[index] = '1'
 | 
	
		
			
				|  |  | +		newMasks = append(newMasks, string(newMask1))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		newMask2 := []byte(mask)
 | 
	
		
			
				|  |  | +		newMask2[index] = '0'
 | 
	
		
			
				|  |  | +		newMasks = append(newMasks, string(newMask2))
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return permuteMask(index-1, newMasks)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func processLine2(line string) error {
 | 
	
		
			
				|  |  | +	if strings.Contains(line, "mask") {
 | 
	
		
			
				|  |  | +		var currentMask string
 | 
	
		
			
				|  |  | +		n, err := fmt.Sscanf(line, "mask = %s\n", ¤tMask)
 | 
	
		
			
				|  |  | +		if err != nil || n != 1 {
 | 
	
		
			
				|  |  | +			return fmt.Errorf("Error scanning '%s': %s", line, err)
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		masks = permuteMask(maskMaxIndex, []string{currentMask})
 | 
	
		
			
				|  |  | +		fmt.Println(masks)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return nil
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	var id int64
 | 
	
		
			
				|  |  | +	var number int64
 | 
	
		
			
				|  |  | +	n, err := fmt.Sscanf(line, "mem[%d] = %d", &id, &number)
 | 
	
		
			
				|  |  | +	if err != nil || n != 2 {
 | 
	
		
			
				|  |  | +		return fmt.Errorf("Error scanning '%s': %s", line, err)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	number = setBits(number, mask)
 | 
	
		
			
				|  |  | +	mem[id] = number
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return nil
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func readFile2(file *os.File) {
 | 
	
		
			
				|  |  | +	scanner := bufio.NewScanner(file)
 | 
	
		
			
				|  |  | +	for scanner.Scan() {
 | 
	
		
			
				|  |  | +		line := scanner.Text()
 | 
	
		
			
				|  |  | +		if line == "" {
 | 
	
		
			
				|  |  | +			break
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if err := processLine2(line); err != nil {
 | 
	
		
			
				|  |  | +			log.Fatal(err)
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if err := scanner.Err(); err != nil {
 | 
	
		
			
				|  |  | +		log.Fatalf("Scanner error: %s", err)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  func init() {
 | 
	
		
			
				|  |  |  	mem = make(map[int64]int64)
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -90,16 +160,28 @@ func main() {
 | 
	
		
			
				|  |  |  		log.Fatal("You need to specify a file!")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	file, err := os.Open(os.Args[1])
 | 
	
		
			
				|  |  | +	filePath := os.Args[1]
 | 
	
		
			
				|  |  | +	file, err := os.Open(filePath)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | -		log.Fatalf("Failed to open %s!\n", os.Args[1])
 | 
	
		
			
				|  |  | +		log.Fatalf("Failed to open %s!\n", filePath)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	readFile(file)
 | 
	
		
			
				|  |  | +	fmt.Println("Part1:", sum())
 | 
	
		
			
				|  |  |  	if err := file.Close(); err != nil {
 | 
	
		
			
				|  |  |  		log.Fatalf("Failed to close file: %s", err)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	fmt.Println("Part1:", sum())
 | 
	
		
			
				|  |  | +	file, err = os.Open(filePath)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		log.Fatalf("Failed to open %s!\n", filePath)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	readFile2(file)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if err := file.Close(); err != nil {
 | 
	
		
			
				|  |  | +		log.Fatalf("Failed to close file: %s", err)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  }
 |