Compare commits

...

2 commits

12 changed files with 32 additions and 50 deletions

View file

@ -18,7 +18,7 @@ pub fn run() -> Result<String> {
} }
fn manhattan_distance(a: &Point, b: &Point) -> u64 { fn manhattan_distance(a: &Point, b: &Point) -> u64 {
(a.x - b.x).abs() as u64 + (a.y - b.y).abs() as u64 (a.x - b.x).unsigned_abs() + (a.y - b.y).unsigned_abs()
} }
fn part1(first_wire: &Wire, second_wire: &Wire) -> Result<u64> { fn part1(first_wire: &Wire, second_wire: &Wire) -> Result<u64> {

View file

@ -233,12 +233,12 @@ impl Planet {
fn potential_energy(&self) -> u64 { fn potential_energy(&self) -> u64 {
let pos = &self.position; let pos = &self.position;
pos.x.abs() as u64 + pos.y.abs() as u64 + pos.z.abs() as u64 pos.x.unsigned_abs() + pos.y.unsigned_abs() + pos.z.unsigned_abs()
} }
fn kinetic_energy(&self) -> u64 { fn kinetic_energy(&self) -> u64 {
let vel = &self.velocity; let vel = &self.velocity;
vel.x.abs() as u64 + vel.y.abs() as u64 + vel.z.abs() as u64 vel.x.unsigned_abs() + vel.y.unsigned_abs() + vel.z.unsigned_abs()
} }
fn total_energy(&self) -> u64 { fn total_energy(&self) -> u64 {

View file

@ -226,7 +226,7 @@ impl Intcode {
let val1 = op1.get(&mut self.memory, self.relative_base)?; let val1 = op1.get(&mut self.memory, self.relative_base)?;
let val2 = op2.get(&mut self.memory, self.relative_base)?; let val2 = op2.get(&mut self.memory, self.relative_base)?;
let res = if val1 < val2 { 1 } else { 0 }; let res = i64::from(val1 < val2);
dst.set(res, &mut self.memory, self.relative_base)?; dst.set(res, &mut self.memory, self.relative_base)?;
self.ip += 4; self.ip += 4;
@ -235,7 +235,7 @@ impl Intcode {
let val1 = op1.get(&mut self.memory, self.relative_base)?; let val1 = op1.get(&mut self.memory, self.relative_base)?;
let val2 = op2.get(&mut self.memory, self.relative_base)?; let val2 = op2.get(&mut self.memory, self.relative_base)?;
let res = if val1 == val2 { 1 } else { 0 }; let res = i64::from(val1 == val2);
dst.set(res, &mut self.memory, self.relative_base)?; dst.set(res, &mut self.memory, self.relative_base)?;
self.ip += 4; self.ip += 4;
@ -263,7 +263,7 @@ impl Intcode {
} }
pub fn get_day02_output(&self) -> Option<i64> { pub fn get_day02_output(&self) -> Option<i64> {
self.memory.get(0).copied() self.memory.first().copied()
} }
pub fn get_last_output(&self) -> Option<i64> { pub fn get_last_output(&self) -> Option<i64> {

View file

@ -111,9 +111,8 @@ impl Layout {
count += self count += self
.grid .grid
.get(i) .get(i)
.map(|line| line.get(j)) .and_then(|line| line.get(j))
.flatten() .map(|&cell| u8::from(cell == value))
.map(|&cell| if cell == value { 1 } else { 0 })
.unwrap_or(0); .unwrap_or(0);
} }
@ -131,7 +130,7 @@ impl Layout {
let (i, j) = (i.wrapping_add(di as usize), j.wrapping_add(dj as usize)); let (i, j) = (i.wrapping_add(di as usize), j.wrapping_add(dj as usize));
let cell = self.grid.get(i).map(|line| line.get(j)).flatten(); let cell = self.grid.get(i).and_then(|line| line.get(j));
match cell { match cell {
// keep going, the next seat is farther away // keep going, the next seat is farther away

View file

@ -22,8 +22,7 @@ fn part1(input: &str) -> Result<u64> {
Ok(tickets Ok(tickets
.iter() .iter()
.map(|t| t.invalid_values(&fields_vec)) .flat_map(|t| t.invalid_values(&fields_vec))
.flatten()
.sum()) .sum())
} }

View file

@ -113,7 +113,7 @@ fn mul(input: &str) -> IResult<&str, Expr> {
} }
fn num(input: &str) -> IResult<&str, Expr> { fn num(input: &str) -> IResult<&str, Expr> {
map_res(take_while1(|c: char| c.is_digit(10)), |res: &str| { map_res(take_while1(|c: char| c.is_ascii_digit()), |res: &str| {
res.parse().map(Expr::Num) res.parse().map(Expr::Num)
})(input) })(input)
} }

View file

@ -30,13 +30,7 @@ fn compute_gamma(binary_numbers: &[&str], size: usize) -> u64 {
let mut gamma = 0; let mut gamma = 0;
for pos in 0..size { for pos in 0..size {
let digit = if count_ones(binary_numbers, pos) > (binary_numbers.len() / 2) { let digit = u64::from(count_ones(binary_numbers, pos) > (binary_numbers.len() / 2));
// majority of ones
1
} else {
// majority of zeroes
0
};
gamma = (gamma << 1) | digit; gamma = (gamma << 1) | digit;
} }

View file

@ -120,7 +120,7 @@ impl Grid {
fn unmarked_numbers(&self) -> impl Iterator<Item = u8> + '_ { fn unmarked_numbers(&self) -> impl Iterator<Item = u8> + '_ {
self.number_to_pos self.number_to_pos
.iter() .iter()
.filter_map(|(num, &(x, y))| (!self.access_grid(x, y)).then(|| *num)) .filter_map(|(num, &(x, y))| (!self.access_grid(x, y)).then_some(*num))
} }
fn access_grid(&self, x: usize, y: usize) -> bool { fn access_grid(&self, x: usize, y: usize) -> bool {

View file

@ -73,7 +73,7 @@ impl std::str::FromStr for Rules {
let (pair, res) = l.split_once(" -> ").context("couldn't parse rule")?; let (pair, res) = l.split_once(" -> ").context("couldn't parse rule")?;
Ok(( Ok((
( (
*pair.as_bytes().get(0).context("couldn't parse rule")?, *pair.as_bytes().first().context("couldn't parse rule")?,
*pair.as_bytes().get(1).context("couldn't parse rule")?, *pair.as_bytes().get(1).context("couldn't parse rule")?,
), ),
res.bytes().next().context("couldn't parse rule")?, res.bytes().next().context("couldn't parse rule")?,

View file

@ -64,31 +64,19 @@ impl Packet {
debug_assert_eq!(op.sub_packets.len(), 2); debug_assert_eq!(op.sub_packets.len(), 2);
let pack1 = &op.sub_packets[0]; let pack1 = &op.sub_packets[0];
let pack2 = &op.sub_packets[1]; let pack2 = &op.sub_packets[1];
if pack1.value() > pack2.value() { u64::from(pack1.value() > pack2.value())
1
} else {
0
}
} }
OperatorType::LessThan => { OperatorType::LessThan => {
debug_assert_eq!(op.sub_packets.len(), 2); debug_assert_eq!(op.sub_packets.len(), 2);
let pack1 = &op.sub_packets[0]; let pack1 = &op.sub_packets[0];
let pack2 = &op.sub_packets[1]; let pack2 = &op.sub_packets[1];
if pack1.value() < pack2.value() { u64::from(pack1.value() < pack2.value())
1
} else {
0
}
} }
OperatorType::EqualTo => { OperatorType::EqualTo => {
debug_assert_eq!(op.sub_packets.len(), 2); debug_assert_eq!(op.sub_packets.len(), 2);
let pack1 = &op.sub_packets[0]; let pack1 = &op.sub_packets[0];
let pack2 = &op.sub_packets[1]; let pack2 = &op.sub_packets[1];
if pack1.value() == pack2.value() { u64::from(pack1.value() == pack2.value())
1
} else {
0
}
} }
}, },
} }

View file

@ -2,11 +2,11 @@
"nodes": { "nodes": {
"flake-utils": { "flake-utils": {
"locked": { "locked": {
"lastModified": 1637014545, "lastModified": 1667395993,
"narHash": "sha256-26IZAc5yzlD9FlDT54io1oqG/bBoyka+FJk5guaX4x4=", "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
"owner": "numtide", "owner": "numtide",
"repo": "flake-utils", "repo": "flake-utils",
"rev": "bba5dcc8e0b20ab664967ad83d24d64cb64ec4f4", "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -17,11 +17,11 @@
}, },
"flake-utils_2": { "flake-utils_2": {
"locked": { "locked": {
"lastModified": 1637014545, "lastModified": 1659877975,
"narHash": "sha256-26IZAc5yzlD9FlDT54io1oqG/bBoyka+FJk5guaX4x4=", "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
"owner": "numtide", "owner": "numtide",
"repo": "flake-utils", "repo": "flake-utils",
"rev": "bba5dcc8e0b20ab664967ad83d24d64cb64ec4f4", "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -48,11 +48,11 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1637453606, "lastModified": 1665296151,
"narHash": "sha256-Gy6cwUswft9xqsjWxFYEnx/63/qzaFUwatcbV5GF/GQ=", "narHash": "sha256-uOB0oxqxN9K7XGF1hcnY+PQnlQJ+3bP2vCn/+Ru/bbc=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "8afc4e543663ca0a6a4f496262cd05233737e732", "rev": "14ccaaedd95a488dd7ae142757884d8e125b3363",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -75,11 +75,11 @@
"nixpkgs": "nixpkgs_2" "nixpkgs": "nixpkgs_2"
}, },
"locked": { "locked": {
"lastModified": 1638584238, "lastModified": 1670207212,
"narHash": "sha256-s9ABdhsYMTz0Qp1EoORN1O8PlJ68390iGv0+KUwaktg=", "narHash": "sha256-uuKbbv0L+QoXiqO7METP9BihY0F7hJqGdKn7xDVfyFw=",
"owner": "oxalica", "owner": "oxalica",
"repo": "rust-overlay", "repo": "rust-overlay",
"rev": "4a918c124e43188e8a1d2492a731befe47effa71", "rev": "18823e511bc85ed27bfabe33cccecb389f9aa92d",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -10,7 +10,9 @@
let let
overlays = [ (import rust-overlay) ]; overlays = [ (import rust-overlay) ];
pkgs = import nixpkgs { inherit system overlays; }; pkgs = import nixpkgs { inherit system overlays; };
myRust = pkgs.rust-bin.stable.latest.default; myRust = pkgs.rust-bin.stable.latest.default.override {
extensions = ["rust-src" "rust-analysis"];
};
in in
{ {
devShell = pkgs.mkShell { devShell = pkgs.mkShell {