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)]