day7: added
This commit is contained in:
parent
0171ee6758
commit
fc31940164
12
Cargo.toml
12
Cargo.toml
|
@ -4,18 +4,6 @@ version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
default-run = "main"
|
default-run = "main"
|
||||||
|
|
||||||
[profile.dev]
|
|
||||||
opt-level = 3
|
|
||||||
debug = false
|
|
||||||
strip = false
|
|
||||||
debug-assertions = false
|
|
||||||
overflow-checks = false
|
|
||||||
lto = false
|
|
||||||
panic = 'unwind'
|
|
||||||
incremental = false
|
|
||||||
codegen-units = 16
|
|
||||||
rpath = false
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ureq = { version = "2.9.1" }
|
ureq = { version = "2.9.1" }
|
||||||
|
|
||||||
|
|
167
src/day7/1.rs
167
src/day7/1.rs
|
@ -1 +1,166 @@
|
||||||
const INPUTS: [&'static str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")];
|
#![feature(test)]
|
||||||
|
|
||||||
|
use std::cmp::Ordering;
|
||||||
|
|
||||||
|
extern crate test;
|
||||||
|
|
||||||
|
const INPUTS: [&str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")];
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Card {
|
||||||
|
val: String,
|
||||||
|
ttype: SetType,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Eq, PartialEq, Clone, Copy)]
|
||||||
|
enum SetType {
|
||||||
|
Five = 7,
|
||||||
|
Four = 6,
|
||||||
|
FullHouse = 5,
|
||||||
|
Three = 4,
|
||||||
|
Two = 3,
|
||||||
|
One = 2,
|
||||||
|
High = 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn process(data: &str) -> u64 {
|
||||||
|
let mut answer = 0;
|
||||||
|
|
||||||
|
let mut cards = vec![];
|
||||||
|
|
||||||
|
for data in data.lines() {
|
||||||
|
if data.is_empty() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let (card, value) = data.split_at(6);
|
||||||
|
let card = card.trim();
|
||||||
|
|
||||||
|
let mut arr = [0; 255];
|
||||||
|
|
||||||
|
for c in card.bytes() {
|
||||||
|
arr[c as usize] += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
let ttype = if arr.iter().any(|&x| x == 5) {
|
||||||
|
SetType::Five
|
||||||
|
} else if arr.iter().any(|&x| x == 4) && arr.iter().any(|&x| x == 1) {
|
||||||
|
SetType::Four
|
||||||
|
} else if arr.iter().any(|&x| x == 3) && arr.iter().any(|&x| x == 2) {
|
||||||
|
SetType::FullHouse
|
||||||
|
} else if arr.iter().any(|&x| x == 3) && arr.iter().filter(|&&x| x == 1).count() == 2 {
|
||||||
|
SetType::Three
|
||||||
|
} else if arr.iter().filter(|&&x| x == 2).count() == 2
|
||||||
|
&& arr.iter().filter(|&&x| x == 1).count() == 1
|
||||||
|
{
|
||||||
|
SetType::Two
|
||||||
|
} else if arr.iter().filter(|&&x| x == 2).count() == 1
|
||||||
|
&& arr.iter().filter(|&&x| x == 1).count() == 3
|
||||||
|
{
|
||||||
|
SetType::One
|
||||||
|
} else if arr.iter().all(|&x| x == 0 || x == 1) {
|
||||||
|
SetType::High
|
||||||
|
} else {
|
||||||
|
unreachable!()
|
||||||
|
};
|
||||||
|
|
||||||
|
cards.push((
|
||||||
|
Card {
|
||||||
|
val: card.to_string(),
|
||||||
|
ttype,
|
||||||
|
},
|
||||||
|
value,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
cards.sort_unstable_by(|(a, _), (b, _)| match (a.ttype, b.ttype) {
|
||||||
|
(x, y) if x == y => {
|
||||||
|
for (a, b) in a.val.chars().zip(b.val.chars()) {
|
||||||
|
let ordering = cmp(a, b);
|
||||||
|
|
||||||
|
if ordering != Ordering::Equal {
|
||||||
|
return ordering;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ordering::Equal
|
||||||
|
}
|
||||||
|
(x, y) => {
|
||||||
|
let x = x as u8;
|
||||||
|
let y = y as u8;
|
||||||
|
|
||||||
|
x.cmp(&y)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for (i, (_, v)) in cards.into_iter().enumerate() {
|
||||||
|
let v = v.parse::<u64>().unwrap();
|
||||||
|
let i = i + 1;
|
||||||
|
|
||||||
|
answer += v * i as u64;
|
||||||
|
}
|
||||||
|
|
||||||
|
answer
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cmp(a: char, b: char) -> Ordering {
|
||||||
|
if let Ordering::Equal = a.cmp(&b) {
|
||||||
|
return Ordering::Equal;
|
||||||
|
}
|
||||||
|
|
||||||
|
match (a, b) {
|
||||||
|
('A', _) => Ordering::Greater,
|
||||||
|
(_, 'A') => Ordering::Less,
|
||||||
|
|
||||||
|
('K', _) => Ordering::Greater,
|
||||||
|
(_, 'K') => Ordering::Less,
|
||||||
|
|
||||||
|
('Q', _) => Ordering::Greater,
|
||||||
|
(_, 'Q') => Ordering::Less,
|
||||||
|
|
||||||
|
('J', _) => Ordering::Greater,
|
||||||
|
(_, 'J') => Ordering::Less,
|
||||||
|
|
||||||
|
('T', _) => Ordering::Greater,
|
||||||
|
(_, 'T') => Ordering::Less,
|
||||||
|
|
||||||
|
('9', _) => Ordering::Greater,
|
||||||
|
(_, '9') => Ordering::Less,
|
||||||
|
|
||||||
|
('8', _) => Ordering::Greater,
|
||||||
|
(_, '8') => Ordering::Less,
|
||||||
|
|
||||||
|
('7', _) => Ordering::Greater,
|
||||||
|
(_, '7') => Ordering::Less,
|
||||||
|
|
||||||
|
('6', _) => Ordering::Greater,
|
||||||
|
(_, '6') => Ordering::Less,
|
||||||
|
|
||||||
|
('5', _) => Ordering::Greater,
|
||||||
|
(_, '5') => Ordering::Less,
|
||||||
|
|
||||||
|
('4', _) => Ordering::Greater,
|
||||||
|
(_, '4') => Ordering::Less,
|
||||||
|
|
||||||
|
('3', _) => Ordering::Greater,
|
||||||
|
(_, '3') => Ordering::Less,
|
||||||
|
|
||||||
|
('2', _) => Ordering::Greater,
|
||||||
|
(_, '2') => Ordering::Less,
|
||||||
|
|
||||||
|
(_, _) => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
for input in INPUTS.iter() {
|
||||||
|
println!("total = {}", process(input));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn part2(b: &mut test::Bencher) {
|
||||||
|
b.iter(|| {
|
||||||
|
let v = process(INPUTS[1]);
|
||||||
|
test::black_box(v);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
192
src/day7/2.rs
192
src/day7/2.rs
|
@ -1 +1,191 @@
|
||||||
const INPUTS: [&'static str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")];
|
#![feature(test)]
|
||||||
|
|
||||||
|
use std::cmp::Ordering;
|
||||||
|
|
||||||
|
extern crate test;
|
||||||
|
|
||||||
|
const INPUTS: [&str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")];
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Card {
|
||||||
|
val: String,
|
||||||
|
ttype: SetType,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Eq, PartialEq, Clone, Copy)]
|
||||||
|
enum SetType {
|
||||||
|
Five = 7,
|
||||||
|
Four = 6,
|
||||||
|
FullHouse = 5,
|
||||||
|
Three = 4,
|
||||||
|
Two = 3,
|
||||||
|
One = 2,
|
||||||
|
High = 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn process(data: &str) -> u64 {
|
||||||
|
let mut answer = 0;
|
||||||
|
|
||||||
|
let mut cards = vec![];
|
||||||
|
|
||||||
|
for data in data.lines() {
|
||||||
|
if data.is_empty() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let (card, value) = data.split_at(6);
|
||||||
|
let card = card.trim();
|
||||||
|
|
||||||
|
let mut arr = [0; 255];
|
||||||
|
|
||||||
|
for c in card.bytes() {
|
||||||
|
arr[c as usize] += 1;
|
||||||
|
}
|
||||||
|
let count = arr['J' as u8 as usize];
|
||||||
|
|
||||||
|
let ttype = if arr.iter().any(|&x| x == 5) {
|
||||||
|
SetType::Five
|
||||||
|
} else if arr.iter().any(|&x| x == 4) && arr.iter().any(|&x| x == 1) {
|
||||||
|
if count == 4 || count == 1 {
|
||||||
|
SetType::Five
|
||||||
|
} else {
|
||||||
|
SetType::Four
|
||||||
|
}
|
||||||
|
} else if arr.iter().any(|&x| x == 3) && arr.iter().any(|&x| x == 2) {
|
||||||
|
if count == 3 || count == 2 {
|
||||||
|
SetType::Five
|
||||||
|
} else {
|
||||||
|
SetType::FullHouse
|
||||||
|
}
|
||||||
|
} else if arr.iter().any(|&x| x == 3) && arr.iter().filter(|&&x| x == 1).count() == 2 {
|
||||||
|
if count == 3 || count == 1 {
|
||||||
|
SetType::Four
|
||||||
|
} else {
|
||||||
|
SetType::Three
|
||||||
|
}
|
||||||
|
} else if arr.iter().filter(|&&x| x == 2).count() == 2
|
||||||
|
&& arr.iter().filter(|&&x| x == 1).count() == 1
|
||||||
|
{
|
||||||
|
if count == 2 {
|
||||||
|
SetType::Four
|
||||||
|
} else if count == 1 {
|
||||||
|
SetType::FullHouse
|
||||||
|
} else {
|
||||||
|
SetType::Two
|
||||||
|
}
|
||||||
|
} else if arr.iter().filter(|&&x| x == 2).count() == 1
|
||||||
|
&& arr.iter().filter(|&&x| x == 1).count() == 3
|
||||||
|
{
|
||||||
|
if count == 2 || count == 1 {
|
||||||
|
SetType::Three
|
||||||
|
} else {
|
||||||
|
SetType::One
|
||||||
|
}
|
||||||
|
} else if arr.iter().all(|&x| x == 0 || x == 1) {
|
||||||
|
if count == 1 {
|
||||||
|
SetType::One
|
||||||
|
} else {
|
||||||
|
SetType::High
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
unreachable!()
|
||||||
|
};
|
||||||
|
|
||||||
|
cards.push((
|
||||||
|
Card {
|
||||||
|
val: card.to_string(),
|
||||||
|
ttype,
|
||||||
|
},
|
||||||
|
value.parse::<u64>().unwrap(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
cards.sort_unstable_by(|(a, _), (b, _)| match (a.ttype, b.ttype) {
|
||||||
|
(x, y) if x == y => {
|
||||||
|
for (a, b) in a.val.chars().zip(b.val.chars()) {
|
||||||
|
let ordering = cmp(a, b);
|
||||||
|
|
||||||
|
if ordering != Ordering::Equal {
|
||||||
|
return ordering;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ordering::Equal
|
||||||
|
}
|
||||||
|
(x, y) => {
|
||||||
|
let x = x as u8;
|
||||||
|
let y = y as u8;
|
||||||
|
|
||||||
|
x.cmp(&y)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for (i, (_, v)) in cards.into_iter().enumerate() {
|
||||||
|
let i = i + 1;
|
||||||
|
|
||||||
|
answer += v * i as u64;
|
||||||
|
}
|
||||||
|
|
||||||
|
answer
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cmp(a: char, b: char) -> Ordering {
|
||||||
|
if let Ordering::Equal = a.cmp(&b) {
|
||||||
|
return Ordering::Equal;
|
||||||
|
}
|
||||||
|
|
||||||
|
match (a, b) {
|
||||||
|
('A', _) => Ordering::Greater,
|
||||||
|
(_, 'A') => Ordering::Less,
|
||||||
|
|
||||||
|
('K', _) => Ordering::Greater,
|
||||||
|
(_, 'K') => Ordering::Less,
|
||||||
|
|
||||||
|
('Q', _) => Ordering::Greater,
|
||||||
|
(_, 'Q') => Ordering::Less,
|
||||||
|
|
||||||
|
('T', _) => Ordering::Greater,
|
||||||
|
(_, 'T') => Ordering::Less,
|
||||||
|
|
||||||
|
('9', _) => Ordering::Greater,
|
||||||
|
(_, '9') => Ordering::Less,
|
||||||
|
|
||||||
|
('8', _) => Ordering::Greater,
|
||||||
|
(_, '8') => Ordering::Less,
|
||||||
|
|
||||||
|
('7', _) => Ordering::Greater,
|
||||||
|
(_, '7') => Ordering::Less,
|
||||||
|
|
||||||
|
('6', _) => Ordering::Greater,
|
||||||
|
(_, '6') => Ordering::Less,
|
||||||
|
|
||||||
|
('5', _) => Ordering::Greater,
|
||||||
|
(_, '5') => Ordering::Less,
|
||||||
|
|
||||||
|
('4', _) => Ordering::Greater,
|
||||||
|
(_, '4') => Ordering::Less,
|
||||||
|
|
||||||
|
('3', _) => Ordering::Greater,
|
||||||
|
(_, '3') => Ordering::Less,
|
||||||
|
|
||||||
|
('2', _) => Ordering::Greater,
|
||||||
|
(_, '2') => Ordering::Less,
|
||||||
|
|
||||||
|
('J', _) => Ordering::Greater,
|
||||||
|
(_, 'J') => Ordering::Less,
|
||||||
|
|
||||||
|
(_, _) => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
for input in INPUTS.iter() {
|
||||||
|
println!("total = {}", process(input));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[bench]
|
||||||
|
fn part2(b: &mut test::Bencher) {
|
||||||
|
b.iter(|| {
|
||||||
|
let v = process(INPUTS[1]);
|
||||||
|
test::black_box(v);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
1000
src/day7/input.txt
Normal file
1000
src/day7/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
5
src/day7/sample.txt
Normal file
5
src/day7/sample.txt
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
32T3K 765
|
||||||
|
T55J5 684
|
||||||
|
KK677 28
|
||||||
|
KTJJT 220
|
||||||
|
QQQJA 483
|
Loading…
Reference in New Issue
Block a user