i got this to work. i do not know how.

main
Shoofle 10 months ago
parent 08cffbf2d2
commit 9a217a0202
  1. 186
      day22/src/main.rs
  2. BIN
      day22/target/debug/day22
  3. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c
  4. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.14rh6xxquduf3oip.rcgu.o
  5. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.158epytlhbfsbowe.rcgu.o
  6. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.19p4mvszy4cir91u.rcgu.o
  7. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.1a1k4sij1q9pce69.rcgu.o
  8. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.1bihg2moeg5chygq.rcgu.o
  9. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.1c7cbz3jdk210p9k.rcgu.o
  10. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.1qsbm1ro4tbfgs21.rcgu.o
  11. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.1tcfwj6yz5pu7ysq.rcgu.o
  12. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.22xb5gc8wp18udxb.rcgu.o
  13. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.2ckfltwh25pxdjiq.rcgu.o
  14. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.2d2o6g77as637ckx.rcgu.o
  15. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.2jlw3p8zgr36w9z8.rcgu.o
  16. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.2uy1ffnhx1coflzy.rcgu.o
  17. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.2xofafqnp5qw0pl6.rcgu.o
  18. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.30344cl3i7qubq9r.rcgu.o
  19. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.32jc7j52pc8ry4j0.rcgu.o
  20. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.337ncxuyk1dq2ue.rcgu.o
  21. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.3cxacrz0rht4ubji.rcgu.o
  22. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.3fwwfiqqz66fmnzs.rcgu.o
  23. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.3i3opvhyhe9g0br5.rcgu.o
  24. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.3vpsgphfengpmc84.rcgu.o
  25. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.3w22fn32sprjpoeq.rcgu.o
  26. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.47uacm2m5rawcf8e.rcgu.o
  27. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.4cg0w2w00lonzgfl.rcgu.o
  28. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.4eup9fla5illy2a3.rcgu.o
  29. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.4gpi9us1h2a9f3up.rcgu.o
  30. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.4nmo7clu2u8guetr.rcgu.o
  31. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.5a6g4ehdptoofowu.rcgu.o
  32. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.5gobafgdw8bk69fa.rcgu.o
  33. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.5luyv02zhwxy9dl.rcgu.o
  34. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.f1r6amilqc8qsdc.rcgu.o
  35. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.hqomfa907rktr3v.rcgu.o
  36. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.j8yoaue9e5jbxfm.rcgu.o
  37. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.pccbwvh1y74adn4.rcgu.o
  38. BIN
      day22/target/debug/deps/day22-0729bac8f4d8314c.x9bdgll9hr3f0va.rcgu.o
  39. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/14rh6xxquduf3oip.o
  40. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/158epytlhbfsbowe.o
  41. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/19p4mvszy4cir91u.o
  42. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/1a1k4sij1q9pce69.o
  43. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/1c7cbz3jdk210p9k.o
  44. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/1qsbm1ro4tbfgs21.o
  45. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/1tcfwj6yz5pu7ysq.o
  46. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/22xb5gc8wp18udxb.o
  47. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/2ckfltwh25pxdjiq.o
  48. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/2d2o6g77as637ckx.o
  49. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/2uy1ffnhx1coflzy.o
  50. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/30344cl3i7qubq9r.o
  51. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/32jc7j52pc8ry4j0.o
  52. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/337ncxuyk1dq2ue.o
  53. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/3cxacrz0rht4ubji.o
  54. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/3fwwfiqqz66fmnzs.o
  55. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/3i3opvhyhe9g0br5.o
  56. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/3vpsgphfengpmc84.o
  57. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/3w22fn32sprjpoeq.o
  58. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/4cg0w2w00lonzgfl.o
  59. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/4gpi9us1h2a9f3up.o
  60. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/4nmo7clu2u8guetr.o
  61. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/4r2txwwnbvvnvwfl.o
  62. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/5a6g4ehdptoofowu.o
  63. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/5gobafgdw8bk69fa.o
  64. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/5luyv02zhwxy9dl.o
  65. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/6wf0kfi4hugx5d2.o
  66. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/dep-graph.bin
  67. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/f1r6amilqc8qsdc.o
  68. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/hqomfa907rktr3v.o
  69. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/j8yoaue9e5jbxfm.o
  70. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/pccbwvh1y74adn4.o
  71. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrgu5v5nr-nkj5wr-eupyd5f6dhytdweow0wey7egs/work-products.bin
  72. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/137y0ctshddefby1.o
  73. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/14rh6xxquduf3oip.o
  74. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/14vrnahsm9ocs6ne.o
  75. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/158epytlhbfsbowe.o
  76. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/19p4mvszy4cir91u.o
  77. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/1a1k4sij1q9pce69.o
  78. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/1bihg2moeg5chygq.o
  79. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/1c7cbz3jdk210p9k.o
  80. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/1fdc9dkmwbbb45c3.o
  81. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/1ff9zkcp6kuvqzqy.o
  82. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/1j23eixkayxolmnx.o
  83. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/1m1xtas5ei17d357.o
  84. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/1qsbm1ro4tbfgs21.o
  85. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/1rqmr08hvmyq6ojc.o
  86. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/1tcfwj6yz5pu7ysq.o
  87. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/1x051idfl5qnvvyf.o
  88. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/22xb5gc8wp18udxb.o
  89. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/247li8mmutgtvfqp.o
  90. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/293sglsvz6a4yubc.o
  91. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/2a0ak9hv2gk6r1j4.o
  92. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/2ckfltwh25pxdjiq.o
  93. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/2d2o6g77as637ckx.o
  94. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/2jlw3p8zgr36w9z8.o
  95. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/2kuhntz31zzcr27j.o
  96. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/2udou7dgjki9o826.o
  97. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/2uy1ffnhx1coflzy.o
  98. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/2xofafqnp5qw0pl6.o
  99. 0
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/2za10jvllm5e7o5k.o
  100. BIN
      day22/target/debug/incremental/day22-3432a5385oit6/s-grrq1jjmmv-1h3gqnk-64p1ca2p1y5zx1x8bvhbnry33/30344cl3i7qubq9r.o
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1,9 +1,8 @@
use std::{env, fs}; use std::{env, fs};
use std::cmp::{max, min, Ordering};
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::str::FromStr; use std::str::FromStr;
#[derive(Debug, Clone, Hash, PartialEq, Eq)] #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
struct Brick { struct Brick {
start: (i32, i32, i32), start: (i32, i32, i32),
end: (i32, i32, i32), end: (i32, i32, i32),
@ -31,24 +30,8 @@ impl Brick {
.collect(); .collect();
if xes.len() != 1 { return xes; } if xes.len() != 1 { return xes; }
if yes.len() != 1 { return yes; } if yes.len() != 1 { return yes; }
if zes.len() != 1 { return zes; } return zes;
return Vec::new();
} }
fn shadow(&self) -> Vec<(i32, i32)> {
let mut squares = self.squares();
squares.dedup_by(|a, b| a.2 == b.2);
return squares.iter().map(|(x,y,_z)| (*x,*y)).collect();
}
fn top (&self) -> i32 {
return max(self.start.2, self.end.2);
}
fn bottom (&self) -> i32 {
return min(self.start.2, self.end.2);
}
}
fn compare_z(a: &Brick, b: &Brick) -> Ordering {
return a.start.2.cmp(&b.start.2);
} }
fn main() { fn main() {
@ -63,138 +46,121 @@ fn main() {
let file_path = &args[1]; let file_path = &args[1];
let contents = fs::read_to_string(file_path).expect("Should have been able to read the file"); let contents = fs::read_to_string(file_path).expect("Should have been able to read the file");
println!("soorting the bricks by z for some reason");
let mut bricks: Vec<Brick> = contents.lines().map(|x| x.parse().unwrap()).collect(); let mut bricks: Vec<Brick> = contents.lines().map(|x| x.parse().unwrap()).collect();
let mut bbs = bricks_by_shadow(&bricks); let mut grid: HashMap<(i32, i32, i32), Brick> = HashMap::new();
bricks.sort_unstable_by(compare_z);
println!("{:?}", bricks);
println!("dropping bricks now");
let mut made_changes = true;
while made_changes {
let mut new_bricks: Vec<Brick> = Vec::new();
made_changes = false;
for brick in &bricks { for brick in &bricks {
if made_changes { for coordinate in brick.squares() {
new_bricks.push(brick.clone()); grid.insert(coordinate, brick.clone());
} else {
let tops = under(&brick, &bbs);
if let Some(highest) = tops.iter().max_by_key(|a| a.top()) {
let new_brick = lower(brick,highest);
if new_brick != brick.clone() {
new_bricks.push(new_brick);
made_changes = true;
} else {
new_bricks.push(brick.clone());
} }
} else {
new_bricks.push(brick.clone());
} }
//println!("Bricks: {bricks:?}");
let mut changed_things = true;
while changed_things {
changed_things = false;
for brick in &mut bricks {
let mut able_to_drop_1 = true;
for (x, y, z) in brick.squares() {
if z <= 0 { able_to_drop_1 = false; }
let runs_into_something =
grid.contains_key(&(x,y,z-1)) && !brick.squares().contains(&(x,y,z-1));
able_to_drop_1 = able_to_drop_1 && !runs_into_something;
} }
if able_to_drop_1 {
for (x, y, z) in brick.squares() {
grid.remove(&(x,y,z));
} }
bricks = new_bricks; brick.start.2 -= 1;
bbs = bricks_by_shadow(&new_bricks); brick.end.2 -= 1;
for (x, y, z) in brick.squares() {
grid.insert((x, y, z), brick.clone());
} }
//println!("dropping brick {brick:?}");
changed_things = true;
println!("bricks have been dropped: {bricks:?}"); }
}
}
println!("calculating brick shadows"); println!("bricks have been dropped:");// {bricks:?}");
let brick_shadows = bricks_by_shadow(&bricks);
println!("there are {} brick shadows", brick_shadows.len());
println!("looking for disintegratbale bricks"); let mut grid: HashMap<(i32, i32, i32), Brick> = HashMap::new();
let mut disintegratable_bricks: HashSet<Brick> = HashSet::new();
for brick in &bricks { for brick in &bricks {
let mut removable = true; for coordinate in brick.squares() {
for other_brick in supported_by(brick, &brick_shadows) { grid.insert(coordinate, brick.clone());
if supporting(other_brick, &brick_shadows).len() == 1 {
removable = false;
} }
} }
if removable { println!("looking for disintegratbale bricks");
let mut disintegratable_bricks: HashSet<Brick> = HashSet::new();
for brick in &bricks {
if dependent_bricks(&HashSet::from([*brick]), &grid).len() == 0 {
disintegratable_bricks.insert(brick.clone()); disintegratable_bricks.insert(brick.clone());
} }
} }
println!("The total number of disintegratable bricks is {}", disintegratable_bricks.len()); println!("The total number of disintegratable bricks is {}", disintegratable_bricks.len());
}
fn bricks_by_shadow(bricks: &Vec<Brick>) -> HashMap<(i32, i32), Vec<&Brick>> { println!("now we're looking for chain reactions.");
let mut bricks_by_shadow: HashMap<(i32, i32), Vec<&Brick>> = HashMap::new(); let mut sum = 0;
for brick in bricks { for brick in &bricks {
for coordinate in brick.shadow() { let mut start = HashSet::from([*brick]);
if let Some(vector) = bricks_by_shadow.get_mut(&coordinate) { let mut keep_going = true;
vector.push(&brick) while keep_going {
} else { keep_going = false;
bricks_by_shadow.insert(coordinate, Vec::new()); let chain = dependent_bricks(&start, &grid);
bricks_by_shadow.get_mut(&coordinate).unwrap().push(brick); if chain.len() != 0 { keep_going = true;}
} start.extend(chain.iter());
} }
start.remove(&brick);
//println!("found a brick we could remove to immediately chain {} bricks", start.len());
sum += start.len();
} }
return bricks_by_shadow; println!("sum is {sum}");
} }
// returns a set of bricks under the specified brick fn bricks_relying_on(brick: &Brick, grid: &HashMap<(i32, i32, i32), Brick>) -> HashSet<Brick> {
fn under<'a>(brick: &Brick, let mut output = HashSet::new();
shadow_bricks: &'a HashMap<(i32, i32), Vec<&Brick>>) -> HashSet<&'a Brick>
{ for (x, y, z) in brick.squares() {
let mut unders: HashSet<&Brick> = HashSet::new(); if let Some(other_brick) = grid.get(&(x,y,z+1)) {
for c in brick.shadow() { if other_brick != brick {
let mut top_brick: Option<&Brick> = None; output.insert(other_brick.clone());
for other_brick in shadow_bricks.get(&c).unwrap() {
if other_brick.top() < brick.bottom() {
if top_brick.is_none() {
top_brick = Some(other_brick);
} else if other_brick.top() > top_brick.unwrap().top() {
top_brick = Some(other_brick);
} }
} }
} }
if top_brick.is_some() { return output;
unders.insert(top_brick.unwrap());
}
} }
return unders; fn bricks_relied_on_by(brick: &Brick, grid: &HashMap<(i32, i32, i32), Brick>) -> HashSet<Brick> {
} let mut output: HashSet<Brick> = HashSet::new();
fn supporting<'a>(brick: &Brick, shadow_bricks: &'a HashMap<(i32, i32), Vec<&Brick>>) -> HashSet<&'a Brick> { for (x, y, z) in brick.squares() {
let mut candidates: Vec<&Brick> = Vec::new(); if let Some(other_brick) = grid.get(&(x,y,z-1)) {
for coordinate in brick.shadow() { if other_brick != brick {
candidates.extend(shadow_bricks.get(&coordinate).unwrap()); output.insert(other_brick.clone());
} }
let mut output = HashSet::new();
for other_brick in candidates {
if other_brick.top() == brick.bottom() - 1 {
output.insert(other_brick);
} }
} }
return output; return output;
} }
fn supported_by<'a>(brick: &Brick, shadow_bricks: &'a HashMap<(i32, i32), Vec<&Brick>>) -> HashSet<&'a Brick> {
let mut candidates: Vec<&Brick> = Vec::new();
for coordinate in brick.shadow() {
candidates.extend(shadow_bricks.get(&coordinate).unwrap());
}
fn dependent_bricks(missing_bricks: &HashSet<Brick>, grid: &HashMap<(i32, i32, i32), Brick>) -> HashSet<Brick> {
let mut output = HashSet::new(); let mut output = HashSet::new();
for other_brick in candidates {
if other_brick.bottom() == brick.top() + 1 { for brick in missing_bricks {
let above = bricks_relying_on(brick, grid);
for other_brick in above {
let below = bricks_relied_on_by(&other_brick, grid);
if below.is_subset(missing_bricks) && !missing_bricks.contains(&other_brick) {
output.insert(other_brick); output.insert(other_brick);
} }
} }
return output;
} }
fn lower(brick: &Brick, below: &Brick) -> Brick {
let mut output = brick.clone();
let distance = brick.bottom() - below.top() - 1;
if distance > 0 {
output = Brick{start: (brick.start.0, brick.start.1, brick.start.2 - distance),
end: (brick.end.0, brick.end.1, brick.end.2 - 1)};
}
return output; return output;
} }

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save