add day 1 and 2 solutions
						commit
						a1b380717c
					
				| @ -0,0 +1,2 @@ | ||||
| target/ | ||||
| input | ||||
| @ -0,0 +1,7 @@ | ||||
| # This file is automatically @generated by Cargo. | ||||
| # It is not intended for manual editing. | ||||
| version = 3 | ||||
| 
 | ||||
| [[package]] | ||||
| name = "day01" | ||||
| version = "0.1.0" | ||||
| @ -0,0 +1,8 @@ | ||||
| [package] | ||||
| name = "day01" | ||||
| version = "0.1.0" | ||||
| edition = "2021" | ||||
| 
 | ||||
| # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||||
| 
 | ||||
| [dependencies] | ||||
| @ -0,0 +1,30 @@ | ||||
| use std::io::{self, BufRead}; | ||||
| 
 | ||||
| fn main() { | ||||
|     let nums: Vec<u64> = io::stdin() | ||||
|         .lock() | ||||
|         .lines() | ||||
|         .map(|line| line.unwrap().parse::<u64>().unwrap()) | ||||
|         .collect(); | ||||
| 
 | ||||
|     let p1: u64 = nums.iter().map(|&num| mass_to_fuel(num)).sum(); | ||||
|     let p2: u64 = nums.iter().map(|&num| fuel_for_fuel(num)).sum(); | ||||
| 
 | ||||
|     println!("P1: {}, P2: {}", p1, p2); | ||||
| } | ||||
| 
 | ||||
| fn mass_to_fuel(mass: u64) -> u64 { | ||||
|     (mass / 3).saturating_sub(2) | ||||
| } | ||||
| 
 | ||||
| fn fuel_for_fuel(fuel: u64) -> u64 { | ||||
|     let mut tot = 0; | ||||
|     let mut fuel = fuel; | ||||
| 
 | ||||
|     while fuel > 0 { | ||||
|         fuel = mass_to_fuel(fuel); | ||||
|         tot += fuel; | ||||
|     } | ||||
| 
 | ||||
|     tot | ||||
| } | ||||
| @ -0,0 +1,36 @@ | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"intcode/internal/interpreter" | ||||
| 	"intcode/internal/parser" | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	sourceProgram, err := parser.ParseFile(nil) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 
 | ||||
| 	runProgram := make([]int, len(sourceProgram)) | ||||
| 
 | ||||
| 	for x := 0; x < 100; x++ { | ||||
| 		for y := 0; y < 100; y++ { | ||||
| 			copy(runProgram, sourceProgram) | ||||
| 
 | ||||
|             runProgram[1], runProgram[2] = x, y | ||||
| 
 | ||||
| 			interpreter := interpreter.Init(runProgram) | ||||
| 
 | ||||
| 			for !interpreter.Next() {} | ||||
| 
 | ||||
|             if x == 12 && y == 2 { | ||||
|                 fmt.Printf("Part 1: %v\n", runProgram[0]) | ||||
|             } | ||||
| 			if runProgram[0] == 19690720 { | ||||
|                 fmt.Printf("Part 2: %02d%02d\n", x, y) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,3 @@ | ||||
| module intcode | ||||
| 
 | ||||
| go 1.22.4 | ||||
| @ -0,0 +1 @@ | ||||
| package debugger | ||||
| @ -0,0 +1,61 @@ | ||||
| package interpreter | ||||
| 
 | ||||
| import "fmt" | ||||
| 
 | ||||
| type Interpreter struct { | ||||
| 	program            []int | ||||
| 	instructionPointer int | ||||
| } | ||||
| 
 | ||||
| func Init(program []int) *Interpreter { | ||||
|     return &Interpreter { | ||||
|         program: program, | ||||
|         instructionPointer: 0, | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| func (i *Interpreter) Next() bool { | ||||
| 	opcode := i.getValueAtIndex(i.instructionPointer) | ||||
| 	ipIncrement := 1 | ||||
| 
 | ||||
| 	switch opcode { | ||||
| 	case 1: | ||||
|         i.add() | ||||
|         ipIncrement = 4 | ||||
| 	case 2: | ||||
|         i.mul() | ||||
|         ipIncrement = 4 | ||||
| 	case 99: | ||||
| 		return true | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("unhandled opcode %v at IP %v", opcode, i.instructionPointer)) | ||||
| 	} | ||||
| 
 | ||||
| 	i.instructionPointer += ipIncrement | ||||
| 
 | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| func (i *Interpreter) getValueAtIndex(index int) int { | ||||
|     return i.program[index] | ||||
| } | ||||
| 
 | ||||
| func (i *Interpreter) setValueAtIndex(index, value int) { | ||||
|     i.program[index] = value | ||||
| } | ||||
| 
 | ||||
| func (i *Interpreter) add() { | ||||
|     resIndex := i.getValueAtIndex(i.instructionPointer + 3) | ||||
|     arg1Index := i.getValueAtIndex(i.instructionPointer + 1) | ||||
|     arg2Index := i.getValueAtIndex(i.instructionPointer + 2) | ||||
| 
 | ||||
|     i.setValueAtIndex(resIndex, i.getValueAtIndex(arg1Index) + i.getValueAtIndex(arg2Index)) | ||||
| } | ||||
| 
 | ||||
| func (i *Interpreter) mul() { | ||||
|     resIndex := i.getValueAtIndex(i.instructionPointer + 3) | ||||
|     arg1Index := i.getValueAtIndex(i.instructionPointer + 1) | ||||
|     arg2Index := i.getValueAtIndex(i.instructionPointer + 2) | ||||
| 
 | ||||
|     i.setValueAtIndex(resIndex, i.getValueAtIndex(arg1Index) * i.getValueAtIndex(arg2Index)) | ||||
| } | ||||
| @ -0,0 +1 @@ | ||||
| package interpreter | ||||
| @ -0,0 +1,48 @@ | ||||
| package parser | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| const DefaultFile = "input" | ||||
| 
 | ||||
| func ParseFile(input *string) ([]int, error) { | ||||
| 	if input == nil { | ||||
| 
 | ||||
| 		file := DefaultFile | ||||
| 
 | ||||
| 		if len(os.Args) == 2 { | ||||
| 			file = os.Args[1] | ||||
| 		} | ||||
| 
 | ||||
| 		inputFile, err := os.Open(file) | ||||
| 		if err != nil { | ||||
| 			return nil, fmt.Errorf("could not parse input file: %v", err) | ||||
| 		} | ||||
| 
 | ||||
| 		fileData, err := io.ReadAll(inputFile) | ||||
| 		if err != nil { | ||||
| 			return nil, fmt.Errorf("could not read input file: %v", err) | ||||
| 		} | ||||
| 
 | ||||
| 		fileStr := strings.TrimSpace(string(fileData)) | ||||
| 		input = &fileStr | ||||
| 	} | ||||
| 
 | ||||
| 	strNums := strings.Split(*input, ",") | ||||
| 	opcodes := make([]int, len(strNums)) | ||||
| 
 | ||||
| 	for i, v := range strNums { | ||||
| 		num, err := strconv.Atoi(v) | ||||
| 		if err != nil { | ||||
| 			fmt.Fprintf(os.Stderr, "WARNING: error parsing int from input, substring was %v", v) | ||||
| 		} | ||||
| 		opcodes[i] = num | ||||
| 	} | ||||
| 
 | ||||
| 	return opcodes, nil | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue