this post was submitted on 02 Dec 2024
14 points (100.0% liked)

NotAwfulTech

385 readers
4 users here now

a community for posting cool tech news you don’t want to sneer at

non-awfulness of tech is not required or else we wouldn’t have any posts

founded 1 year ago
MODERATORS
 

copy pasting the rules from last year's thread:

Rules: no spoilers.

The other rules are made up aswe go along.

Share code by link to a forge, home page, pastebin (Eric Wastl has one here) or code section in a comment.

you are viewing a single comment's thread
view the rest of the comments
[–] mii@awful.systems 1 points 1 week ago

Day 2, Part 1

use strict;
use List::Util qw( min max );

open(FH, '<', $ARGV[0]) or die $!;
my @lines;
while (<FH>) {
	my @report = split /\s/, $_;
	push @lines, \@report;
}

close FH;

sub in_range {
	my $diff = max($_[0], $_[1]) - min($_[0], $_[1]);
	return $diff >= 1 && $diff <= 3;
}

sub is_safe {
	my $prev = @$_[0];
	my $dir = 0;

	for (my $i = 1; $i < scalar @$_; ++$i) {
		my $el = @$_[$i];
		if ($el > $prev) {
			return 0 unless $dir >= 0;
			$dir = 1;
		} elsif ($el < $prev) {
			return 0 unless $dir <= 0;
			$dir = -1;
		}

		return 0 unless in_range $prev, $el;
		$prev = $el;
	}

	return 1;
}

sub part1 {
	my $safe_reports = 0;

	foreach (@_) {
		$safe_reports++ if is_safe @$_;
	}

	return $safe_reports;
}

print 'Part 1: ', part1(@lines), "\n";
My part 2 solution didn't work with the real input but worked with all the test cases I threw at it, so I couldn't figure out what was wrong with it and I'm too lazy to debug any more right now.