day8: added
This commit is contained in:
parent
503bbd176a
commit
10a38b6f3b
|
@ -1,54 +1,64 @@
|
||||||
#![feature(byte_slice_trim_ascii)]
|
#![feature(slice_split_once)]
|
||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
|
|
||||||
use std::{cmp::Ordering, collections::HashMap};
|
use std::collections::HashMap;
|
||||||
|
|
||||||
extern crate test;
|
extern crate test;
|
||||||
|
|
||||||
const INPUTS: [&str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")];
|
const INPUTS: [&[u8]; 2] = [
|
||||||
|
// RL
|
||||||
|
//
|
||||||
|
// AAA = (BBB, CCC)
|
||||||
|
// BBB = (DDD, EEE)
|
||||||
|
// CCC = (ZZZ, GGG)
|
||||||
|
// DDD = (DDD, DDD)
|
||||||
|
// EEE = (EEE, EEE)
|
||||||
|
// GGG = (GGG, GGG)
|
||||||
|
// ZZZ = (ZZZ, ZZZ)
|
||||||
|
&[
|
||||||
|
82, 76, 10, 10, 65, 65, 65, 32, 61, 32, 40, 66, 66, 66, 44, 32, 67, 67, 67, 41, 10, 66, 66,
|
||||||
|
66, 32, 61, 32, 40, 68, 68, 68, 44, 32, 69, 69, 69, 41, 10, 67, 67, 67, 32, 61, 32, 40, 90,
|
||||||
|
90, 90, 44, 32, 71, 71, 71, 41, 10, 68, 68, 68, 32, 61, 32, 40, 68, 68, 68, 44, 32, 68, 68,
|
||||||
|
68, 41, 10, 69, 69, 69, 32, 61, 32, 40, 69, 69, 69, 44, 32, 69, 69, 69, 41, 10, 71, 71, 71,
|
||||||
|
32, 61, 32, 40, 71, 71, 71, 44, 32, 71, 71, 71, 41, 10, 90, 90, 90, 32, 61, 32, 40, 90, 90,
|
||||||
|
90, 44, 32, 90, 90, 90, 41,
|
||||||
|
],
|
||||||
|
include_bytes!("./input.txt"),
|
||||||
|
];
|
||||||
|
|
||||||
fn process(data: &str) -> usize {
|
fn process(data: &[u8]) -> usize {
|
||||||
let mut answer = 0;
|
let (seq, remain) = data.split_once(|&x| x == b'\n').unwrap();
|
||||||
|
|
||||||
let mut data = data.split("\n\n");
|
|
||||||
|
|
||||||
let seq: Vec<char> = data.next().map(|x| x.chars().collect()).unwrap();
|
|
||||||
|
|
||||||
let mut map = HashMap::new();
|
let mut map = HashMap::new();
|
||||||
|
|
||||||
for line in data.next().unwrap().lines() {
|
for line in remain.split(|&x| x == b'\n').skip(1) {
|
||||||
let (start, remain) = line.split_once(" = ").unwrap();
|
if line.is_empty() {
|
||||||
|
continue;
|
||||||
let (l, r) = remain.split_once(',').unwrap();
|
}
|
||||||
let l: String = l.chars().filter(|x| x.is_ascii_alphabetic()).collect();
|
let (start, remain) = line.split_at(3);
|
||||||
let r: String = r.chars().filter(|x| x.is_ascii_alphabetic()).collect();
|
let (l, r) = (&remain[4..7], &remain[9..12]);
|
||||||
|
|
||||||
map.insert(start, (l, r));
|
map.insert(start, (l, r));
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut i = 0;
|
let mut pos: &[u8] = &[b'A', b'A', b'A'];
|
||||||
let mut pos = "AAA";
|
|
||||||
|
|
||||||
loop {
|
for (i, ins) in seq.iter().cycle().enumerate() {
|
||||||
let step = seq[i % seq.len()];
|
if pos == [b'Z', b'Z', b'Z'] {
|
||||||
if pos == "ZZZ" {
|
return i;
|
||||||
return answer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let (l, r) = map.get(&pos).unwrap();
|
let (l, r) = map.get(&pos).unwrap();
|
||||||
|
|
||||||
println!("pos = {} l = {} r = {}", pos, l, r);
|
match ins {
|
||||||
match step {
|
b'L' => pos = l,
|
||||||
'R' => pos = r,
|
b'R' => pos = r,
|
||||||
'L' => pos = l,
|
|
||||||
_ => unreachable!(),
|
_ => (),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
answer += 1;
|
0
|
||||||
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
answer
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,70 +1,82 @@
|
||||||
#![feature(byte_slice_trim_ascii)]
|
#![feature(slice_split_once)]
|
||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
|
|
||||||
use std::{cmp::Ordering, collections::HashMap};
|
use std::collections::HashMap;
|
||||||
|
|
||||||
extern crate test;
|
extern crate test;
|
||||||
|
|
||||||
const INPUTS: [&str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")];
|
const INPUTS: [&[u8]; 2] = [
|
||||||
|
include_bytes!("./sample.txt"),
|
||||||
|
include_bytes!("./input.txt"),
|
||||||
|
];
|
||||||
|
|
||||||
fn process(data: &str) -> usize {
|
fn process(data: &[u8]) -> usize {
|
||||||
let mut answer = 0;
|
let (seq, remain) = data.split_once(|&x| x == b'\n').unwrap();
|
||||||
|
|
||||||
let mut data = data.split("\n\n");
|
|
||||||
|
|
||||||
let seq: Vec<char> = data.next().map(|x| x.chars().collect()).unwrap();
|
|
||||||
|
|
||||||
let mut map = HashMap::new();
|
let mut map = HashMap::new();
|
||||||
|
|
||||||
for line in data.next().unwrap().lines() {
|
for line in remain.split(|&x| x == b'\n').skip(1) {
|
||||||
let (start, remain) = line.split_once(" = ").unwrap();
|
if line.is_empty() {
|
||||||
|
continue;
|
||||||
let (l, r) = remain.split_once(',').unwrap();
|
}
|
||||||
let l: String = l.chars().filter(|x| x.is_ascii_alphabetic()).collect();
|
let (start, remain) = line.split_at(3);
|
||||||
let r: String = r.chars().filter(|x| x.is_ascii_alphabetic()).collect();
|
let (l, r) = (&remain[4..7], &remain[9..12]);
|
||||||
|
|
||||||
map.insert(start, (l, r));
|
map.insert(start, (l, r));
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut i = 0;
|
let mut a_set = vec![];
|
||||||
let mut pos = "AAA";
|
|
||||||
|
|
||||||
let mut stack = vec![];
|
for &k in map
|
||||||
|
.keys()
|
||||||
|
.filter(|x| x.last().map_or(false, |&b| b == b'A'))
|
||||||
|
{
|
||||||
|
a_set.push(k);
|
||||||
|
}
|
||||||
|
|
||||||
for k in map.keys() {
|
let mut tmp = Vec::with_capacity(a_set.len());
|
||||||
if k.ends_with('A') {
|
|
||||||
stack.push((k.clone(), seq[0]));
|
'outer: for mut node in a_set {
|
||||||
|
for (i, ins) in seq.iter().cycle().enumerate() {
|
||||||
|
if node.last().map_or(false, |&b| b == b'Z') {
|
||||||
|
tmp.push(i);
|
||||||
|
continue 'outer;
|
||||||
|
}
|
||||||
|
|
||||||
|
let (l, r) = map.get(node).unwrap();
|
||||||
|
|
||||||
|
match ins {
|
||||||
|
b'L' => node = l,
|
||||||
|
b'R' => node = r,
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("{:?}", stack);
|
lcm(&tmp)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn lcm(a: &[usize]) -> usize {
|
||||||
|
let mut answer = a[0];
|
||||||
|
|
||||||
|
for &num in a.iter().skip(1) {
|
||||||
|
answer = (num * answer) / (gcd(num, answer));
|
||||||
|
}
|
||||||
|
|
||||||
// loop {
|
|
||||||
// let step = seq[i % seq.len()];
|
|
||||||
// if pos == "ZZZ" {
|
|
||||||
// return answer;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// let (l, r) = map.get(&pos).unwrap();
|
|
||||||
//
|
|
||||||
// println!("pos = {} l = {} r = {}", pos, l, r);
|
|
||||||
// match step {
|
|
||||||
// 'R' => pos = r,
|
|
||||||
// 'L' => pos = l,
|
|
||||||
// _ => unreachable!(),
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// answer += 1;
|
|
||||||
//
|
|
||||||
// i += 1;
|
|
||||||
// }
|
|
||||||
answer
|
answer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
const fn gcd(a: usize, b: usize) -> usize {
|
||||||
|
if b == 0 {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
gcd(b, a % b)
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
for input in INPUTS.iter() {
|
for input in INPUTS.iter() {
|
||||||
println!("total = {}", process(input));
|
println!("total = {}", process(input));
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
RL
|
LR
|
||||||
|
|
||||||
AAA = (BBB, CCC)
|
11A = (11B, XXX)
|
||||||
BBB = (DDD, EEE)
|
11B = (XXX, 11Z)
|
||||||
CCC = (ZZZ, GGG)
|
11Z = (11B, XXX)
|
||||||
DDD = (DDD, DDD)
|
22A = (22B, XXX)
|
||||||
EEE = (EEE, EEE)
|
22B = (22C, 22C)
|
||||||
GGG = (GGG, GGG)
|
22C = (22Z, 22Z)
|
||||||
ZZZ = (ZZZ, ZZZ)
|
22Z = (22B, 22B)
|
||||||
|
XXX = (XXX, XXX)
|
Loading…
Reference in New Issue
Block a user