Compare commits
2
Commits
0089f4337c
...
0f9d48314e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0f9d48314e | ||
|
|
14fc032ffc |
No files matched your search
@@ -0,0 +1 @@
|
|||||||
|
109,4795,21102,1,3124,1,21101,13,0,0,1105,1,1424,21101,0,166,1,21102,24,1,0,1105,1,1234,21102,31,1,0,1105,1,1984,1105,1,13,6,4,3,2,52,51,21,4,28,56,55,3,19,-9,-10,47,89,88,90,90,6,77,73,85,71,1,76,68,63,65,22,-27,70,76,81,87,5,105,105,107,108,95,4,97,92,109,109,5,110,105,110,108,95,4,115,96,109,109,13,-3,59,101,85,92,97,13,84,80,92,78,34,-15,26,-16,46,88,72,79,84,0,72,76,-3,85,74,79,75,-8,64,68,75,57,65,70,64,66,72,8,-41,32,-22,56,77,82,-4,60,76,62,70,-2,74,-11,55,52,68,67,73,56,60,52,-20,44,56,66,-24,48,58,42,49,54,-16,-53,10,0,56,99,96,95,82,94,83,45,-9,23,-13,61,85,88,74,71,82,73,79,73,89,67,65,-4,62,73,70,69,56,68,57,2,-35,24,-14,64,85,90,4,70,67,79,7,83,-2,68,75,-5,78,65,57,75,-10,76,53,76,0,-37,31,-21,57,78,83,-3,64,74,72,0,76,-9,73,58,57,-13,70,57,49,67,-18,54,64,48,55,-23,48,44,56,42,-14,-51,14,-4,74,95,100,14,97,77,86,79,9,92,79,75,5,27,-17,61,82,87,1,68,78,76,4,80,-5,66,58,78,60,-10,73,60,52,70,-15,57,67,51,58,-6,-43,14,-4,74,95,100,14,81,94,90,90,9,92,79,75,5,60,-50,23,42,38,-32,38,39,30,42,47,-38,30,36,28,25,41,38,34,31,18,23,29,19,33,-52,20,29,-55,27,27,27,8,15,-61,22,16,-64,24,13,18,-54,-69,-70,-14,7,12,-74,-8,-11,1,-71,5,-80,-4,-3,3,-15,-84,-85,-109,29,-19,59,80,85,-1,82,62,71,64,-6,77,64,60,-10,62,66,57,59,63,57,67,51,-19,56,58,57,57,-10,-47,44,-34,39,58,54,-16,60,61,57,64,48,56,-23,52,40,60,38,-28,44,53,-31,55,32,55,-35,48,42,41,-39,32,38,42,-42,-44,12,33,38,-48,28,19,25,32,-52,-76,-77,59,-49,13,55,-30,42,51,-33,49,50,32,31,31,39,36,48,-42,24,35,32,34,29,21,35,19,25,37,-53,14,10,26,18,-57,-59,-3,18,23,-63,1,17,3,-67,1,-4,14,-2,6,-73,-8,14,-76,-12,-78,-40,2,4,-13,-82,-106,-107,35,-25,53,74,79,0,74,60,-10,65,53,72,64,52,56,52,50,-19,53,57,62,56,-24,58,54,38,39,40,-29,-31,2,56,35,-34,-58,-59,138,-128,-74,-108,-33,-31,-26,-44,-101,-114,-33,-37,-51,-39,-35,-47,-54,-122,-37,-45,-52,-59,-58,-128,-46,-65,-42,-49,-133,-132,-102,-60,-68,-56,-55,-139,-141,-106,-61,-65,-72,-78,-64,-148,-70,-72,-151,-68,-81,-81,-72,-156,-74,-86,-86,-80,-161,-97,-81,-95,-165,-94,-98,-103,-83,-97,-102,-90,-173,-90,-103,-111,-99,-178,-95,-108,-112,-182,-115,-115,-101,-117,-120,-104,-120,-122,-191,-106,-128,-118,-110,-127,-196,-196,-199,-135,-123,-134,-203,-115,-126,-121,-207,-143,-127,-141,-211,-143,-139,-145,-148,-132,-148,-150,-219,-154,-156,-155,-148,-224,-141,-147,-227,-144,-157,-161,-231,-165,-161,-165,-168,-161,-157,-159,-166,-162,-157,-228,-265,138,-128,-74,-108,-33,-31,-26,-44,-101,-114,-33,-37,-51,-39,-35,-47,-54,-122,-37,-45,-52,-59,-58,-128,-46,-65,-42,-49,-133,-132,-102,-60,-68,-56,-55,-139,-141,-106,-61,-65,-72,-78,-64,-148,-70,-72,-151,-68,-81,-81,-72,-156,-74,-86,-86,-80,-161,-97,-81,-95,-165,-90,-94,-97,-97,-86,-102,-90,-173,-90,-103,-111,-99,-178,-95,-108,-112,-182,-115,-115,-101,-117,-120,-104,-120,-122,-191,-106,-128,-118,-110,-127,-196,-196,-199,-135,-123,-134,-203,-115,-126,-121,-207,-143,-127,-141,-211,-143,-139,-145,-148,-132,-148,-150,-219,-154,-156,-155,-148,-224,-141,-147,-227,-144,-157,-161,-231,-165,-161,-165,-168,-161,-157,-159,-166,-162,-157,-228,-265,263,-253,-199,-233,-158,-156,-151,-169,-226,-239,-158,-162,-176,-164,-160,-172,-179,-247,-162,-170,-177,-184,-183,-253,-171,-190,-167,-174,-258,-257,-227,-183,-197,-187,-175,-182,-193,-184,-268,-202,-191,-194,-192,-197,-205,-191,-207,-276,-278,-222,-201,-196,-282,-206,-219,-196,-286,-207,-206,-210,-223,-222,-223,-225,-280,-293,-296,-232,-220,-231,-300,-212,-223,-218,-304,-236,-228,-223,-239,-227,-310,-227,-240,-244,-314,-248,-237,-250,-243,-239,-247,-237,-308,-345,-273,-260,-248,-243,-263,-329,-252,-252,-248,-260,-267,-266,-253,-337,-249,-260,-255,-259,-342,-260,-267,-280,-270,-271,-348,-281,-268,-272,-279,-285,-342,-355,-280,-278,-279,-284,-277,-361,-282,-278,-274,-275,-290,-298,-300,-369,-300,-292,-290,-373,-309,-375,-299,-298,-301,-310,-302,-297,-370,-383,-302,-316,-321,-311,-315,-299,-321,-308,-392,-306,-322,-330,-312,-397,-326,-334,-317,-401,-330,-338,-324,-325,-337,-329,-339,-341,-398,-411,-347,-335,-346,-415,-334,-352,-350,-346,-341,-338,-422,-334,-345,-340,-344,-427,-345,-357,-357,-351,-432,-365,-361,-353,-367,-370,-354,-363,-351,-427,-464,-441,-397,-373,-434,-447,-376,-380,-374,-375,-373,-452,-454,-398,-377,-372,-458,-376,-388,-382,-377,-387,-396,-465,-400,-398,-468,-404,-404,-395,-403,-473,-390,-396,-476,-406,-409,-395,-480,-408,-404,-483,-418,-396,-486,-403,-399,-409,-417,-413,-421,-493,37,-5,73,71,-8,75,62,58,-12,62,55,74,64,48,50,-19,45,63,-22,61,48,44,-26,50,37,44,48,-31,33,40,48,41,43,30,37,-25,-38,-63,0,0,109,7,21102,0,1,-2,22208,-2,-5,-1,1205,-1,1169,22202,-2,-4,1,22201,1,-6,1,22101,0,-2,2,21101,0,1162,0,2105,1,-3,21201,-2,1,-2,1105,1,1136,109,-7,2105,1,0,109,6,2102,1,-5,1181,21001,0,0,-2,21101,0,0,-3,21201,-5,1,-5,22208,-3,-2,-1,1205,-1,1229,2201,-5,-3,1204,21002,0,1,1,21201,-3,0,2,21202,-2,1,3,21102,1,1222,0,2106,0,-4,21201,-3,1,-3,1106,0,1192,109,-6,2105,1,0,109,2,22101,0,-1,1,21102,1,1256,2,21102,1,1251,0,1106,0,1174,109,-2,2105,1,0,109,5,22201,-4,-3,-1,22201,-2,-1,-1,204,-1,109,-5,2106,0,0,109,3,1202,-2,1,1280,1006,0,1303,1Line truncated
|
||||||
+1
-1
@@ -3,5 +3,5 @@ extern crate core;
|
|||||||
mod tasks;
|
mod tasks;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
tasks::day23::run();
|
tasks::day16::run();
|
||||||
}
|
}
|
||||||
+111
-63
@@ -1,16 +1,30 @@
|
|||||||
use itertools::Itertools;
|
use std::collections::HashMap;
|
||||||
use num_integer::Integer;
|
|
||||||
use std::iter;
|
use std::iter;
|
||||||
|
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
const BASE_PATTERN: [i32; 4] = [0, 1, 0, -1];
|
||||||
const INPUT: &str = "59750530221324194853012320069589312027523989854830232144164799228029162830477472078089790749906142587998642764059439173975199276254972017316624772614925079238407309384923979338502430726930592959991878698412537971672558832588540600963437409230550897544434635267172603132396722812334366528344715912756154006039512272491073906389218927420387151599044435060075148142946789007756800733869891008058075303490106699737554949348715600795187032293436328810969288892220127730287766004467730818489269295982526297430971411865028098708555709525646237713045259603175397623654950719275982134690893685598734136409536436003548128411943963263336042840301380655801969822";
|
const INPUT: &str = "59750530221324194853012320069589312027523989854830232144164799228029162830477472078089790749906142587998642764059439173975199276254972017316624772614925079238407309384923979338502430726930592959991878698412537971672558832588540600963437409230550897544434635267172603132396722812334366528344715912756154006039512272491073906389218927420387151599044435060075148142946789007756800733869891008058075303490106699737554949348715600795187032293436328810969288892220127730287766004467730818489269295982526297430971411865028098708555709525646237713045259603175397623654950719275982134690893685598734136409536436003548128411943963263336042840301380655801969822";
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub fn run() {
|
pub fn run() {
|
||||||
let input = to_digits(INPUT);
|
let input = to_digits(INPUT);
|
||||||
task1(input.clone());
|
task1(input.clone());
|
||||||
|
task2(to_digits("02935109699940807407585447034323"));
|
||||||
task2(input.clone());
|
task2(input.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn task1(input: Vec<V>) -> String {
|
||||||
|
let mut s = S { input, cache: HashMap::new() };
|
||||||
|
s.prep();
|
||||||
|
let result = format!("{:.*}", 8, (0..8).map(|position| {
|
||||||
|
let r = s.get(position, 100);
|
||||||
|
r
|
||||||
|
}).join(""));
|
||||||
|
println!("Task 1: {result}");
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
fn to_digits(input: &str) -> Vec<i32> {
|
fn to_digits(input: &str) -> Vec<i32> {
|
||||||
input
|
input
|
||||||
.chars()
|
.chars()
|
||||||
@@ -18,71 +32,88 @@ fn to_digits(input: &str) -> Vec<i32> {
|
|||||||
.collect_vec()
|
.collect_vec()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn task1(input: Vec<i32>) -> String {
|
fn task2(input: Vec<i32>) -> String {
|
||||||
let p = [0, 1, 0, -1];
|
let big_input = iter::repeat(input.clone().into_iter())
|
||||||
let result = (0..100).fold(input, |old, _| {
|
.take(10_000)
|
||||||
(1..=old.len())
|
.flatten()
|
||||||
.map(|position| {
|
.collect_vec();
|
||||||
let pattern = p
|
|
||||||
.iter()
|
let mut s = S { input: big_input, cache: HashMap::new() };
|
||||||
.map(|x| std::iter::repeat(*x).take(position))
|
let result_position = format!("{}", input.split_at(7).0.iter().join("")).parse::<usize>().unwrap();
|
||||||
.flatten();
|
s.prep_after(result_position);
|
||||||
let val: i32 = old
|
let result = format!("{:.*}", 8, (0..8).map(|position| {
|
||||||
.iter()
|
let r = s.get(position + result_position, 100);
|
||||||
.zip(std::iter::repeat(pattern).flatten().skip(1))
|
r
|
||||||
.map(|(value, multiplier)| value * multiplier)
|
}).join(""));
|
||||||
.sum();
|
|
||||||
val.abs() % 10
|
println!("Task 2: {result}");
|
||||||
})
|
|
||||||
.collect_vec()
|
|
||||||
});
|
|
||||||
let result = format!("{:.*}", 8, result.iter().join(""));
|
|
||||||
println!("Task 1: {result}");
|
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
fn task2(input: Vec<i32>) -> String {
|
type V = i32;
|
||||||
let l = input.len() * 10_000;
|
|
||||||
let big_input = iter::repeat(input.clone().into_iter())
|
|
||||||
.flatten()
|
|
||||||
.take(l)
|
|
||||||
.collect_vec();
|
|
||||||
let p = [0, 1, 0, -1];
|
|
||||||
let result = (0..100).fold(big_input, |old, _| {
|
|
||||||
(1..=old.len())
|
|
||||||
.map(|position| {
|
|
||||||
let pattern = p.iter().map(|x| iter::repeat(*x).take(position)).flatten();
|
|
||||||
let iter = iter::repeat(pattern).flatten().skip(1);
|
|
||||||
let repeats_after = (4 * position).lcm(&input.len());
|
|
||||||
if repeats_after > l {
|
|
||||||
l
|
|
||||||
} else {
|
|
||||||
repeats_after
|
|
||||||
};
|
|
||||||
let part: i32 = iter::repeat(input.iter())
|
|
||||||
.flatten()
|
|
||||||
.zip(iter.clone())
|
|
||||||
.take(repeats_after)
|
|
||||||
.map(|(value, multiplier)| value * multiplier)
|
|
||||||
.sum();
|
|
||||||
let part_fits = l / repeats_after;
|
|
||||||
let most_parts = part * part_fits as i32;
|
|
||||||
|
|
||||||
let number_rest = l / repeats_after;
|
struct S {
|
||||||
let part_rest: i32 = iter
|
input: Vec<V>,
|
||||||
.zip(iter::repeat(input.iter()).flatten())
|
cache: HashMap<(usize, usize), V>,
|
||||||
.take(number_rest)
|
}
|
||||||
.map(|(value, multiplier)| value * multiplier)
|
|
||||||
.sum();
|
|
||||||
|
|
||||||
(part_rest + most_parts) % 10
|
impl S {
|
||||||
})
|
fn pattern(&self, position: usize, size: usize) -> Vec<i32> {
|
||||||
.collect_vec()
|
let pattern = BASE_PATTERN.iter().map(|x| iter::repeat(*x).take(position)).flatten();
|
||||||
});
|
let iter = iter::repeat(pattern).flatten().skip(1).take(size);
|
||||||
let offset = input[0..7].iter().join("").parse::<usize>().unwrap();
|
iter.collect()
|
||||||
let message = result[offset..offset + 8].iter().join("");
|
}
|
||||||
println!("Task 2: {}", message);
|
|
||||||
message
|
fn get(&mut self, index: usize, phase: usize) -> V {
|
||||||
|
if phase == 0 {
|
||||||
|
return self.input[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.cache.contains_key(&(phase, index)) {
|
||||||
|
return self.cache[&(phase, index)];
|
||||||
|
}
|
||||||
|
|
||||||
|
if index == self.input.len() - 1 {
|
||||||
|
let v = self.get(index, phase - 1);
|
||||||
|
self.cache.insert((phase, index), v);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
if index > (self.input.len() / 2 + 1) {
|
||||||
|
let v = self.get(index + 1, phase) + self.get(index, phase - 1);
|
||||||
|
let v = v.abs() % 10;
|
||||||
|
self.cache.insert((phase, index), v);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
let pattern = self.pattern(index + 1, self.input.len());
|
||||||
|
let val: i32 = pattern
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(i, p)| if *p == 0 { 0 } else { *p * self.get(i, phase - 1) })
|
||||||
|
.sum();
|
||||||
|
let result = val.abs() % 10;
|
||||||
|
self.cache.insert((phase, index), result);
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn prep(&mut self) {
|
||||||
|
for phase in 1..=100 {
|
||||||
|
for i in 1..self.input.len() / 2 {
|
||||||
|
self.get(self.input.len() - i, phase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("preparation done")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn prep_after(&mut self, start: usize) {
|
||||||
|
for phase in 1..=100 {
|
||||||
|
for i in (start..self.input.len()).rev() {
|
||||||
|
self.get(i, phase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("preparation done")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@@ -104,13 +135,30 @@ mod test {
|
|||||||
"52432133"
|
"52432133"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_part_1_solution() {
|
fn test_part_1_solution() {
|
||||||
assert_eq!(task1(to_digits(INPUT)), "84487724");
|
assert_eq!(task1(to_digits(INPUT)), "84487724");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_part_2() {
|
fn test_part_2_solution() {
|
||||||
|
assert_eq!(task2(to_digits(INPUT)), "84692524");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_trivial() {
|
||||||
|
let mut s = S { input: to_digits("12345678"), cache: HashMap::new() };
|
||||||
|
s.prep();
|
||||||
|
let result = format!("{:.*}", 8, (0..8).map(|position| {
|
||||||
|
let r = s.get(position, 1);
|
||||||
|
r
|
||||||
|
}).join(""));
|
||||||
|
assert_eq!(result, "48226158");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part_2_examples() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
task2(to_digits("02935109699940807407585447034323")),
|
task2(to_digits("02935109699940807407585447034323")),
|
||||||
"78725270"
|
"78725270"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ use std::collections::VecDeque;
|
|||||||
|
|
||||||
use crate::tasks::day05::{IntCodeComputer, load_ram, RAM};
|
use crate::tasks::day05::{IntCodeComputer, load_ram, RAM};
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn run() {
|
pub fn run() {
|
||||||
let ram = load_ram("input/day23.txt");
|
let ram = load_ram("input/day23.txt");
|
||||||
part1(ram.clone());
|
part1(ram.clone());
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
use std::io;
|
||||||
|
|
||||||
|
use crate::tasks::day05::{IntCodeComputer, load_ram};
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub fn run() {
|
||||||
|
let ram = load_ram("input/day25.txt");
|
||||||
|
let mut computer = IntCodeComputer::new(vec![], ram);
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let done = computer.run_until_input_empty();
|
||||||
|
println!("{}", to_ascii(computer.get_output()));
|
||||||
|
computer.clear_output();
|
||||||
|
|
||||||
|
if done {
|
||||||
|
println!("Game Over");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let input = read_line();
|
||||||
|
computer.set_input(&input);
|
||||||
|
}
|
||||||
|
|
||||||
|
// needed items:
|
||||||
|
// fixed point
|
||||||
|
// polygon
|
||||||
|
// candy cane
|
||||||
|
// shell
|
||||||
|
|
||||||
|
// result: 136839232
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_ascii(output: &[i128]) -> String {
|
||||||
|
output.iter().map(|i| (*i as u8) as char).collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_line() -> Vec<i128> {
|
||||||
|
let mut buffer = String::new();
|
||||||
|
io::stdin().read_line(&mut buffer).unwrap();
|
||||||
|
if !buffer.is_ascii() {
|
||||||
|
panic!("'{}' is not ascii input", buffer);
|
||||||
|
}
|
||||||
|
buffer.chars().map(|c| c as i128).collect()
|
||||||
|
}
|
||||||
@@ -22,3 +22,4 @@ pub mod day21;
|
|||||||
pub mod day22;
|
pub mod day22;
|
||||||
pub mod day23;
|
pub mod day23;
|
||||||
pub mod day24;
|
pub mod day24;
|
||||||
|
pub mod day25;
|
||||||
Reference in new issue
Block a user