mirror of
https://github.com/Findus23/AdventOfCode2019.git
synced 2024-08-27 19:52:12 +02:00
initial commit
This commit is contained in:
commit
e3ecc0429f
13 changed files with 351 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
.mypy_cache/
|
||||
.idea/
|
||||
__pycache__/
|
26
.travis.yml
Normal file
26
.travis.yml
Normal file
|
@ -0,0 +1,26 @@
|
|||
jobs:
|
||||
allow_failures:
|
||||
- rust: nightly
|
||||
include:
|
||||
- language: python
|
||||
python: 3.8
|
||||
before_script:
|
||||
- cd python
|
||||
script:
|
||||
- pytest
|
||||
|
||||
- language: rust
|
||||
rust: stable
|
||||
cache: cargo
|
||||
before_script:
|
||||
- cd rust
|
||||
- language: rust
|
||||
rust: beta
|
||||
cache: cargo
|
||||
before_script:
|
||||
- cd rust
|
||||
- language: rust
|
||||
rust: nightly
|
||||
cache: cargo
|
||||
before_script:
|
||||
- cd rust
|
41
python/1/day1.py
Normal file
41
python/1/day1.py
Normal file
|
@ -0,0 +1,41 @@
|
|||
def calculate_fuel(mass: int) -> int:
|
||||
return mass // 3 - 2
|
||||
|
||||
|
||||
def part1() -> int:
|
||||
total = 0
|
||||
|
||||
with open("1/input.txt") as f:
|
||||
for line in f:
|
||||
m = int(line)
|
||||
fuel = calculate_fuel(m)
|
||||
total += fuel
|
||||
return total
|
||||
|
||||
|
||||
def advanced_fuel(mass: int) -> int:
|
||||
total = 0
|
||||
while True:
|
||||
fuel = calculate_fuel(mass)
|
||||
if fuel > 0:
|
||||
total += fuel
|
||||
mass = fuel
|
||||
else:
|
||||
break
|
||||
return total
|
||||
|
||||
|
||||
def part2() -> int:
|
||||
total = 0
|
||||
|
||||
with open("1/input.txt") as f:
|
||||
for line in f:
|
||||
m = int(line)
|
||||
fuel = advanced_fuel(m)
|
||||
total += fuel
|
||||
return total
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(part1())
|
||||
print(part2())
|
100
python/1/input.txt
Normal file
100
python/1/input.txt
Normal file
|
@ -0,0 +1,100 @@
|
|||
103910
|
||||
133712
|
||||
82560
|
||||
91679
|
||||
98354
|
||||
89007
|
||||
93288
|
||||
132363
|
||||
91373
|
||||
83666
|
||||
55958
|
||||
90387
|
||||
100869
|
||||
98127
|
||||
120197
|
||||
86931
|
||||
60370
|
||||
143999
|
||||
71541
|
||||
115662
|
||||
51287
|
||||
81624
|
||||
58307
|
||||
60408
|
||||
141664
|
||||
89781
|
||||
127772
|
||||
132353
|
||||
101220
|
||||
104001
|
||||
140488
|
||||
58072
|
||||
75764
|
||||
120003
|
||||
82386
|
||||
77603
|
||||
130604
|
||||
86672
|
||||
120987
|
||||
80334
|
||||
67674
|
||||
52918
|
||||
98041
|
||||
102541
|
||||
97612
|
||||
50436
|
||||
129998
|
||||
84854
|
||||
101867
|
||||
82039
|
||||
108966
|
||||
80708
|
||||
54588
|
||||
86854
|
||||
89607
|
||||
71869
|
||||
126093
|
||||
89460
|
||||
86558
|
||||
77651
|
||||
53295
|
||||
132188
|
||||
137266
|
||||
97370
|
||||
114620
|
||||
86691
|
||||
147199
|
||||
147299
|
||||
72616
|
||||
142654
|
||||
88610
|
||||
104030
|
||||
64256
|
||||
54867
|
||||
76532
|
||||
145081
|
||||
102335
|
||||
72987
|
||||
72684
|
||||
148155
|
||||
59739
|
||||
85954
|
||||
141001
|
||||
125171
|
||||
107764
|
||||
141622
|
||||
89536
|
||||
92435
|
||||
69038
|
||||
84518
|
||||
119700
|
||||
119801
|
||||
81677
|
||||
125317
|
||||
72683
|
||||
128905
|
||||
93666
|
||||
75633
|
||||
117361
|
||||
82295
|
21
python/1/test_day1.py
Normal file
21
python/1/test_day1.py
Normal file
|
@ -0,0 +1,21 @@
|
|||
from day1 import calculate_fuel, part1, advanced_fuel, part2
|
||||
|
||||
|
||||
def test_calculate_fuel():
|
||||
assert calculate_fuel(12) == 2
|
||||
assert calculate_fuel(14) == 2
|
||||
assert calculate_fuel(1969) == 654
|
||||
assert calculate_fuel(100756) == 33583
|
||||
|
||||
|
||||
def test_part1():
|
||||
assert part1() == 3226488
|
||||
|
||||
|
||||
def test_advanced_fuel():
|
||||
assert advanced_fuel(14) == 2
|
||||
assert advanced_fuel(1969) == 966
|
||||
assert advanced_fuel(100756) == 50346
|
||||
|
||||
def test_part2():
|
||||
assert part2()==4836845
|
55
python/2/day2.py
Normal file
55
python/2/day2.py
Normal file
|
@ -0,0 +1,55 @@
|
|||
from typing import List
|
||||
|
||||
intcode = List[int]
|
||||
|
||||
|
||||
def opcode_parse(text: str) -> intcode:
|
||||
return list(map(int, text.split(",")))
|
||||
|
||||
|
||||
def run_intcode(codelist: intcode) -> intcode:
|
||||
p = 0 # pointer
|
||||
while True:
|
||||
code = codelist[p]
|
||||
if code == 99:
|
||||
break
|
||||
from1 = codelist[p + 1]
|
||||
from2 = codelist[p + 2]
|
||||
to = codelist[p + 3]
|
||||
if code == 1:
|
||||
codelist[to] = codelist[from1] + codelist[from2]
|
||||
elif code == 2:
|
||||
codelist[to] = codelist[from1] * codelist[from2]
|
||||
else:
|
||||
raise ValueError(f"invalid intcode: {code}")
|
||||
p += 4
|
||||
return codelist
|
||||
|
||||
|
||||
def part1() -> int:
|
||||
with open("2/input.txt") as f:
|
||||
cl = opcode_parse(f.read())
|
||||
cl[1] = 12
|
||||
cl[2] = 2
|
||||
cl = run_intcode(cl)
|
||||
|
||||
return cl[0]
|
||||
|
||||
|
||||
def part2() -> int:
|
||||
with open("2/input.txt") as f:
|
||||
initial_cl = opcode_parse(f.read())
|
||||
|
||||
for noun in range(99):
|
||||
for verb in range(99):
|
||||
cl = initial_cl[:] # make a copy
|
||||
cl[1] = noun
|
||||
cl[2] = verb
|
||||
cl = run_intcode(cl)
|
||||
if cl[0] == 19690720:
|
||||
return 100 * noun + verb
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(part1())
|
||||
print(part2())
|
1
python/2/input.txt
Normal file
1
python/2/input.txt
Normal file
|
@ -0,0 +1 @@
|
|||
1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,13,1,19,1,5,19,23,2,10,23,27,1,27,5,31,2,9,31,35,1,35,5,39,2,6,39,43,1,43,5,47,2,47,10,51,2,51,6,55,1,5,55,59,2,10,59,63,1,63,6,67,2,67,6,71,1,71,5,75,1,13,75,79,1,6,79,83,2,83,13,87,1,87,6,91,1,10,91,95,1,95,9,99,2,99,13,103,1,103,6,107,2,107,6,111,1,111,2,115,1,115,13,0,99,2,0,14,0
|
20
python/2/test_day2.py
Normal file
20
python/2/test_day2.py
Normal file
|
@ -0,0 +1,20 @@
|
|||
from day2 import opcode_parse, run_intcode, part1, part2
|
||||
|
||||
|
||||
def test_opcode_parse():
|
||||
assert opcode_parse("2,2,3,45,5") == [2, 2, 3, 45, 5]
|
||||
|
||||
|
||||
def test_run_intcode():
|
||||
assert run_intcode([1, 0, 0, 0, 99]) == [2, 0, 0, 0, 99]
|
||||
assert run_intcode([2, 3, 0, 3, 99]) == [2, 3, 0, 6, 99]
|
||||
assert run_intcode([2, 4, 4, 5, 99, 0]) == [2, 4, 4, 5, 99, 9801]
|
||||
assert run_intcode([1, 1, 1, 4, 99, 5, 6, 0, 99]) == [30, 1, 1, 4, 2, 5, 6, 0, 99]
|
||||
|
||||
|
||||
def test_part1():
|
||||
assert part1() == 4714701
|
||||
|
||||
|
||||
def test_part2():
|
||||
assert part2() == 5121
|
2
rust/.gitignore
vendored
Normal file
2
rust/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/target/
|
||||
**/*.rs.bk
|
6
rust/Cargo.lock
generated
Normal file
6
rust/Cargo.lock
generated
Normal file
|
@ -0,0 +1,6 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "adventofcode"
|
||||
version = "0.1.0"
|
||||
|
9
rust/Cargo.toml
Normal file
9
rust/Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "adventofcode"
|
||||
version = "0.1.0"
|
||||
authors = ["Lukas Winkler <git@lw1.at>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
58
rust/src/day1.rs
Normal file
58
rust/src/day1.rs
Normal file
|
@ -0,0 +1,58 @@
|
|||
use std::fs;
|
||||
|
||||
fn calculate_fuel(mass: i32) -> i32 {
|
||||
return mass / 3 - 2;
|
||||
}
|
||||
|
||||
fn advanced_fuel(mass: i32) -> i32 {
|
||||
let mut mass = mass;
|
||||
let mut total = 0;
|
||||
let mut fuel;
|
||||
loop {
|
||||
fuel = calculate_fuel(mass);
|
||||
if fuel > 0 {
|
||||
total += fuel;
|
||||
mass = fuel;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
pub fn part1() -> i32 {
|
||||
let data = fs::read_to_string("../python/1/input.txt").expect("Unable to read file");
|
||||
let ints = data
|
||||
.lines()
|
||||
.map(|line| calculate_fuel(line.parse().expect("error when parsing line as integer")))
|
||||
.sum();
|
||||
return ints;
|
||||
}
|
||||
|
||||
pub fn part2() -> i32 {
|
||||
return 1;
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
#[test]
|
||||
fn test_calculate_fuel() {
|
||||
assert_eq!(calculate_fuel(12), 2);
|
||||
assert_eq!(calculate_fuel(14), 2);
|
||||
assert_eq!(calculate_fuel(1969), 654);
|
||||
assert_eq!(calculate_fuel(100756), 33583);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_advanced_fuel() {
|
||||
assert_eq!(advanced_fuel(14), 2);
|
||||
assert_eq!(advanced_fuel(1969), 966);
|
||||
assert_eq!(advanced_fuel(100756), 50346);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_part1() {
|
||||
assert_eq!(part1(), 3226488)
|
||||
}
|
||||
}
|
9
rust/src/main.rs
Normal file
9
rust/src/main.rs
Normal file
|
@ -0,0 +1,9 @@
|
|||
mod day1;
|
||||
|
||||
fn main() {
|
||||
let res1 = day1::part1();
|
||||
let res2 = day1::part2();
|
||||
|
||||
println!("part 1: {}", res1);
|
||||
println!("part 1: {}", res2);
|
||||
}
|
Loading…
Reference in a new issue