Skip to content

Commit dd998bb

Browse files
committed
Add 3 - Raku
1 parent 8e7d609 commit dd998bb

File tree

3 files changed

+144
-0
lines changed

3 files changed

+144
-0
lines changed

2023/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ E.g. ```run.sh one```
99

1010
* 01 - Clojure
1111
* 02 - Dart
12+
* 03 - Raku

2023/three/Dockerfile

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
FROM rakudo-star:2023.08-alpine
2+
3+
WORKDIR /app
4+
5+
COPY input.txt input.txt
6+
COPY three.raku three.raku
7+
8+
CMD ["raku", "three.raku"]

2023/three/three.raku

+135
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
my @digits = (0,1,2,3,4,5,6,7,8,9);
2+
3+
sub parts($grid, $n) {
4+
my @parts = ();
5+
loop (my $x = 0; $x < $n+2; $x++) {
6+
7+
my $num = "";
8+
my $has-symbol = False;
9+
loop (my $y = 0; $y < $n+2; $y++) {
10+
11+
my $cur = $grid[$x][$y];
12+
if ($cur ~~ -1) { #symbol
13+
if ($num.chars > 0) {
14+
@parts = @parts.append: $num;
15+
$num = "";
16+
}
17+
} elsif ($cur ~~ '.') {
18+
if ($num.chars > 0) {
19+
if ($has-symbol) {
20+
@parts= @parts.append: $num;
21+
}
22+
}
23+
$num = "";
24+
$has-symbol = False;
25+
} else {
26+
$num = $num ~ $cur;
27+
$has-symbol = $has-symbol || check($grid, $x, $y);
28+
}
29+
}
30+
}
31+
return @parts.sum;
32+
}
33+
34+
sub check($grid, $x, $y) {
35+
if (($grid[$x-1][$y-1] ~~ -1)
36+
|| ($grid[$x][$y-1] ~~ -1)
37+
|| ($grid[$x+1][$y-1] ~~ -1)
38+
|| ($grid[$x-1][$y] ~~ -1)
39+
|| ($grid[$x+1][$y] ~~ -1)
40+
|| ($grid[$x-1][$y+1] ~~ -1)
41+
|| ($grid[$x][$y+1] ~~ -1)
42+
|| ($grid[$x+1][$y+1] ~~ -1)) {
43+
return True
44+
}
45+
return False;
46+
}
47+
48+
sub get-num($grid, $x, $y) {
49+
my @num = $grid[$x][$y];
50+
if ($grid[$x][$y-1] ~~ any @digits) {
51+
@num = @num.prepend: $grid[$x][$y-1];
52+
if ($grid[$x][$y-2] ~~ any @digits) {
53+
@num = @num.prepend: $grid[$x][$y-2];
54+
}
55+
}
56+
if ($grid[$x][$y+1] ~~ any @digits) {
57+
@num = @num.append: $grid[$x][$y+1];
58+
if ($grid[$x][$y+2] ~~ any @digits) {
59+
@num = @num.append: $grid[$x][$y+2];
60+
}
61+
}
62+
return @num.join('');
63+
}
64+
65+
sub unique-gears($grid, $x, $y) {
66+
my @gn = ();
67+
loop (my $i = -1; $i <= 1; $i++) {
68+
loop (my $j = -1; $j <= 1; $j++) {
69+
my $xx = $x + $i;
70+
my $yy = $y + $j;
71+
if ($grid[$xx][$yy] ~~ any @digits) {
72+
@gn = @gn.append: get-num($grid, $xx, $yy);
73+
}
74+
}
75+
}
76+
return @gn.unique;
77+
}
78+
79+
sub gears($grid, $n) {
80+
my @gears = ();
81+
loop (my $x = 0; $x < $n+2; $x++) {
82+
loop (my $y = 0; $y < $n+2; $y++) {
83+
my $cur = $grid[$x][$y];
84+
if ($cur ~~ "*") {
85+
my @gn = unique-gears($grid,$x,$y);
86+
if (@gn.elems ~~ 2) {
87+
my $pow = @gn[0] * @gn[1];
88+
@gears = @gears.append: $pow;
89+
}
90+
}
91+
}
92+
}
93+
return @gears.sum;
94+
}
95+
96+
sub padding($grid, $n) {
97+
loop (my $r = 0; $r < $n; $r++) {
98+
$grid[$r] = ($grid[$r].prepend: '.').append: '.';
99+
}
100+
my $empty = ['.' xx $n+2];
101+
return ($grid.prepend: $empty).append: $empty;
102+
}
103+
104+
105+
sub MAIN() {
106+
my $contents = "input.txt".IO.slurp;
107+
my $rows = $contents.split("\n");
108+
109+
my $n = $rows[0].chars+1;
110+
my $grid = [$n;$n] = ['.' xx $n] xx $n;
111+
my $grid-b = [$n;$n] = ['.' xx $n] xx $n;
112+
113+
loop (my $x = 0; $x < $n; $x++) {
114+
my $row = $rows[$x].split("");
115+
loop (my $y = 0; $y < $n; $y++) {
116+
my $cur = $row[$y];
117+
if !($cur ~~ '.') {
118+
if ($cur ~~ any @digits) {
119+
$grid[$x][$y] = $cur;
120+
$grid-b[$x][$y] = $cur;
121+
}
122+
else { #symbol
123+
$grid[$x][$y] = -1;
124+
if ($cur ~~ '*') {
125+
$grid-b[$x][$y] = '*';
126+
} else {
127+
$grid-b[$x][$y] = '.';
128+
}
129+
}
130+
}
131+
}
132+
}
133+
say 'A: ', parts(padding($grid,$n),$n);
134+
say 'B: ', gears(padding($grid-b,$n),$n);
135+
}

0 commit comments

Comments
 (0)