forked from danmax/aoc
Compare commits
2 Commits
bad7dafe2b
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 522b0d364f | |||
| fbc32d12de |
6
2025/3/danmax/Cargo.toml
Normal file
6
2025/3/danmax/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "danmax"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
18
2025/3/danmax/src/main.rs
Normal file
18
2025/3/danmax/src/main.rs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
fn main() {
|
||||||
|
let raw = std::fs::read_to_string("../large.txt").unwrap();
|
||||||
|
let start = std::time::Instant::now();
|
||||||
|
let mut banks = raw.split('\n').collect::<Vec<&str>>();
|
||||||
|
banks.pop();
|
||||||
|
let mut sol = 0;
|
||||||
|
for bank in banks {
|
||||||
|
let batteries = bank.chars().map(|x| (x as u8) - 48).collect::<Vec<u8>>();
|
||||||
|
let mut combos = vec![];
|
||||||
|
for i in 0..batteries.len() - 1 {
|
||||||
|
let num = (batteries[i] * 10) + batteries[(i + 1)..batteries.len()].iter().max().unwrap();
|
||||||
|
combos.push(num);
|
||||||
|
}
|
||||||
|
sol += *combos.iter().max().unwrap() as u64;
|
||||||
|
}
|
||||||
|
let end = start.elapsed();
|
||||||
|
dbg!(sol, end);
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
use std::fs;
|
use std::fs;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
use std::ptr;
|
||||||
|
|
||||||
fn algorithm(banks: &Vec<&str>) -> (u64, u64)
|
fn algorithm(banks: &Vec<&str>) -> (u64, u64)
|
||||||
{
|
{
|
||||||
@@ -11,39 +12,20 @@ fn algorithm(banks: &Vec<&str>) -> (u64, u64)
|
|||||||
let mut joltages: [u64; 12] = [0; 12];
|
let mut joltages: [u64; 12] = [0; 12];
|
||||||
let mut highest: u64 = 0;
|
let mut highest: u64 = 0;
|
||||||
let mut overall_index = 0;
|
let mut overall_index = 0;
|
||||||
|
// part 2
|
||||||
for i in 0..=11 {
|
for i in 0..=11 {
|
||||||
for joltage in bank[prev_index..(bank_length-(11-i))].bytes() {
|
for joltage in bank[prev_index..(bank_length-(11-i))].bytes() {
|
||||||
overall_index += 1;
|
overall_index += 1;
|
||||||
if joltage == 57 {
|
if joltage as u64 > highest {
|
||||||
highest = 9;
|
|
||||||
prev_index = overall_index;
|
prev_index = overall_index;
|
||||||
break;
|
unsafe {ptr::write(&mut highest as *mut u64, joltage as u64);}
|
||||||
}
|
if joltage == 57 { break; }
|
||||||
let joltage_int = joltage ^ 48; // ASCII mask using XOR (^)
|
|
||||||
if joltage_int as u64 > highest {
|
|
||||||
prev_index = overall_index;
|
|
||||||
highest = joltage_int as u64;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
overall_index = prev_index;
|
overall_index = prev_index;
|
||||||
joltages[i] = highest as u64;
|
joltages[i] = highest ^ 48;
|
||||||
highest = 0;
|
highest = 0;
|
||||||
}
|
}
|
||||||
prev_index = 0;
|
|
||||||
for i in 0..=10 {
|
|
||||||
if joltages[i] > highest.into() {
|
|
||||||
highest = joltages[i] as u64;
|
|
||||||
prev_index = i+1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
total1 += (highest * 10) as u64;
|
|
||||||
highest = 0;
|
|
||||||
for i in prev_index..=11 {
|
|
||||||
if joltages[i] > highest.into() {
|
|
||||||
highest = joltages[i] as u64;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
total1 += (highest) as u64;
|
|
||||||
total2 += joltages[0] * 10_u64.pow(11)
|
total2 += joltages[0] * 10_u64.pow(11)
|
||||||
+ joltages[1] * 10_u64.pow(10)
|
+ joltages[1] * 10_u64.pow(10)
|
||||||
+ joltages[2] * 10_u64.pow(9)
|
+ joltages[2] * 10_u64.pow(9)
|
||||||
@@ -56,6 +38,25 @@ fn algorithm(banks: &Vec<&str>) -> (u64, u64)
|
|||||||
+ joltages[9] * 10_u64.pow(2)
|
+ joltages[9] * 10_u64.pow(2)
|
||||||
+ joltages[10] * 10_u64
|
+ joltages[10] * 10_u64
|
||||||
+ joltages[11];
|
+ joltages[11];
|
||||||
|
// part 1
|
||||||
|
prev_index = 0;
|
||||||
|
for i in 0..=10 {
|
||||||
|
if joltages[i] > highest.into() {
|
||||||
|
unsafe {ptr::write(&mut highest as *mut u64, joltages[i] as u64);}
|
||||||
|
prev_index = i+1;
|
||||||
|
if joltages[i] == 9 { break; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
total1 += highest * 10;
|
||||||
|
highest = 0;
|
||||||
|
for i in prev_index..=11 {
|
||||||
|
if joltages[i] > highest.into() {
|
||||||
|
unsafe {
|
||||||
|
ptr::write(&mut highest as *mut u64, joltages[i] as u64);}
|
||||||
|
if joltages[i] == 9 { break; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
total1 += highest;
|
||||||
}
|
}
|
||||||
|
|
||||||
(total1, total2)
|
(total1, total2)
|
||||||
@@ -66,28 +67,28 @@ fn algorithm(banks: &Vec<&str>) -> (u64, u64)
|
|||||||
// 234234234234278
|
// 234234234234278
|
||||||
// 818181911112111
|
// 818181911112111
|
||||||
fn main() {
|
fn main() {
|
||||||
let start = Instant::now();
|
|
||||||
let file_contents: String = fs::read_to_string("../large.txt").unwrap();
|
let file_contents: String = fs::read_to_string("../large.txt").unwrap();
|
||||||
|
let start = Instant::now();
|
||||||
|
|
||||||
let mut banks: Vec<&str> = file_contents
|
let mut banks: Vec<&str> = file_contents
|
||||||
.split('\n')
|
.split('\n')
|
||||||
.collect::<Vec<&str>>();
|
.collect::<Vec<&str>>();
|
||||||
banks.pop();
|
banks.pop();
|
||||||
let file_read = start.elapsed();
|
let preamble = start.elapsed();
|
||||||
|
|
||||||
let (total1, total2) = algorithm(&banks);
|
let (total1, total2) = algorithm(&banks);
|
||||||
let end = start.elapsed();
|
let end = start.elapsed();
|
||||||
|
|
||||||
let end = start.elapsed();
|
|
||||||
println!("part1: {total1}");
|
println!("part1: {total1}");
|
||||||
println!("part2: {total2}");
|
println!("part2: {total2}");
|
||||||
println!("Times:
|
println!("Times:
|
||||||
File read: {:.2?}
|
Preamble: {:.2?}
|
||||||
Loop: {:.2?}
|
Loop: {:.2?}
|
||||||
Avg time per pair: {:.2?}
|
Avg time per bank: {:.2?}
|
||||||
Total: {:.4?}
|
Total: {:.4?}
|
||||||
",
|
",
|
||||||
file_read,
|
preamble,
|
||||||
end-file_read,
|
end-preamble,
|
||||||
(end-file_read)/(10000).try_into().unwrap(),
|
(end-preamble)/(10000).try_into().unwrap(),
|
||||||
end);
|
end);
|
||||||
}
|
}
|
||||||
|
|||||||
6
2025/4/deadvey/Cargo.toml
Normal file
6
2025/4/deadvey/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "deadvey"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
124
2025/4/deadvey/src/main.rs
Normal file
124
2025/4/deadvey/src/main.rs
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
use std::fs;
|
||||||
|
use std::time::Instant;
|
||||||
|
|
||||||
|
fn remove_dem(rows: &mut Vec<Vec<char>>, i: usize, j: usize) {
|
||||||
|
rows[i][j] = 'x';
|
||||||
|
}
|
||||||
|
|
||||||
|
fn algorithm(rows: &mut Vec<Vec<char>>) -> (u64, u64) {
|
||||||
|
let mut total1: u64 = 0;
|
||||||
|
let mut total2: u64 = 0;
|
||||||
|
let grid_width: usize = rows[0].len().try_into().unwrap();
|
||||||
|
let grid_height: usize = rows.len().try_into().unwrap();
|
||||||
|
let directions = vec![(-1,0),(1,0),(0,-1),(0,1),(-1,-1),(-1,1),(1,-1),(1,1)];
|
||||||
|
let mut removed: bool = true;
|
||||||
|
let mut count: u8 = 66;
|
||||||
|
// First loop
|
||||||
|
for i in 0usize..(grid_height) {
|
||||||
|
for j in 0usize..(grid_width) {
|
||||||
|
if rows[i][j] == '@' { // @
|
||||||
|
let mut surrounded_by = 0;
|
||||||
|
for (dr, dc) in &directions {
|
||||||
|
let new_row = i as isize + dr;
|
||||||
|
let new_column = j as isize + dc;
|
||||||
|
if new_row >= grid_height as isize {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if new_row < 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if new_column >= grid_width as isize {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if new_column < 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if rows[new_row as usize][new_column as usize] == '@'
|
||||||
|
|| rows[new_row as usize][new_column as usize] == 'A'
|
||||||
|
{
|
||||||
|
surrounded_by += 1;
|
||||||
|
}
|
||||||
|
if surrounded_by >= 4 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if surrounded_by < 4 {
|
||||||
|
rows[i][j] = 'A';
|
||||||
|
total2 += 1;
|
||||||
|
total1 += 1;
|
||||||
|
removed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// All other loops
|
||||||
|
while removed {
|
||||||
|
removed = false;
|
||||||
|
for i in 0usize..(grid_height) {
|
||||||
|
for j in 0usize..(grid_width) {
|
||||||
|
if rows[i][j] == '@' { // @
|
||||||
|
let mut surrounded_by = 0;
|
||||||
|
for (dr, dc) in &directions {
|
||||||
|
let new_row = i as isize + dr;
|
||||||
|
let new_column = j as isize + dc;
|
||||||
|
if new_row >= grid_height as isize {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if new_row < 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if new_column >= grid_width as isize {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if new_column < 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if rows[new_row as usize][new_column as usize] == '@'
|
||||||
|
{
|
||||||
|
surrounded_by += 1;
|
||||||
|
}
|
||||||
|
else if rows[new_row as usize][new_column as usize] == count as char
|
||||||
|
{
|
||||||
|
surrounded_by += 1;
|
||||||
|
}
|
||||||
|
if surrounded_by >= 4 { break }
|
||||||
|
}
|
||||||
|
if surrounded_by < 4 {
|
||||||
|
rows[i][j] = count as char;
|
||||||
|
total2 += 1;
|
||||||
|
removed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
(total1, total2)
|
||||||
|
}
|
||||||
|
fn main() {
|
||||||
|
let file_contents: String = fs::read_to_string("../large.txt").unwrap();
|
||||||
|
let start = Instant::now();
|
||||||
|
let mut grid: Vec<Vec<char>> = file_contents
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.chars().collect())
|
||||||
|
.collect();
|
||||||
|
let preamble = start.elapsed();
|
||||||
|
|
||||||
|
|
||||||
|
let (total1, total2) = algorithm(&mut grid);
|
||||||
|
let end = start.elapsed();
|
||||||
|
|
||||||
|
println!("part1: {total1}");
|
||||||
|
println!("part2: {total2}");
|
||||||
|
println!("Times:
|
||||||
|
Preamble: {:.2?}
|
||||||
|
Loop: {:.2?}
|
||||||
|
Avg time per bank: {:.2?}
|
||||||
|
Total: {:.4?}
|
||||||
|
",
|
||||||
|
preamble,
|
||||||
|
end-preamble,
|
||||||
|
(end-preamble)/(grid.len()).try_into().unwrap(),
|
||||||
|
end);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user