]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 2: complicated conditionals
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Mon, 2 Dec 2024 05:29:12 +0000 (06:29 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Mon, 2 Dec 2024 05:29:12 +0000 (06:29 +0100)
2024/03.pl [new file with mode: 0755]
2024/04.pl [new file with mode: 0755]

diff --git a/2024/03.pl b/2024/03.pl
new file mode 100755 (executable)
index 0000000..ef9e4fd
--- /dev/null
@@ -0,0 +1,26 @@
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my $safe;
+
+LEVEL:
+while (<>) {
+       my $inc;
+       my $prev;
+       for (/\d+/g) {
+               if (defined $prev) {
+                       next LEVEL if abs($prev - $_) > 3;
+                       next LEVEL if abs($prev - $_) < 1;
+                       if (defined $inc) {
+                               next LEVEL if $inc && $_ < $prev;
+                               next LEVEL if !$inc && $_ > $prev;
+                       }
+                       $inc = $_ > $prev;
+               }
+               $prev = $_;
+       }
+       $safe++;
+}
+
+say $safe;
diff --git a/2024/04.pl b/2024/04.pl
new file mode 100755 (executable)
index 0000000..f04bbd4
--- /dev/null
@@ -0,0 +1,42 @@
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my $safe;
+
+LEVEL:
+while (<>) {
+       my @l = /\d+/g;
+       if (is_safe(@l)) {
+               $safe++;
+               next LEVEL;
+       }
+       for my $i (0 .. $#l) {
+               my @l1 = @l;
+               splice (@l1, $i, 1);
+               if (is_safe(@l1)) {
+                       $safe++;
+                       next LEVEL;
+               }
+       }
+}
+
+say $safe;
+       
+sub is_safe {
+       my $inc;
+       my $prev;
+       for (@_) {
+               if (defined $prev) {
+                       return 0 if abs($prev - $_) > 3;
+                       return 0 if abs($prev - $_) < 1;
+                       if (defined $inc) {
+                               return 0 if $inc && $_ < $prev;
+                               return 0 if !$inc && $_ > $prev;
+                       }
+                       $inc = $_ > $prev;
+               }
+               $prev = $_;
+       }
+       return 1;
+}