Advertisement
Guest User

day 11

a guest
Dec 11th, 2022
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 4.89 KB | None | 0 0
  1. use itertools::Itertools;
  2.  
  3. #[derive(Debug, Clone)]
  4. struct Monkey{
  5.     items: Vec<u32>,
  6.     op: op,
  7.     test: u32,
  8.     testTruePass: usize,
  9.     testFalsePass: usize
  10. }
  11.  
  12. #[derive(Debug, Clone)]
  13. enum op{
  14.     mul(u32),
  15.     add(u32),
  16.     square
  17. }
  18.  
  19.  
  20. pub fn day11_1(){
  21.     let mut monkeys = include_str!("../../input11").split("\n\n").map(|x |
  22.         {
  23.             let mut monkey = x.lines().skip(1);
  24.             let items = monkey.next().unwrap().split_at(18).1.split(", ").map(|x| x.parse::<u32>().unwrap()).collect_vec();
  25.             let opTemp = monkey.next().unwrap();
  26.             let op: op = match opTemp.as_bytes()[23] as char {
  27.                 '*' => {
  28.                     if opTemp.ends_with("old")
  29.                     {
  30.                         op::square
  31.                     }
  32.                     else {
  33.                         op::mul(opTemp.split_at(25).1.parse::<u32>().unwrap())
  34.                     }
  35.                 },
  36.                 '+' => {op::add(opTemp.split_at(25).1.parse::<u32>().unwrap())},
  37.                 _ => {panic!()}
  38.             };
  39.             let test = monkey.next().unwrap().split_at(21).1.parse::<u32>().unwrap();
  40.             let testTruePass = monkey.next().unwrap().split_at(29).1.parse::<usize>().unwrap();
  41.             let testFalsePass = monkey.next().unwrap().split_at(30).1.parse::<usize>().unwrap();
  42.             (Monkey { items, op, test, testTruePass, testFalsePass }, 0)
  43.         }).collect_vec();
  44.     for _ in 0..20 {
  45.         for i in 0..monkeys.len() {
  46.             let mut monkey = monkeys[i].0.clone();
  47.             monkeys[i].1 += monkey.items.len();
  48.             for mut item in monkey.items {
  49.                 match monkey.op {
  50.                     op::mul(a) => {item *= a}
  51.                     op::add(a) => {item += a}
  52.                     op::square => {item *= item}
  53.                 }
  54.                 item /= 3;
  55.                 if item % monkey.test == 0 {
  56.                     monkeys[monkey.testTruePass].0.items.push(item);
  57.                 }
  58.                 else {
  59.                     monkeys[monkey.testFalsePass].0.items.push(item);
  60.                 }
  61.             }
  62.             monkeys[i].0.items = Default::default();
  63.         }
  64.     }
  65.     let mut counts = monkeys.iter().map(|&(_, i)| i ).collect_vec();
  66.     counts.sort();
  67.     counts.reverse();
  68.     println!("{}", counts[0] * counts[1]);
  69. }
  70.  
  71.  
  72. #[derive(Debug, Clone)]
  73. struct Monkey2{
  74.     items: Vec<u64>,
  75.     op: op2,
  76.     test: u64,
  77.     testTruePass: usize,
  78.     testFalsePass: usize
  79. }
  80.  
  81. #[derive(Debug, Clone)]
  82. enum op2{
  83.     mul(u64),
  84.     add(u64),
  85.     square
  86. }
  87. // i have to keep track of all the modulo not the actual number, for all of the primes somehow
  88. pub fn day11_2(){
  89.     //hardcoding the divisor tests for now
  90.     let mut magicNum: u64 = 1;
  91.     let mut monkeys = include_str!("../../input11").split("\n\n").map(|x |
  92.         {
  93.             let mut monkey = x.lines().skip(1);
  94.             let items = monkey.next().unwrap().split_at(18).1.split(", ").map(|x| x.parse::<u64>().unwrap()).collect_vec();
  95.             let opTemp = monkey.next().unwrap();
  96.             let op: op2 = match opTemp.as_bytes()[23] as char {
  97.                 '*' => {
  98.                     if opTemp.ends_with("old")
  99.                     {
  100.                         op2::square
  101.                     }
  102.                     else {
  103.                         op2::mul(opTemp.split_at(25).1.parse::<u64>().unwrap())
  104.                     }
  105.                 },
  106.                 '+' => {op2::add(opTemp.split_at(25).1.parse::<u64>().unwrap())},
  107.                 _ => {panic!()}
  108.             };
  109.             let test = monkey.next().unwrap().split_at(21).1.parse::<u64>().unwrap();
  110.             let testTruePass = monkey.next().unwrap().split_at(29).1.parse::<usize>().unwrap();
  111.             let testFalsePass = monkey.next().unwrap().split_at(30).1.parse::<usize>().unwrap();
  112.             magicNum *= test;
  113.             (Monkey2 { items, op, test, testTruePass, testFalsePass }, 0)
  114.         }).collect_vec();
  115.     for _ in 0..10000 {
  116.         for i in 0..monkeys.len() {
  117.             let mut monkey = monkeys[i].0.clone();
  118.             monkeys[i].1 += monkey.items.len();
  119.             for mut item in monkey.items {
  120.                 item %= magicNum;
  121.                 match monkey.op {
  122.                     op2::mul(a) => {item *= a}
  123.                     op2::add(a) => {item += a}
  124.                     op2::square => {item *= item}
  125.                 }
  126.                 if item % monkey.test == 0 {
  127.                     monkeys[monkey.testTruePass].0.items.push(item);
  128.                 }
  129.                 else {
  130.                     monkeys[monkey.testFalsePass].0.items.push(item);
  131.                 }
  132.             }
  133.             monkeys[i].0.items = Default::default();
  134.         }
  135.     }
  136.     let mut counts = monkeys.iter().map(|&(_, i)| i ).collect_vec();
  137.     counts.sort();
  138.     counts.reverse();
  139.     println!("{}", counts[0] * counts[1]);
  140.  
  141. }
  142.  
  143.  
  144.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement