day7 done i guess

master
Avril 3 years ago
parent 8c72063cd4
commit f94c6c48cc
Signed by: flanchan
GPG Key ID: 284488987C31F630

@ -11,13 +11,14 @@ INCLUDE=$(shell pwd)/common/include
COMMON_FLAGS=-pipe -O3 -Wall -Wextra -Wstrict-aliasing -pedantic $(COMMON_OPT_FLAGS)
RUSTFLAGS+=-C target-cpu=native
CFLAGS+=$(COMMON_FLAGS) --std=gnu11 $(C_OPT_FLAGS)
CXXFLAGS+=$(COMMON_FLAGS) --std=gnu++20 $(CXX_OPT_FLAGS)
LDFLAGS+=$(LD_OPT_FLAGS)
DAYS= $(wildcard day*)
ENV= CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" INCLUDE="$(INCLUDE)"
ENV= CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" INCLUDE="$(INCLUDE)" RUSTFLAGS="$(RUSTFLAGS)"
.PHONY: all

@ -1,6 +1,8 @@
CARGO_FEATURE_FLAGS?=
RUSTFLAGS?=-C target-cpu=native
.PHONY: all
.NOTPARALLEL: all
all:
@ -9,13 +11,13 @@ all:
.NOTPARALLEL: part1
part1: $(wildcard src/*.rs)
cargo build --release $(addprefix --features ,$(CARGO_FEATURE_FLAGS))
RUSTFLAGS="$(RUSTFLAGS)" cargo build --release $(addprefix --features ,$(CARGO_FEATURE_FLAGS))
mv -f target/release/day4 $@
strip $@
.NOTPARALLEL: part2
part2: $(wildcard src/*.rs)
cargo build --release --features $@ $(addprefix --features ,$(CARGO_FEATURE_FLAGS))
RUSTFLAGS="$(RUSTFLAGS)" cargo build --release --features $@ $(addprefix --features ,$(CARGO_FEATURE_FLAGS))
mv -f target/release/day4 $@
strip $@

@ -7,6 +7,8 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[features]
part2 = []
test = []
[dependencies]

@ -0,0 +1,24 @@
CARGO_FEATURE_FLAGS?=
RUSTFLAGS?=-C target-cpu=native
.PHONY: all
.NOTPARALLEL: all
all:
$(MAKE) part1
$(MAKE) part2
.NOTPARALLEL: part1
part1: $(wildcard src/*.rs)
RUSTFLAGS="$(RUSTFLAGS)" cargo build --release $(addprefix --features ,$(CARGO_FEATURE_FLAGS))
mv -f target/release/day7 $@
strip $@
.NOTPARALLEL: part2
part2: $(wildcard src/*.rs)
RUSTFLAGS="$(RUSTFLAGS)" cargo build --release --features $@ $(addprefix --features ,$(CARGO_FEATURE_FLAGS))
mv -f target/release/day7 $@
strip $@
clean:
rm -f part{1,2}

@ -35,6 +35,10 @@ impl Hash for Rule {
impl Rule
{
pub fn children(&self) -> &[(usize, BagRef)]
{
self.contains.as_slice()
}
#[inline] pub fn name(&self) -> &str
{
&self.bag[..]
@ -43,7 +47,7 @@ impl Rule
/// Find the rules for each inner bag within this context
pub fn inner_rules<'a>(&'a self, hashes: &'a Bags) -> impl Iterator<Item = &'a Rule> + 'a
{
self.contains.iter().filter_map(move |(n, re)| Some(std::iter::repeat(hashes.get(re)?).take(*n))).flatten()
self.contains.iter().filter_map(move |(_, re)| hashes.get(re))
}
#[inline] pub fn new(bag: impl Into<String>, contains: impl IntoIterator<Item = (usize, String)>) -> Self
{

@ -0,0 +1,53 @@
#![feature(str_split_once)]
#![allow(dead_code)]
use std::{
io::BufReader,
fs::OpenOptions,
collections::HashSet,
};
#[cfg(feature="test")]
const INPUT: &str ="input-test";
#[cfg(not(feature="test"))]
const INPUT: &str = "input";
const NEEDLE: &str = "shiny gold";
mod parse;
mod bag;
fn cnt_rules(rule: &bag::Rule, set: &HashSet<bag::Rule>) -> usize
{
match rule.children() {
&[] => 0,
children => {
children.iter().map(|(n, b)| *n + (*n * cnt_rules(set.get(b).unwrap(), set))).sum::<usize>()
},
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let parsed: HashSet<_> = parse::parse(BufReader::new(OpenOptions::new().read(true).open(INPUT)?)).collect();
#[cfg(not(feature="part2"))]
{
let mut found=0;
for rule in parsed.iter() {
#[cfg(debug_assertions)]
eprintln!("{:?}", rule);
if rule.name() != NEEDLE {
if rule.all_rules(&parsed).search(NEEDLE).is_some() {
found +=1;
}
}
}
println!("{}", found);
}
#[cfg(feature="part2")] println!("{}", cnt_rules(parsed.get(NEEDLE).unwrap(), &parsed));
Ok(())
}

@ -1,64 +0,0 @@
#![feature(str_split_once)]
#![allow(dead_code)]
use std::{
io::BufReader,
fs::OpenOptions,
collections::HashSet,
};
#[cfg(feature="test")]
const INPUT: &str ="input-test2";
#[cfg(not(feature="test"))]
const INPUT: &str = "input";
const NEEDLE: &str = "shiny gold";
mod parse;
mod bag;
fn cnt_rules(rule: &bag::Rule, set: &HashSet<bag::Rule>) -> usize
{
let mut already_done: HashSet<&bag::Rule> = HashSet::new();
rule.all_rules(set).map(|x| {
let mut o = cnt_rules(x, set) + x.inner_rules(set).count();
if already_done.insert(x) || true {
if o > 0 {
eprintln!("{:?} -> {}", x, o);
o+=1;
} else if !already_done.contains(x) {
eprintln!("{:?} -> {}", x ,1);
return 1;
}
o
} else {
0
}
}).sum()
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let parsed: HashSet<_> = parse::parse(BufReader::new(OpenOptions::new().read(true).open(INPUT)?)).collect();
let mut found=0;
for rule in parsed.iter() {
#[cfg(debug_assertions)]
eprintln!("{:?}", rule);
if rule.name() != NEEDLE {
if rule.all_rules(&parsed).search(NEEDLE).is_some() {
found +=1;
}
}
}
println!("{}", found);
//#[cfg(feature="part2")]
{
println!("{}", cnt_rules(parsed.get(NEEDLE).unwrap(), &parsed));
}
Ok(())
}
Loading…
Cancel
Save