aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-060/mark-anderson/raku/ch-1.raku49
1 files changed, 35 insertions, 14 deletions
diff --git a/challenge-060/mark-anderson/raku/ch-1.raku b/challenge-060/mark-anderson/raku/ch-1.raku
index 5ad393a053..c8d3b23d61 100644
--- a/challenge-060/mark-anderson/raku/ch-1.raku
+++ b/challenge-060/mark-anderson/raku/ch-1.raku
@@ -1,25 +1,46 @@
#!/usr/bin/env raku
-my %letter;
-my %number;
+sub from-excel(Str $str) {
+ my $num;
-my $number = 1;
-my $letter = "A";
+ my @letters = $str.comb;
-loop {
- last if $number > 16384;
+ my $exp = @letters.keys.max;
- %letter{$number} = $letter;
- %number{$letter} = $number;
+ for @letters {
+ $num += ($_.ord - 64) * (26 ** $exp--);
+ }
- $number++;
- $letter++;
+ $num;
}
-multi sub MAIN (Str $str where $str.all ~~ /<[A..Z]>/) {
- say %number{$str};
+sub to-excel(UInt $num is copy) {
+ my $string;
+ my $quotient;
+ my $remainder;
+ my @letters = ("A" .. "Z");
+
+ while $num > 26 {
+ $quotient = ($num / 26).Int;
+ $remainder = $num % 26;
+
+ if $remainder == 0 {
+ $quotient--;
+ $remainder = 26;
+ }
+
+ $string ~= @letters[$remainder - 1];
+ $num = $quotient;
+ }
+
+ $string ~= @letters[$num - 1];
+ $string.flip;
+}
+
+multi sub MAIN (Str $str where $str ~~ /^<[A..Z]>+$/) {
+ say from-excel($str);
}
-multi sub MAIN (UInt $num where $num <= 16384) {
- say %letter{$num};
+multi sub MAIN (UInt $num where $num > 0) {
+ say to-excel($num);
}