Update: Ada is back and banned them, im refederating
Ategon
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()));
}
Im not sure how lemm.ee handles it but a lot of instances that aren't lemm.ee dont have uploads disabled
For example this post has an image uploaded to .world
I dug through the code and turns out the post read table does store when its read (with number of comments when it was read stored in a person post aggregates table), it just only stores it for people from your instance so I cant get accurate numbers from all of lemmy (and why it seemed like there was a low amount)
The 118k is half year aka 6 months
The one around 35k is month
Dont have access to those stats in the database so adding on voting is the best I can do
Theres a post read table but its only people who have explicitly marked something as read and is way less than the post likes
had some trolls who made an account there and started spamming nsfl content in a bunch of comment sections