feat: add day 2 2024
This commit is contained in:
		
							parent
							
								
									b1e4c4d634
								
							
						
					
					
						commit
						2274eca981
					
				
							
								
								
									
										6
									
								
								aoc2024/day02/example.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								aoc2024/day02/example.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
7 6 4 2 1
 | 
			
		||||
1 2 7 8 9
 | 
			
		||||
9 7 6 2 1
 | 
			
		||||
1 3 2 4 5
 | 
			
		||||
8 6 4 4 1
 | 
			
		||||
1 3 6 7 9
 | 
			
		||||
							
								
								
									
										1000
									
								
								aoc2024/day02/input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1000
									
								
								aoc2024/day02/input.txt
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										88
									
								
								aoc2024/day02/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								aoc2024/day02/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,88 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	_ "embed"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	aoc "go.sour.is/advent-of-code"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// var log = aoc.Log
 | 
			
		||||
 | 
			
		||||
func main() { aoc.MustResult(aoc.Runner(run)) }
 | 
			
		||||
 | 
			
		||||
type result struct {
 | 
			
		||||
	valuePT1 int
 | 
			
		||||
	valuePT2 int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r result) String() string { return fmt.Sprintf("%#v", r) }
 | 
			
		||||
 | 
			
		||||
func run(scan *bufio.Scanner) (*result, error) {
 | 
			
		||||
 | 
			
		||||
	sum := 0
 | 
			
		||||
	sum2 := 0
 | 
			
		||||
 | 
			
		||||
	for scan.Scan() {
 | 
			
		||||
		txt := scan.Text()
 | 
			
		||||
		row := aoc.ReadStringToInts(strings.Fields(txt))
 | 
			
		||||
 | 
			
		||||
		good, bad := testSafety(row)
 | 
			
		||||
		if good {
 | 
			
		||||
			sum++
 | 
			
		||||
			sum2++
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for i := max(0, bad-1); i < min(bad+2, len(row)); i++ {
 | 
			
		||||
			arr := cut(i, row)
 | 
			
		||||
 | 
			
		||||
			good, _ := testSafety(arr)
 | 
			
		||||
			if good {
 | 
			
		||||
				sum2++
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &result{valuePT1: sum, valuePT2: sum2}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testSafety(row []int) (bool, int) {
 | 
			
		||||
	good := true
 | 
			
		||||
	bad := -1
 | 
			
		||||
	increasing := false
 | 
			
		||||
	decreasing := false
 | 
			
		||||
 | 
			
		||||
	for i, v := range row[1:] {
 | 
			
		||||
		if v > row[i] {
 | 
			
		||||
			increasing = true
 | 
			
		||||
		}
 | 
			
		||||
		if v < row[i] {
 | 
			
		||||
			decreasing = true
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if difference := aoc.ABS(v - row[i]); difference < 1 || difference > 3 {
 | 
			
		||||
			good = false
 | 
			
		||||
			bad = i
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if increasing && decreasing {
 | 
			
		||||
			good = false
 | 
			
		||||
			bad = i
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return good, bad
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func cut(i int, values []int) []int {
 | 
			
		||||
	arr := make([]int, 0, len(values))
 | 
			
		||||
	arr = append(arr, values[:i]...)
 | 
			
		||||
	arr = append(arr, values[i+1:]...)
 | 
			
		||||
	return arr
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								aoc2024/day02/main_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								aoc2024/day02/main_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,43 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	_ "embed"
 | 
			
		||||
 | 
			
		||||
	"github.com/matryer/is"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//go:embed example.txt
 | 
			
		||||
var example []byte
 | 
			
		||||
 | 
			
		||||
//go:embed input.txt
 | 
			
		||||
var input []byte
 | 
			
		||||
 | 
			
		||||
func TestExample(t *testing.T) {
 | 
			
		||||
	is := is.New(t)
 | 
			
		||||
	scan := bufio.NewScanner(bytes.NewReader(example))
 | 
			
		||||
 | 
			
		||||
	result, err := run(scan)
 | 
			
		||||
	is.NoErr(err)
 | 
			
		||||
 | 
			
		||||
	t.Log(result)
 | 
			
		||||
	is.Equal(result.valuePT1, 2)
 | 
			
		||||
	is.Equal(result.valuePT2, 4)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSolution(t *testing.T) {
 | 
			
		||||
	is := is.New(t)
 | 
			
		||||
	scan := bufio.NewScanner(bytes.NewReader(input))
 | 
			
		||||
 | 
			
		||||
	result, err := run(scan)
 | 
			
		||||
	is.NoErr(err)
 | 
			
		||||
 | 
			
		||||
	t.Log(result)
 | 
			
		||||
	is.Equal(result.valuePT1, 486)
 | 
			
		||||
	is.True(result.valuePT2 > 517)
 | 
			
		||||
	is.True(result.valuePT2 > 523)
 | 
			
		||||
	is.Equal(result.valuePT2, 540)
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user