aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-048/markus-holzer/raku/ch-1.p633
1 files changed, 21 insertions, 12 deletions
diff --git a/challenge-048/markus-holzer/raku/ch-1.p6 b/challenge-048/markus-holzer/raku/ch-1.p6
index 80a9425b83..713ebeaf3a 100644
--- a/challenge-048/markus-holzer/raku/ch-1.p6
+++ b/challenge-048/markus-holzer/raku/ch-1.p6
@@ -1,16 +1,25 @@
-# perfect example of overcomplicated thinking
-# the shift two, push one method is probably nicer,
-# if not faster
+role Concatenationem { has $.vicinus is rw; }
+class Moribunda is Int does Concatenationem { };
-my @circle = 1..50;
-my $offset = 0;
-
-while @circle.elems > 1
+sub bicimare-sine-fine( Int $homines where * > 1 )
{
- my $pivot-man = @circle[ *-2 ];
- @circle = @circle[ $offset, { $_ + 2 } ... * ];
- $offset = @circle[ *-1 ] == $pivot-man ?? 0 !! 1;
+ my $armis = my $primus = Moribunda.new(1);
+
+ for 2..$homines
+ {
+ my $homine = Moribunda.new($_);
+ $armis.vicinus = $homine;
+ $armis = $homine;
+ }
+
+ $armis = $armis.vicinus = $primus;
+
+ while $armis != $armis.vicinus
+ {
+ $armis = $armis.vicinus = $armis.vicinus.vicinus;
+ }
+
+ $armis;
}
-# Survivor: No. 37
-say "Survivor: No.", @circle.first;
+say bicimare-sine-fine( 50 ); \ No newline at end of file