Day 2: Gift Shop

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL

FAQ

  • reboot6675@sopuli.xyz
    link
    fedilink
    arrow-up
    2
    ·
    3 days ago

    First I tried to to part 2 with a very poor regex strategy and the performance was abysmal. Switched to plain substrings and boom, instant result.

    Golang

    func part1() {
    	ranges := readInput()
    	invalidSum := 0
    
    	for _, r := range ranges {
    		parts := strings.Split(r, "-")
    		start, _ := strconv.Atoi(parts[0])
    		end, _ := strconv.Atoi(parts[1])
    
    		for num := start; num <= end; num++ {
    			current := strconv.Itoa(num)
    			n := len(current)
    			if n%2 != 0 {
    				continue
    			}
    			left := current[:n/2]
    			right := current[n/2:]
    			if left == right {
    				invalidSum += num
    			}
    		}
    	}
    
    	fmt.Println(invalidSum)
    }
    
    func part2() {
    	ranges := readInput()
    	invalidSum := 0
    
    	for _, r := range ranges {
    		parts := strings.Split(r, "-")
    		start, _ := strconv.Atoi(parts[0])
    		end, _ := strconv.Atoi(parts[1])
    
    		for num := start; num <= end; num++ {
    			current := strconv.Itoa(num)
    			n := len(current)
    
    			for index := 1; index <= n/2; index++ {
    				if n%index != 0 {
    					continue
    				}
    
    				left := 0
    				right := index
    				prefix := current[left:right]
    				isRepeated := true
    				for left < n && right < n {
    					left = right
    					right = right + index
    					next := current[left:right]
    					if next != prefix {
    						isRepeated = false
    						break
    					}
    				}
    
    				if isRepeated {
    					invalidSum += num
    					break
    				}
    			}
    		}
    	}
    
    	fmt.Println(invalidSum)
    }