diff --git a/README.md b/README.md index 3043314..6efb742 100644 --- a/README.md +++ b/README.md @@ -55,12 +55,12 @@ |[**21**](https://adventofcode.com/2020/day/21) [](Python/2020/21.py "Python solution for 2020/21")|[**22**](https://adventofcode.com/2020/day/22) [](Python/2020/22.py "Python solution for 2020/22")|[**23**](https://adventofcode.com/2020/day/23) [](Python/2020/23.py "Python solution for 2020/23")|[**24**](https://adventofcode.com/2020/day/24) [](Python/2020/24.py "Python solution for 2020/24")|[**25**](https://adventofcode.com/2020/day/25) [](Python/2020/25.py "Python solution for 2020/25")|26|27| |28|29|30|31|||| -## [2019](https://adventofcode.com/2019) ([ Python](Python/2019): 25/25 | [ Uiua](Uiua/2019): 6/25 | [ Rust](Rust/2019): 2/25) +## [2019](https://adventofcode.com/2019) ([ Python](Python/2019): 25/25 | [ Uiua](Uiua/2019): 6/25 | [ Rust](Rust/2019): 3/25) |Mo|Tu|We|Th|Fr|Sa|Su| |-|-|-|-|-|-|-| |||||||[**1**](https://adventofcode.com/2019/day/1) [](Python/2019/01.py "Python solution for 2019/01") [](https://uiua.org/pad?src=JnNjCgriipzii5XiiaBAXG4uCgrin5woLystMuKMisO3MykKLyviiaEoLytb4peM4peM4o2iKC4tMuKMisO3M3ziiaUwKV0pCg== "Uiua solution for 2019/01")| |[**2**](https://adventofcode.com/2019/day/2) [](Rust/2019/02.rs "Rust solution for 2019/02") [](Python/2019/02.py "Python solution for 2019/02") [](https://uiua.org/pad?src=JnNjCgrilIzilIDilbRJbnRjb2RlCiAgUGFyc2Ug4oaQIG1hcOKHoeKKuOKnuyDiipzii5XiiIjiioJALStAMOKHoTEwLgogIE9wIOKGmiDijaQu4omlMC7il78xMDAKICBNb2RlIOKGmiDil78xMOKMisO34oG_4oqZMTArMgogIFJlYWQg4oaaIOKsmjDiqKwoZ2V04oqZ4peMfOKImHxnZXQrKSDiioMoTW9kZeKKmShnZXR84peMKXxnZXQrKzHiipniipnil4x84ouF4ouF4oqZ4oiYKQogIFdyaXRlIOKGmiBpbnNlcnQ64oqZKOKorCjiipnil4x84o2kLjB8Kykg4oqDKE1vZGXiipkoZ2V0fOKXjCl8Z2V0Kysx4oqZ4oqZ4peMfOKLheKLheKKmeKImCkpCiAgQmluT3AhIOKGmiArNOKKg-KLheKLheKKmeKImFdyaXRl4oqZMuKXoSheMOKKgyhSZWFkMXxSZWFkMCkpCiAgT3BBZGQgIOKGmiBCaW5PcCErCiAgT3BNdWwgIOKGmiBCaW5PcCHDlwogIElucHV0ISAg4oaaICsy4oqD4ouF4ouF4oqZ4oiYV3JpdGXiioMo4ouF4ouF4ouF4oiYfDB84oqZ4oqZ4oiYKSDiipniipniipleMAogIE91dHB1dCEg4oaaICsyIOKKmeKKmeKKmV4wIOKKgyjii4XiipniipniiJh84oqZ4ouF4ouF4peMKSDil6EoUmVhZDApCiAgSm1wISAgICAg4oaaIOKorCgrM-KXjHziipnil4wpXjDil6HiioMoUmVhZDB8UmVhZDEpCiAgSm1wVHJ1ZSAg4oaaIEptcCEo4omgMCkKICBKbXBGYWxzZSDihpogSm1wISg9MCkKICBMdCDihpogQmluT3AhPAogIEVxIOKGmiBCaW5PcCEoPSkKICBCYXNlIOKGmiArMuKKmSs64pehKFJlYWQwKQogIFN0ZXDigLwgIOKGmiDiqKwo4oqZ4oqZ4oqZ4oiYfE9wQWRkfE9wTXVsfElucHV0IV4wfE91dHB1dCFeMXxKbXBUcnVlfEptcEZhbHNlfEx0fEVxfEJhc2UpT3Dil6EoZ2V04oqZ4peMKQogIElzRG9uZSDihpog4omNOTlnZXTiipnil4wKICBSdW7igLwg4oaQIOKXjOKXjOKNoihTdGVw4oC8XjBeMXzCrElzRG9uZSkwIDAK4pSU4pSA4pW0CgpJbnRjb2RlflBhcnNlCgpSdW5XaXRoSW5wdXQg4oaQIOKKouKNnOKKmTBJbnRjb2RlflJ1buKAvCgufOKXjCnijZziio_il4wxXzI6CgriioMo4oqXMTk2OTA3MjDiiaFSdW5XaXRoSW5wdXTima3igoLih6ExMDBfMTAwwqR8UnVuV2l0aElucHV0IDEyXzIpCg== "Uiua solution for 2019/02")|[**3**](https://adventofcode.com/2019/day/3) [](Python/2019/03.py "Python solution for 2019/03") [](https://uiua.org/pad?src=JnNjCgriiKnCsOKWocKw4oqf4oqc4pah4omgQFxuLgriiKkoXCvilr064oqP4oqZW-KIqeKKuMKv4oq44oeM4oehMl3iipfiipkiTFJVRCLiipwo4oqZ4ouVwrDiioIp4omgQCwuKQoK4pehKOKWveKKuOKIiCkK4oqDKC_ihqcrKzLiiKniipfin5w6fC_ihqfiiaEvK-KMtSkK "Uiua solution for 2019/03")|[**4**](https://adventofcode.com/2019/day/4) [](Python/2019/04.py "Python solution for 2019/04") [](https://uiua.org/pad?src=JnNjCgriipzii5XiiIgrQDDih6ExMC4K4o2cLeKHocKw4oqfKzBfMQoKQ2hlY2shIOKGkCDihqfiioMoL-KGpV4w4oqc4qe7KzHiirjiipt84omN4oeh4oq44qe74o2PKSDCsOKLlQriiKkvK-KJoeKKg0NoZWNrISg9MilDaGVjayEo4omlMikK "Uiua solution for 2019/04")|[**5**](https://adventofcode.com/2019/day/5) [](Rust/2019/05.rs "Rust solution for 2019/05") [](Python/2019/05.py "Python solution for 2019/05") [](https://uiua.org/pad?src=JnNjCgrilIzilIDilbRJbnRjb2RlCiAgUGFyc2Ug4oaQIG1hcOKHoeKKuOKnuyDiipzii5XiiIjiioJALStAMOKHoTEwLgogIE9wIOKGmiDijaQu4omlMC7il78xMDAKICBNb2RlIOKGmiDil78xMOKMisO34oG_4oqZMTArMgogIFJlYWQg4oaaIOKsmjDiqKwoZ2V04oqZ4peMfOKImHxnZXQrKSDiioMoTW9kZeKKmShnZXR84peMKXxnZXQrKzHiipniipnil4x84ouF4ouF4oqZ4oiYKQogIFdyaXRlIOKGmiBpbnNlcnQ64oqZKOKorCjiipnil4x84o2kLjB8Kykg4oqDKE1vZGXiipkoZ2V0fOKXjCl8Z2V0Kysx4oqZ4oqZ4peMfOKLheKLheKKmeKImCkpCiAgQmluT3AhIOKGmiArNOKKg-KLheKLheKKmeKImFdyaXRl4oqZMuKXoSheMOKKgyhSZWFkMXxSZWFkMCkpCiAgT3BBZGQgIOKGmiBCaW5PcCErCiAgT3BNdWwgIOKGmiBCaW5PcCHDlwogIElucHV0ISAg4oaaICsy4oqD4ouF4ouF4oqZ4oiYV3JpdGXiioMo4ouF4ouF4ouF4oiYfDB84oqZ4oqZ4oiYKSDiipniipniipleMAogIE91dHB1dCEg4oaaICsyIOKKmeKKmeKKmV4wIOKKgyjii4XiipniipniiJh84oqZ4ouF4ouF4peMKSDil6EoUmVhZDApCiAgSm1wISAgICAg4oaaIOKorCgrM-KXjHziipnil4wpXjDil6HiioMoUmVhZDB8UmVhZDEpCiAgSm1wVHJ1ZSAg4oaaIEptcCEo4omgMCkKICBKbXBGYWxzZSDihpogSm1wISg9MCkKICBMdCDihpogQmluT3AhPAogIEVxIOKGmiBCaW5PcCEoPSkKICBCYXNlIOKGmiArMuKKmSs64pehKFJlYWQwKQogIFN0ZXDigLwgIOKGmiDiqKwo4oqZ4oqZ4oqZ4oiYfE9wQWRkfE9wTXVsfElucHV0IV4wfE91dHB1dCFeMXxKbXBUcnVlfEptcEZhbHNlfEx0fEVxfEJhc2UpT3Dil6EoZ2V04oqZ4peMKQogIElzRG9uZSDihpog4omNOTlnZXTiipnil4wKICBSdW7igLwg4oaQIOKXjOKXjOKNoihTdGVw4oC8XjBeMXzCrElzRG9uZSkwIDAK4pSU4pSA4pW0CgpJbnRjb2RlflBhcnNlCgriiKko4o2kLi_Dlz0wOsKw4oqCIOKLheKKmeKXjEludGNvZGV-UnVu4oC8KCx84oqCKeKKmVtdOik1LDEK "Uiua solution for 2019/05")|[**6**](https://adventofcode.com/2019/day/6) [](Python/2019/06.py "Python solution for 2019/06")|[**7**](https://adventofcode.com/2019/day/7) [](Python/2019/07.py "Python solution for 2019/07")|[**8**](https://adventofcode.com/2019/day/8) [](Python/2019/08.py "Python solution for 2019/08")| -|[**9**](https://adventofcode.com/2019/day/9) [](Python/2019/09.py "Python solution for 2019/09") [](https://uiua.org/pad?src=JnNjCgrilIzilIDilbRJbnRjb2RlCiAgUGFyc2Ug4oaQIG1hcOKHoeKKuOKnuyDiipzii5XiiIjiioJALStAMOKHoTEwLgogIE9wIOKGmiDijaQu4omlMC7il78xMDAKICBNb2RlIOKGmiDil78xMOKMisO34oG_4oqZMTArMgogIFJlYWQg4oaaIOKsmjDiqKwoZ2V04oqZ4peMfOKImHxnZXQrKSDiioMoTW9kZeKKmShnZXR84peMKXxnZXQrKzHiipniipnil4x84ouF4ouF4oqZ4oiYKQogIFdyaXRlIOKGmiBpbnNlcnQ64oqZKOKorCjiipnil4x84o2kLjB8Kykg4oqDKE1vZGXiipkoZ2V0fOKXjCl8Z2V0Kysx4oqZ4oqZ4peMfOKLheKLheKKmeKImCkpCiAgQmluT3AhIOKGmiArNOKKg-KLheKLheKKmeKImFdyaXRl4oqZMuKXoSheMOKKgyhSZWFkMXxSZWFkMCkpCiAgT3BBZGQgIOKGmiBCaW5PcCErCiAgT3BNdWwgIOKGmiBCaW5PcCHDlwogIElucHV0ISAg4oaaICsy4oqD4ouF4ouF4oqZ4oiYV3JpdGXiioMo4ouF4ouF4ouF4oiYfDB84oqZ4oqZ4oiYKSDiipniipniipleMAogIE91dHB1dCEg4oaaICsyIOKKmeKKmeKKmV4wIOKKgyjii4XiipniipniiJh84oqZ4ouF4ouF4peMKSDil6EoUmVhZDApCiAgSm1wISAgICAg4oaaIOKorCgrM-KXjHziipnil4wpXjDil6HiioMoUmVhZDB8UmVhZDEpCiAgSm1wVHJ1ZSAg4oaaIEptcCEo4omgMCkKICBKbXBGYWxzZSDihpogSm1wISg9MCkKICBMdCDihpogQmluT3AhPAogIEVxIOKGmiBCaW5PcCEoPSkKICBCYXNlIOKGmiArMuKKmSs64pehKFJlYWQwKQogIFN0ZXDigLwgIOKGmiDiqKwo4oqZ4oqZ4oqZ4oiYfE9wQWRkfE9wTXVsfElucHV0IV4wfE91dHB1dCFeMXxKbXBUcnVlfEptcEZhbHNlfEx0fEVxfEJhc2UpT3Dil6EoZ2V04oqZ4peMKQogIElzRG9uZSDihpog4omNOTlnZXTiipnil4wKICBSdW7igLwg4oaQIOKXjOKXjOKNoihTdGVw4oC8XjBeMXzCrElzRG9uZSkwIDAK4pSU4pSA4pW0CgpJbnRjb2RlflBhcnNlCgosMuKKmTEK4oqZ4peM4peM4oipSW50Y29kZX5SdW7igLwoLnziiJgpCg== "Uiua solution for 2019/09")|[**10**](https://adventofcode.com/2019/day/10) [](Python/2019/10.py "Python solution for 2019/10")|[**11**](https://adventofcode.com/2019/day/11) [](Python/2019/11.py "Python solution for 2019/11")|[**12**](https://adventofcode.com/2019/day/12) [](Python/2019/12.py "Python solution for 2019/12")|[**13**](https://adventofcode.com/2019/day/13) [](Python/2019/13.py "Python solution for 2019/13")|[**14**](https://adventofcode.com/2019/day/14) [](Python/2019/14.py "Python solution for 2019/14")|[**15**](https://adventofcode.com/2019/day/15) [](Python/2019/15.py "Python solution for 2019/15")| +|[**9**](https://adventofcode.com/2019/day/9) [](Rust/2019/09.rs "Rust solution for 2019/09") [](Python/2019/09.py "Python solution for 2019/09") [](https://uiua.org/pad?src=JnNjCgrilIzilIDilbRJbnRjb2RlCiAgUGFyc2Ug4oaQIG1hcOKHoeKKuOKnuyDiipzii5XiiIjiioJALStAMOKHoTEwLgogIE9wIOKGmiDijaQu4omlMC7il78xMDAKICBNb2RlIOKGmiDil78xMOKMisO34oG_4oqZMTArMgogIFJlYWQg4oaaIOKsmjDiqKwoZ2V04oqZ4peMfOKImHxnZXQrKSDiioMoTW9kZeKKmShnZXR84peMKXxnZXQrKzHiipniipnil4x84ouF4ouF4oqZ4oiYKQogIFdyaXRlIOKGmiBpbnNlcnQ64oqZKOKorCjiipnil4x84o2kLjB8Kykg4oqDKE1vZGXiipkoZ2V0fOKXjCl8Z2V0Kysx4oqZ4oqZ4peMfOKLheKLheKKmeKImCkpCiAgQmluT3AhIOKGmiArNOKKg-KLheKLheKKmeKImFdyaXRl4oqZMuKXoSheMOKKgyhSZWFkMXxSZWFkMCkpCiAgT3BBZGQgIOKGmiBCaW5PcCErCiAgT3BNdWwgIOKGmiBCaW5PcCHDlwogIElucHV0ISAg4oaaICsy4oqD4ouF4ouF4oqZ4oiYV3JpdGXiioMo4ouF4ouF4ouF4oiYfDB84oqZ4oqZ4oiYKSDiipniipniipleMAogIE91dHB1dCEg4oaaICsyIOKKmeKKmeKKmV4wIOKKgyjii4XiipniipniiJh84oqZ4ouF4ouF4peMKSDil6EoUmVhZDApCiAgSm1wISAgICAg4oaaIOKorCgrM-KXjHziipnil4wpXjDil6HiioMoUmVhZDB8UmVhZDEpCiAgSm1wVHJ1ZSAg4oaaIEptcCEo4omgMCkKICBKbXBGYWxzZSDihpogSm1wISg9MCkKICBMdCDihpogQmluT3AhPAogIEVxIOKGmiBCaW5PcCEoPSkKICBCYXNlIOKGmiArMuKKmSs64pehKFJlYWQwKQogIFN0ZXDigLwgIOKGmiDiqKwo4oqZ4oqZ4oqZ4oiYfE9wQWRkfE9wTXVsfElucHV0IV4wfE91dHB1dCFeMXxKbXBUcnVlfEptcEZhbHNlfEx0fEVxfEJhc2UpT3Dil6EoZ2V04oqZ4peMKQogIElzRG9uZSDihpog4omNOTlnZXTiipnil4wKICBSdW7igLwg4oaQIOKXjOKXjOKNoihTdGVw4oC8XjBeMXzCrElzRG9uZSkwIDAK4pSU4pSA4pW0CgpJbnRjb2RlflBhcnNlCgosMuKKmTEK4oqZ4peM4peM4oipSW50Y29kZX5SdW7igLwoLnziiJgpCg== "Uiua solution for 2019/09")|[**10**](https://adventofcode.com/2019/day/10) [](Python/2019/10.py "Python solution for 2019/10")|[**11**](https://adventofcode.com/2019/day/11) [](Python/2019/11.py "Python solution for 2019/11")|[**12**](https://adventofcode.com/2019/day/12) [](Python/2019/12.py "Python solution for 2019/12")|[**13**](https://adventofcode.com/2019/day/13) [](Python/2019/13.py "Python solution for 2019/13")|[**14**](https://adventofcode.com/2019/day/14) [](Python/2019/14.py "Python solution for 2019/14")|[**15**](https://adventofcode.com/2019/day/15) [](Python/2019/15.py "Python solution for 2019/15")| |[**16**](https://adventofcode.com/2019/day/16) [](Python/2019/16.py "Python solution for 2019/16")|[**17**](https://adventofcode.com/2019/day/17) [](Python/2019/17.py "Python solution for 2019/17")|[**18**](https://adventofcode.com/2019/day/18) [](Python/2019/18.py "Python solution for 2019/18")|[**19**](https://adventofcode.com/2019/day/19) [](Python/2019/19.py "Python solution for 2019/19")|[**20**](https://adventofcode.com/2019/day/20) [](Python/2019/20.py "Python solution for 2019/20")|[**21**](https://adventofcode.com/2019/day/21) [](Python/2019/21.py "Python solution for 2019/21")|[**22**](https://adventofcode.com/2019/day/22) [](Python/2019/22.py "Python solution for 2019/22")| |[**23**](https://adventofcode.com/2019/day/23) [](Python/2019/23.py "Python solution for 2019/23")|[**24**](https://adventofcode.com/2019/day/24) [](Python/2019/24.py "Python solution for 2019/24")|[**25**](https://adventofcode.com/2019/day/25) [](Python/2019/25.py "Python solution for 2019/25")|26|27|28|29| |30|31|||||| diff --git a/Rust/2019/09.rs b/Rust/2019/09.rs new file mode 100644 index 0000000..960449f --- /dev/null +++ b/Rust/2019/09.rs @@ -0,0 +1,24 @@ +#![feature(test)] + +use aoc::intcode::{get_output, Int}; + +type Input = Vec; + +fn setup(input: &str) -> Input { + input + .split(',') + .map(|x| x.trim().parse().unwrap()) + .collect() +} + +fn part1(input: &Input) -> Int { + let output = get_output(input.iter().copied(), [1]).unwrap(); + *output.last().unwrap() +} + +fn part2(input: &Input) -> Int { + let output = get_output(input.iter().copied(), [2]).unwrap(); + output[0] +} + +aoc::main!(2019, 9); diff --git a/Rust/2019/main.rs b/Rust/2019/main.rs index ad3abd7..09a9e61 100644 --- a/Rust/2019/main.rs +++ b/Rust/2019/main.rs @@ -7,7 +7,7 @@ aoc::year! { // "06.rs", // "07.rs", // "08.rs", - // "09.rs", + "09.rs", // "10.rs", // "11.rs", // "12.rs", diff --git a/Rust/Cargo.toml b/Rust/Cargo.toml index a7bbb10..f21c433 100644 --- a/Rust/Cargo.toml +++ b/Rust/Cargo.toml @@ -77,6 +77,9 @@ path = "2019/02.rs" [[bin]] name = "2019_05" path = "2019/05.rs" +[[bin]] +name = "2019_09" +path = "2019/09.rs" # 2020 [[bin]] diff --git a/Rust/lib/intcode.rs b/Rust/lib/intcode.rs index 007a220..7aa6899 100644 --- a/Rust/lib/intcode.rs +++ b/Rust/lib/intcode.rs @@ -20,6 +20,7 @@ pub fn get_output( pub struct Vm { mem: FxHashMap, ip: Int, + base: Int, inp: I, out: O, } @@ -39,6 +40,7 @@ impl Vm { .map(|(i, x)| (i as _, x)) .collect(), ip: 0, + base: 0, inp: input, out: output, } @@ -106,6 +108,10 @@ impl Vm { self.write_arg(out, (self.read_arg(in1) == self.read_arg(in2)) as _)?; self.ip += 4; } + Op::Base(offset) => { + self.base += self.read_arg(offset); + self.ip += 2; + } Op::Halt => return Ok(false), } @@ -132,6 +138,7 @@ impl Vm { }, 7 => Op::Lt { in1, in2, out }, 8 => Op::Eq { in1, in2, out }, + 9 => Op::Base(in1), 99 => Op::Halt, code => return Err(Error::InvalidOpcode { ip: self.ip, code }), }) @@ -143,6 +150,7 @@ impl Vm { Ok(match mode { 0 => Arg::Addr(arg), 1 => Arg::Immediate(arg), + 2 => Arg::Relative(arg), _ => { return Err(Error::InvalidArgMode { ip: self.ip, @@ -157,6 +165,7 @@ impl Vm { match arg { Arg::Addr(addr) => self.read(addr), Arg::Immediate(value) => value, + Arg::Relative(offset) => self.read(self.base + offset), } } @@ -164,6 +173,7 @@ impl Vm { Ok(match arg { Arg::Addr(addr) => self.write(addr, value), Arg::Immediate(_) => return Err(Error::WriteImmediate { ip: self.ip }), + Arg::Relative(offset) => self.write(self.base + offset, value), }) } } @@ -178,6 +188,7 @@ enum Op { Jne { arg: Arg, addr: Arg }, // 6 Lt { in1: Arg, in2: Arg, out: Arg }, // 7 Eq { in1: Arg, in2: Arg, out: Arg }, // 8 + Base(Arg), // 9 Halt, // 99 } @@ -185,6 +196,7 @@ enum Op { enum Arg { Addr(Int), Immediate(Int), + Relative(Int), } #[derive(Debug, Error)]