[Rust/2015/07] Add solution
This commit is contained in:
parent
a0ccda4b9f
commit
a8673cc918
3 changed files with 158 additions and 2 deletions
|
@ -83,11 +83,11 @@
|
|||
|[**19**](https://adventofcode.com/2016/day/19) [<img height=12 src=".assets/py.svg">](Python/2016/19.py "Python solution for 2016/19")|[**20**](https://adventofcode.com/2016/day/20) [<img height=12 src=".assets/py.svg">](Python/2016/20.py "Python solution for 2016/20")|[**21**](https://adventofcode.com/2016/day/21) [<img height=12 src=".assets/py.svg">](Python/2016/21.py "Python solution for 2016/21")|[**22**](https://adventofcode.com/2016/day/22) [<img height=12 src=".assets/py.svg">](Python/2016/22.py "Python solution for 2016/22")|[**23**](https://adventofcode.com/2016/day/23) [<img height=12 src=".assets/py.svg">](Python/2016/23.py "Python solution for 2016/23")|[**24**](https://adventofcode.com/2016/day/24) [<img height=12 src=".assets/py.svg">](Python/2016/24.py "Python solution for 2016/24")|[**25**](https://adventofcode.com/2016/day/25) [<img height=12 src=".assets/py.svg">](Python/2016/25.py "Python solution for 2016/25")|
|
||||
|26|27|28|29|30|31||
|
||||
|
||||
## [2015](https://adventofcode.com/2015) ([<img height=18 src=".assets/py.svg"> Python](Python/2015): 25/25 | [<img height=18 src=".assets/rs.svg"> Rust](Rust/2015): 6/25 | [<img height=18 src=".assets/ua.png"> Uiua](Uiua/2015): 5/25 | [<img height=18 src=".assets/nix.svg"> Nix](Nix/2015): 1/25 | [<img height=18 src=".assets/nu.svg"> Nu](Nu/2015): 1/25)
|
||||
## [2015](https://adventofcode.com/2015) ([<img height=18 src=".assets/py.svg"> Python](Python/2015): 25/25 | [<img height=18 src=".assets/rs.svg"> Rust](Rust/2015): 7/25 | [<img height=18 src=".assets/ua.png"> Uiua](Uiua/2015): 5/25 | [<img height=18 src=".assets/nix.svg"> Nix](Nix/2015): 1/25 | [<img height=18 src=".assets/nu.svg"> Nu](Nu/2015): 1/25)
|
||||
|Mo|Tu|We|Th|Fr|Sa|Su|
|
||||
|-|-|-|-|-|-|-|
|
||||
||[**1**](https://adventofcode.com/2015/day/1) [<img height=12 src=".assets/rs.svg">](Rust/2015/01.rs "Rust solution for 2015/01") [<img height=12 src=".assets/py.svg">](Python/2015/01.py "Python solution for 2015/01") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgotwqwuPUAoCuKKgygrMeKKl8KvMVwrKS8rCg== "Uiua solution for 2015/01") [<img height=12 src=".assets/nix.svg">](Nix/2015/01.nix "Nix solution for 2015/01") [<img height=12 src=".assets/nu.svg">](Nu/2015/01.nu "Nu solution for 2015/01")|[**2**](https://adventofcode.com/2015/day/2) [<img height=12 src=".assets/rs.svg">](Rust/2015/02.rs "Rust solution for 2015/02") [<img height=12 src=".assets/py.svg">](Python/2015/02.py "Python solution for 2015/02") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgriipwo4oqc4ouV4omgQHguKeKJoEBcbi4KCuKIqSgvKyspIOKJoeKKgygvw5d8w5cyLeKKgy_ihqUvK3zDt-KKgy_ihqUvw5d8w5cyLyviiaEvw5fil6sy4oavWzRdKQo= "Uiua solution for 2015/02")|[**3**](https://adventofcode.com/2015/day/3) [<img height=12 src=".assets/rs.svg">](Rust/2015/03.rs "Rust solution for 2015/03") [<img height=12 src=".assets/py.svg">](Python/2015/03.py "Python solution for 2015/03") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgriipc64oqZ4pa9OuKXoeKIiCI8Xj52Igriio_iiplb4peh4oipwq_iirjih4zih6EyXQoK4oqDKOKkuDHihq_iiJ5fMl8yfMKkKQriiKko4qe74pe04oqCMF8wL-KKguKJoVwrKQo= "Uiua solution for 2015/03")|[**4**](https://adventofcode.com/2015/day/4) [<img height=12 src=".assets/rs.svg">](Rust/2015/04.rs "Rust solution for 2015/04") [<img height=12 src=".assets/py.svg">](Python/2015/04.py "Python solution for 2015/04")|[**5**](https://adventofcode.com/2015/day/5) [<img height=12 src=".assets/rs.svg">](Rust/2015/05.rs "Rust solution for 2015/05") [<img height=12 src=".assets/py.svg">](Python/2015/05.py "Python solution for 2015/05") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgriipzilqHiiaBAXG4uCgpBIOKGkCAvw5db4oqDKOKJpTMvK-KIiCJhZWlvdSJ8L-KGpeKJoS894perMnzCrC_ihqXima3iiaHijJUiYWIiXyJjZCJfInBxIl8ieHkiwqQpXQpCIOKGkCDDl-KKgyjiiaUyL-KGpeKZreKJoeKmt-KXqzLin5zCpHwv4oalPeKKg-KKouKKo-KNieKXqzMpCgriiKkvK-KJoeKXh-KKg0IgQQo= "Uiua solution for 2015/05")|[**6**](https://adventofcode.com/2015/day/6) [<img height=12 src=".assets/rs.svg">](Rust/2015/06.rs "Rust solution for 2015/06") [<img height=12 src=".assets/py.svg">](Python/2015/06.py "Python solution for 2015/06") [<img height=12 src=".assets/ua.png">](https://uiua.org/pad?src=JnNjCgriipwo4oqZW-KIqeKIqeKLlV0g4o2jKAogICAg4omNIm9uIsKwJCJ0dXJuIF8gXyxfIHRocm91Z2ggXyxfIgogIHwgMsKwJCJ0b2dnbGUgXyxfIHRocm91Z2ggXyxfIikKKeKJoEBcbi4KCuKKmeKKmSjihq9bLjEwMDBdMCkKClNvbHZlISDihpAgLyvima3iiKco4o2c4oqhKF4wOikg4o2c4o2c4o2JLSjimIcx4oehKSDiipkoKzEp4oip4oqfwrBb4oqZ4oqZ4oqZ4oiYXeKKmTo6KQriioNTb2x2ZSHiqKwo4oalMC0xfCsxfCsyKSBTb2x2ZSHiqKwo4oanMHzihqUxfMKsKQo= "Uiua solution for 2015/06")|
|
||||
|[**7**](https://adventofcode.com/2015/day/7) [<img height=12 src=".assets/py.svg">](Python/2015/07.py "Python solution for 2015/07")|[**8**](https://adventofcode.com/2015/day/8) [<img height=12 src=".assets/py.svg">](Python/2015/08.py "Python solution for 2015/08")|[**9**](https://adventofcode.com/2015/day/9) [<img height=12 src=".assets/py.svg">](Python/2015/09.py "Python solution for 2015/09")|[**10**](https://adventofcode.com/2015/day/10) [<img height=12 src=".assets/py.svg">](Python/2015/10.py "Python solution for 2015/10")|[**11**](https://adventofcode.com/2015/day/11) [<img height=12 src=".assets/py.svg">](Python/2015/11.py "Python solution for 2015/11")|[**12**](https://adventofcode.com/2015/day/12) [<img height=12 src=".assets/py.svg">](Python/2015/12.py "Python solution for 2015/12")|[**13**](https://adventofcode.com/2015/day/13) [<img height=12 src=".assets/py.svg">](Python/2015/13.py "Python solution for 2015/13")|
|
||||
|[**7**](https://adventofcode.com/2015/day/7) [<img height=12 src=".assets/rs.svg">](Rust/2015/07.rs "Rust solution for 2015/07") [<img height=12 src=".assets/py.svg">](Python/2015/07.py "Python solution for 2015/07")|[**8**](https://adventofcode.com/2015/day/8) [<img height=12 src=".assets/py.svg">](Python/2015/08.py "Python solution for 2015/08")|[**9**](https://adventofcode.com/2015/day/9) [<img height=12 src=".assets/py.svg">](Python/2015/09.py "Python solution for 2015/09")|[**10**](https://adventofcode.com/2015/day/10) [<img height=12 src=".assets/py.svg">](Python/2015/10.py "Python solution for 2015/10")|[**11**](https://adventofcode.com/2015/day/11) [<img height=12 src=".assets/py.svg">](Python/2015/11.py "Python solution for 2015/11")|[**12**](https://adventofcode.com/2015/day/12) [<img height=12 src=".assets/py.svg">](Python/2015/12.py "Python solution for 2015/12")|[**13**](https://adventofcode.com/2015/day/13) [<img height=12 src=".assets/py.svg">](Python/2015/13.py "Python solution for 2015/13")|
|
||||
|[**14**](https://adventofcode.com/2015/day/14) [<img height=12 src=".assets/py.svg">](Python/2015/14.py "Python solution for 2015/14")|[**15**](https://adventofcode.com/2015/day/15) [<img height=12 src=".assets/py.svg">](Python/2015/15.py "Python solution for 2015/15")|[**16**](https://adventofcode.com/2015/day/16) [<img height=12 src=".assets/py.svg">](Python/2015/16.py "Python solution for 2015/16")|[**17**](https://adventofcode.com/2015/day/17) [<img height=12 src=".assets/py.svg">](Python/2015/17.py "Python solution for 2015/17")|[**18**](https://adventofcode.com/2015/day/18) [<img height=12 src=".assets/py.svg">](Python/2015/18.py "Python solution for 2015/18")|[**19**](https://adventofcode.com/2015/day/19) [<img height=12 src=".assets/py.svg">](Python/2015/19.py "Python solution for 2015/19")|[**20**](https://adventofcode.com/2015/day/20) [<img height=12 src=".assets/py.svg">](Python/2015/20.py "Python solution for 2015/20")|
|
||||
|[**21**](https://adventofcode.com/2015/day/21) [<img height=12 src=".assets/py.svg">](Python/2015/21.py "Python solution for 2015/21")|[**22**](https://adventofcode.com/2015/day/22) [<img height=12 src=".assets/py.svg">](Python/2015/22.py "Python solution for 2015/22")|[**23**](https://adventofcode.com/2015/day/23) [<img height=12 src=".assets/py.svg">](Python/2015/23.py "Python solution for 2015/23")|[**24**](https://adventofcode.com/2015/day/24) [<img height=12 src=".assets/py.svg">](Python/2015/24.py "Python solution for 2015/24")|[**25**](https://adventofcode.com/2015/day/25) [<img height=12 src=".assets/py.svg">](Python/2015/25.py "Python solution for 2015/25")|26|27|
|
||||
|28|29|30|31||||
|
||||
|
|
153
Rust/2015/07.rs
Normal file
153
Rust/2015/07.rs
Normal file
|
@ -0,0 +1,153 @@
|
|||
#![feature(test)]
|
||||
|
||||
use rustc_hash::FxHashMap;
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Input {
|
||||
wires: FxHashMap<String, Expr>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
enum Expr {
|
||||
Const(NameOrLiteral),
|
||||
Unary(Unary, NameOrLiteral),
|
||||
Binary(Binary, NameOrLiteral, NameOrLiteral),
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
enum NameOrLiteral {
|
||||
Name(String),
|
||||
Literal(u16),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
enum Unary {
|
||||
Not,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
enum Binary {
|
||||
And,
|
||||
Or,
|
||||
Lshift,
|
||||
Rshift,
|
||||
}
|
||||
|
||||
impl Expr {
|
||||
fn from(s: &str) -> Option<Self> {
|
||||
let mut expr = s.split_whitespace();
|
||||
let expr0 = expr.next()?;
|
||||
let expr1 = expr.next();
|
||||
let expr2 = expr.next();
|
||||
match (expr0, expr1, expr2) {
|
||||
(c, None, None) => Some(Self::Const(NameOrLiteral::from(c))),
|
||||
(op, Some(arg), None) => Some(Self::Unary(Unary::from(op)?, NameOrLiteral::from(arg))),
|
||||
(arg1, Some(op), Some(arg2)) => Some(Self::Binary(
|
||||
Binary::from(op)?,
|
||||
NameOrLiteral::from(arg1),
|
||||
NameOrLiteral::from(arg2),
|
||||
)),
|
||||
(_, None, Some(_)) => unreachable!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl NameOrLiteral {
|
||||
fn from(s: &str) -> Self {
|
||||
match s.parse() {
|
||||
Ok(lit) => Self::Literal(lit),
|
||||
Err(_) => Self::Name(s.into()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Unary {
|
||||
fn from(s: &str) -> Option<Self> {
|
||||
match s {
|
||||
"NOT" => Some(Self::Not),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn eval(self, arg: u16) -> u16 {
|
||||
match self {
|
||||
Self::Not => !arg,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Binary {
|
||||
fn from(s: &str) -> Option<Self> {
|
||||
match s {
|
||||
"AND" => Some(Self::And),
|
||||
"OR" => Some(Self::Or),
|
||||
"LSHIFT" => Some(Self::Lshift),
|
||||
"RSHIFT" => Some(Self::Rshift),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn eval(self, arg1: u16, arg2: u16) -> u16 {
|
||||
match self {
|
||||
Self::And => arg1 & arg2,
|
||||
Self::Or => arg1 | arg2,
|
||||
Self::Lshift => arg1 << arg2,
|
||||
Self::Rshift => arg1 >> arg2,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn setup(input: &str) -> Input {
|
||||
let wires = input
|
||||
.trim()
|
||||
.lines()
|
||||
.map(|line| {
|
||||
let mut split = line.split(" -> ");
|
||||
let expr = split.next().unwrap();
|
||||
let name = split.next().unwrap();
|
||||
(name.into(), Expr::from(expr).unwrap())
|
||||
})
|
||||
.collect();
|
||||
|
||||
Input { wires }
|
||||
}
|
||||
|
||||
fn simulate<'a>(input: &'a Input, mut values: FxHashMap<&'a str, u16>) -> u16 {
|
||||
fn simulate_inner<'a>(
|
||||
name: &'a str,
|
||||
values: &mut FxHashMap<&'a str, u16>,
|
||||
input: &'a Input,
|
||||
) -> u16 {
|
||||
if let Some(&value) = values.get(name) {
|
||||
return value;
|
||||
}
|
||||
|
||||
let mut resolve = |x: &'a NameOrLiteral| match x {
|
||||
NameOrLiteral::Name(name) => simulate_inner(name, values, input),
|
||||
&NameOrLiteral::Literal(value) => value,
|
||||
};
|
||||
|
||||
let value = match input.wires.get(name).unwrap() {
|
||||
Expr::Const(c) => resolve(c),
|
||||
Expr::Unary(op, arg) => op.eval(resolve(arg)),
|
||||
Expr::Binary(op, arg1, arg2) => op.eval(resolve(arg1), resolve(arg2)),
|
||||
};
|
||||
|
||||
values.insert(name, value);
|
||||
|
||||
value
|
||||
}
|
||||
|
||||
simulate_inner("a", &mut values, input)
|
||||
}
|
||||
|
||||
fn part1(input: &Input) -> u16 {
|
||||
simulate(input, Default::default())
|
||||
}
|
||||
|
||||
fn part2(input: &Input) -> u16 {
|
||||
let a = simulate(input, Default::default());
|
||||
simulate(input, [("b", a)].into_iter().collect())
|
||||
}
|
||||
|
||||
aoc::main!(2015, 7);
|
|
@ -62,6 +62,9 @@ path = "2015/05.rs"
|
|||
[[bin]]
|
||||
name = "2015_06"
|
||||
path = "2015/06.rs"
|
||||
[[bin]]
|
||||
name = "2015_07"
|
||||
path = "2015/07.rs"
|
||||
|
||||
# 2020
|
||||
[[bin]]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue