Improvement I found afterwards:
- Could have done a reduce on the amount array instead of the lines array since I don't use the line value at all
Improvement I found afterwards:
[JavaScript] Swapped over to javascript from rust since I want to also practice some js. Managed to get part 1 in 4 minutes and got top 400 on the global leaderboard. Second part took a bit longer and took me 13 mins since I messed up by originally trying to append to the card array. (eventually swapped to keeping track of amounts in a separate array)
Part 1
// Part 1
// ======
function part1(input) {
const lines = input.split("\n");
let sum = 0;
for (const line of lines) {
const content = line.split(":")[1];
const winningNums = content.split("|")[0].match(/\d+/g);
const myNums = content.split("|")[1].match(/\d+/g);
let cardSum = 0;
for (const num of winningNums) {
if (myNums.includes(num)) {
if (cardSum == 0) {
cardSum = 1;
} else {
cardSum = cardSum * 2;
}
}
}
sum = sum + cardSum;
}
return sum;
}
Part 2
// Part 2
// ======
function part2(input) {
let lines = input.split("\n");
let amount = Array(lines.length).fill(1);
for (const [i, line] of lines.entries()) {
const content = line.split(":")[1];
const winningNums = content.split("|")[0].match(/\d+/g);
const myNums = content.split("|")[1].match(/\d+/g);
let cardSum = 0;
for (const num of winningNums) {
if (myNums.includes(num)) {
cardSum += 1;
}
}
for (let j = 1; j <= cardSum; j++) {
if (i + j >= lines.length) {
break;
}
amount[i + j] += amount[i];
}
}
return lines.reduce((acc, line, i) => {
return acc + amount[i];
}, 0);
}
yeah that was updated a bit ago to let first requests be free. Looks like for some reason this post didnt federate to p.d until recently though
~~Ill check out the code later in the week~~ Edit: exams are taking too much of my time, maybe after exams
had some trolls who made an account there and started spamming nsfl content in a bunch of comment sections
Update: Ada is back and banned them, im refederating
Ive temporarily defederated programming.dev from blahaj until the spam wave is sorted and deleted all the comments so we shouldnt get any more of them
When the accounts are dealt with im refederating
Im going to temporarily defederate for now until they get the spam bot problem under control but once the admin comes online and gets everything sorted im refererating
Lemmy doesn't handle certain characters well currently such as left angle brackets and ampersands due to some sanitization in the back end to stop scripting attacks
[Rust] Harder one today, for part 1 I ended up getting stuck for a bit since I wasnt taking numbers at the end of lines into account and in part 2 I defined my gears vector in the wrong spot and spent a bit debugging that
Code
(lemmy removes some chars, all chars are in code link)
use std::fs;
fn part1(input: String) -> u32 {
let lines = input.lines().collect::>();
let mut sum = 0;
for i in 0..lines.len() {
let mut num = 0;
let mut valid = false;
let chars = lines[i].chars().collect::>();
for j in 0..chars.len() {
let character = chars[j];
let parts = ['*', '#', '+', '$', '/', '%', '=', '-', '&', '@'];
if character.is_digit(10) {
num = num * 10 + character.to_digit(10).unwrap();
if i > 0 {
if parts.contains(&lines[i - 1].chars().collect::>()[j]) {
valid = true;
}
if j > 0 {
if parts.contains(&lines[i - 1].chars().collect::>()[j - 1]) {
valid = true;
}
}
if j < chars.len() - 1 {
if parts.contains(&lines[i - 1].chars().collect::>()[j + 1]) {
valid = true;
}
}
}
if i < lines.len() - 1 {
if parts.contains(&lines[i + 1].chars().collect::>()[j]) {
valid = true;
}
if j > 0 {
if parts.contains(&lines[i + 1].chars().collect::>()[j - 1]) {
valid = true;
}
}
if j < chars.len() - 1 {
if parts.contains(&lines[i + 1].chars().collect::>()[j + 1]) {
valid = true;
}
}
}
if j > 0 {
if parts.contains(&lines[i].chars().collect::>()[j - 1]) {
valid = true;
}
}
if j < chars.len() - 1 {
if parts.contains(&lines[i].chars().collect::>()[j + 1]) {
valid = true;
}
}
}
else {
if valid == true {
sum += num;
}
num = 0;
valid = false;
}
if j == chars.len() - 1 {
if valid == true {
sum += num;
}
num = 0;
valid = false;
}
}
}
return sum;
}
fn part2(input: String) -> u32 {
let lines = input.lines().collect::>();
let mut gears: Vec<(usize, usize, u32)> = Vec::new();
let mut sum = 0;
for i in 0..lines.len() {
let mut num = 0;
let chars = lines[i].chars().collect::>();
let mut pos: (usize, usize) = (0, 0);
let mut valid = false;
for j in 0..chars.len() {
let character = chars[j];
let parts = ['*'];
if character.is_digit(10) {
num = num * 10 + character.to_digit(10).unwrap();
if i > 0 {
if parts.contains(&lines[i - 1].chars().collect::>()[j]) {
valid = true;
pos = (i - 1, j);
}
if j > 0 {
if parts.contains(&lines[i - 1].chars().collect::>()[j - 1]) {
valid = true;
pos = (i - 1, j - 1);
}
}
if j < chars.len() - 1 {
if parts.contains(&lines[i - 1].chars().collect::>()[j + 1]) {
valid = true;
pos = (i - 1, j + 1);
}
}
}
if i < lines.len() - 1 {
if parts.contains(&lines[i + 1].chars().collect::>()[j]) {
valid = true;
pos = (i + 1, j);
}
if j > 0 {
if parts.contains(&lines[i + 1].chars().collect::>()[j - 1]) {
valid = true;
pos = (i + 1, j - 1);
}
}
if j < chars.len() - 1 {
if parts.contains(&lines[i + 1].chars().collect::>()[j + 1]) {
valid = true;
pos = (i + 1, j + 1);
}
}
}
if j > 0 {
if parts.contains(&lines[i].chars().collect::>()[j - 1]) {
valid = true;
pos = (i, j - 1);
}
}
if j < chars.len() - 1 {
if parts.contains(&lines[i].chars().collect::>()[j + 1]) {
valid = true;
pos = (i, j + 1);
}
}
}
else {
if valid == true {
let mut current_gear = false;
for gear in &gears {
if gear.0 == pos.0 && gear.1 == pos.1 {
sum += num * gear.2;
current_gear = true;
break;
}
}
if !current_gear {
let tuple_to_push = (pos.0.clone(), pos.1.clone(), num.clone());
gears.push((pos.0.clone(), pos.1.clone(), num.clone()));
}
}
num = 0;
valid = false;
}
if j == chars.len() - 1 {
if valid == true {
let mut current_gear = false;
for gear in &gears {
if gear.0 == pos.0 && gear.1 == pos.1 {
sum += num * gear.2;
current_gear = true;
break;
}
}
if !current_gear {
let tuple_to_push = (pos.0.clone(), pos.1.clone(), num.clone());
gears.push((pos.0.clone(), pos.1.clone(), num.clone()));
}
}
num = 0;
valid = false;
}
}
}
return sum;
}
fn main() {
let input = fs::read_to_string("data/input.txt").unwrap();
println!("{}", part1(input.clone()));
println!("{}", part2(input.clone()));
}
Zoomed out graph including some months before the join wave
Users/month are relatively stable now at 33x users/month compared to pre join wave (users/month is people who have posted or commented)
Rust (Rank 7421/6311) (Time after start 00:32:27/00:35:35)
Extremely easy part 2 today, I would say easier than part 1 but they share the same sort of framework
Code Block
(Note lemmy removed some characters, code link shows them all)
use std::fs;
fn part1(input: String) -> i32 {
const RED: i32 = 12;
const GREEN: i32 = 13;
const BLUE: i32 = 14;
let mut sum = 0;
for line in input.lines() {
let [id, content] = line.split(": ").collect::>()[0..2] else { continue };
let id = id.split(" ").collect::>()[1].parse::().unwrap();
let marbles = content.split("; ").map(|x| { x.split(", ").collect::>() }).collect::>>();
let mut valid = true;
for selection in marbles {
for marble in selection {
let marble_split = marble.split(" ").collect::>();
let marble_amount = marble_split[0].parse::().unwrap();
let marble_color = marble_split[1];
if marble_color == "red" && marble_amount > RED {
valid = false;
break;
}
if marble_color == "green" && marble_amount > GREEN {
valid = false;
break;
}
if marble_color == "blue" && marble_amount > BLUE {
valid = false;
break;
}
}
}
if !valid {
continue;
}
sum += id;
}
return sum;
}
fn part2(input: String) -> i32 {
let mut sum = 0;
for line in input.lines() {
let [id, content] = line.split(": ").collect::>()[0..2] else { continue };
let id = id.split(" ").collect::>()[1].parse::().unwrap();
let marbles = content.split("; ").map(|x| { x.split(", ").collect::>() }).collect::>>();
let mut red = 0;
let mut green = 0;
let mut blue = 0;
for selection in marbles {
for marble in selection {
let marble_split = marble.split(" ").collect::>();
let marble_amount = marble_split[0].parse::().unwrap();
let marble_color = marble_split[1];
if marble_color == "red" && marble_amount > red {
red = marble_amount;
}
if marble_color == "green" && marble_amount > green {
green = marble_amount;
}
if marble_color == "blue" && marble_amount > blue {
blue = marble_amount;
}
}
}
sum += red * green * blue;
}
return sum;
}
fn main() {
let input = fs::read_to_string("data/input.txt").unwrap();
println!("{}", part1(input.clone()));
println!("{}", part2(input.clone()));
}
Stretch mode scale should do that, its what it was made for. The only things I changed are the two you can see on the right there