diff options
25 files changed, 1841 insertions, 1040 deletions
diff --git a/challenge-062/arne-sommer/blog.txt b/challenge-062/arne-sommer/blog.txt new file mode 100644 index 0000000000..d8005d4a41 --- /dev/null +++ b/challenge-062/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/email-queen.html diff --git a/challenge-062/arne-sommer/raku/ch-1.p6 b/challenge-062/arne-sommer/raku/ch-1.p6 new file mode 100755 index 0000000000..294e52c2e8 --- /dev/null +++ b/challenge-062/arne-sommer/raku/ch-1.p6 @@ -0,0 +1,34 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@files, :$verbose, :$u); + +say ": Files: @files[]" if $verbose; + +my @input = @files.elems + ?? IO::CatHandle.new(@files).lines + !! lines; + +say ": Content: @input[]" if $verbose; + +my %sort; +my %seen; +my @output; + +for @input -> $current +{ + my ($mailbox, $domain) = $current.split('@'); + + say ": Candidate: $mailbox @ { $domain.lc }" if $verbose; + + if $u + { + my $candidate = $mailbox ~ '@' ~ $domain.lc; + next if %seen{$candidate}; + %seen{$candidate} = True; + } + + %sort{$current} = "{ $domain.lc } $mailbox"; + @output.push: $current; +} + +.say for @output.sort({ %sort{$^a} cmp %sort{$^b} }); diff --git a/challenge-062/arne-sommer/raku/ch-2.p6 b/challenge-062/arne-sommer/raku/ch-2.p6 new file mode 100755 index 0000000000..6b23f03141 --- /dev/null +++ b/challenge-062/arne-sommer/raku/ch-2.p6 @@ -0,0 +1,125 @@ +#! /usr/bin/env raku + +use lib "lib"; +use QueenCube; + +unit sub MAIN +( + $size = 8, + :$id = 'Q', + :$empty =".", + :$queen, + :$colour, + :$newlines, + :$fill, + :$random, + :$silent, + :$get-the-best, + :$verbose +); + +if $get-the-best +{ + get-the-best; +} +elsif $silent ~~ Int +{ + get-many-solutions; +} +else +{ + get-one-solution; +} + +sub get-one-solution +{ + my $c = QueenCube.new(size => $size); + + $c.init($empty); + + if $queen + { + $c.queen($id, $_) for $queen.words; + } + + if $fill || $random + { + loop + { + my $pos = $random ?? $c.get-empty-cell-random !! $c.get-empty-cell; + last unless defined $pos; + say ": Queen at $pos" if $verbose; + my ($x, $y, $z) = $pos.split(";"); + $c.queen($id, $x, $y, $z); + } + } + + unless $silent + { + $newlines + ?? $c.display-with-newlines($colour, $newlines) + !! $c.display($colour); + } + + my $count = $c.number-of-queens; + say "Number of Queens: ", $count if $count > 1; + + return $count; +} + + +sub get-many-solutions +{ + my @result; + + @result.push(get-one-solution) for ^$silent; + + my %result; + + %result{$_}++ for @result; + + say "$_ (%result{$_})" for %result.keys.sort; +} + + +sub get-the-best +{ + my Int $best-count = 0; + my $best-cube; + + my $c = QueenCube.new(size => $size); + $c.init($empty); + + iterate($c); + + sub iterate ($cube) + { + for $cube.get-all-cells -> $cell + { + next unless $c.cell-is-free($cell); + + my $copy = $cube.clone; + $copy.queen($id, $cell); + + iterate($copy); + } + + my $q = $cube.number-of-queens; + if $q > $best-count + { + say ": New best cube with $q Queens (old had $best-count)" if $verbose; + $best-count = $q; + $best-cube = $cube + } + elsif $verbose + { + say ": Considering cube with $q Queens"; + } + } + + $newlines + ?? $c.display-with-newlines($colour, $newlines) + !! $c.display($colour); + + say "Number of Queens: ", $best-count; +} diff --git a/challenge-062/arne-sommer/raku/input-list.txt b/challenge-062/arne-sommer/raku/input-list.txt new file mode 100755 index 0000000000..5dc3f2ceb0 --- /dev/null +++ b/challenge-062/arne-sommer/raku/input-list.txt @@ -0,0 +1,5 @@ +name@example.org +rjt@cpan.org +Name@example.org +rjt@CPAN.org +user@alpha.example.org diff --git a/challenge-062/arne-sommer/raku/lib/QueenCube.rakumod b/challenge-062/arne-sommer/raku/lib/QueenCube.rakumod new file mode 100755 index 0000000000..94a63e5188 --- /dev/null +++ b/challenge-062/arne-sommer/raku/lib/QueenCube.rakumod @@ -0,0 +1,195 @@ +use v6; + +constant ansi-blue = "\e[44m"; +constant ansi-green = "\e[42m"; +constant ansi-red = "\e[101m"; +constant ansi-stop = "\e[0m "; + +constant html-blue = '<span class="text-light bg-primary">'; +constant html-green = '<span class="text-light bg-success">'; +constant html-red = '<span class="text-light bg-danger">'; +constant html-stop = '</span> '; + + +unit class QueenCube; + + +has Int $.size; +has @.elems is rw; +has $.blank is rw; + + +method init ($init) +{ + self.blank = $init; + + for 1 .. $!size -> $x + { + for 1 .. $!size -> $y + { + for 1 .. $!size -> $z + { + @.elems[$x; $y; $z] = $init; + } + } + } +} + + +multi method queen ($id, $x, $y, $z) +{ + die "Blacked out position $x, $y, $z " if @.elems[$x; $y; $z] ne self.blank; + + @.elems[$x; $y; $z] = $id; + + my $min = 1; + my $max = self.size; + my $blackout = $id.lc; + + for -1, 0, 1 -> $xx + { + for -1, 0, 1 -> $yy + { + for -1, 0, 1 -> $zz + { + next if $xx == $yy == $zz == 0; # The Queen is here + + for (1 .. $max) -> $h + { + my $xxx = $x + $xx * $h; + my $yyy = $y + $yy * $h; + my $zzz = $z + $zz * $h; + next if any($xxx, $yyy, $zzz) < $min; + next if any($xxx, $yyy, $zzz) > $max; + @.elems[ $xxx; $yyy; $zzz] = $blackout; + } + } + } + } +} + + +multi method queen ($id, $xyz) +{ + my ($x, $y, $z) = $xyz.split(";"); + + die "Queen position out of range (1 .. { self.size })" if any($x, $y, $z) < 1; + die "Queen position out of range (1 .. { self.size })" if any($x, $y, $z) > self.size; + + self.queen($id, $x, $y, $z); +} + + +method display ($colour, $layer-from = 1, $layer-to = self.size) +{ + for 1 .. self.size -> $y + { + for $layer-from .. $layer-to -> $x + { + for 1 .. self.size -> $z + { + if $colour && $colour eq "html" + { + given @.elems[$x; $y; $z] + { + when self.blank { print html-red ~ $_ ~ html-stop; } + when /<[A..Z]>/ { print html-blue ~ $_ ~ html-stop; } + when /<[a..z]>/ { print html-green ~ $_ ~ html-stop; } + } + } + elsif $colour + { + given @.elems[$x; $y; $z] + { + when self.blank { print ansi-red ~ $_ ~ ansi-stop; } + when /<[A..Z]>/ { print ansi-blue ~ $_ ~ ansi-stop; } + when /<[a..z]>/ { print ansi-green ~ $_ ~ ansi-stop; } + } + } + else + { + print @.elems[$x; $y; $z], " "; + } + } + print " "; + } + say "": + } +} + + +method display-with-newlines($colour, $break-after) +{ + my $size = self.size; + my $start = 1; + my $stop = min($size, $break-after); + + loop + { + self.display($colour, $start, $stop); + $start += $break-after; + $stop += $break-after; + + last if $start > $size; + $stop = min($stop, $size); + print "\n\n"; + } +} + + +method number-of-queens +{ + return @!elems[*;*;*].grep({ $_.defined }).grep( * ~~ /<[A..Z]>/ ).elems; +} + + +method get-empty-cell +{ + for 1 .. self.size -> $x + { + for 1 .. self.size -> $y + { + for 1 ..self.size -> $z + { + return "$x;$y;$z" if @.elems[$x;$y;$z] eq self.blank; + } + } + } + return; +} + + +method get-empty-cell-random +{ + for self.get-all-cells.flat.pick(*) -> $elem + { + my ($x, $y, $z) = $elem.split(";"); + return "$x;$y;$z" if @.elems[$x;$y;$z] eq self.blank; + } + return; +} + + +method get-all-cells +{ + my @all; + for 1 .. self.size -> $x + { + for 1 .. self.size -> $y + { + for 1 ..self.size -> $z + { + @all.push("$x;$y;$z"); + } + } + } + return @all; +} + + +method cell-is-free ($cell) +{ + my ($x, $y, $z) = $cell.split(";"); + return self.elems[$x;$y;$z] eq self.blank; +} + diff --git a/challenge-062/arne-sommer/raku/queen-cube b/challenge-062/arne-sommer/raku/queen-cube new file mode 100755 index 0000000000..6b23f03141 --- /dev/null +++ b/challenge-062/arne-sommer/raku/queen-cube @@ -0,0 +1,125 @@ +#! /usr/bin/env raku + +use lib "lib"; +use QueenCube; + +unit sub MAIN +( + $size = 8, + :$id = 'Q', + :$empty =".", + :$queen, + :$colour, + :$newlines, + :$fill, + :$random, + :$silent, + :$get-the-best, + :$verbose +); + +if $get-the-best +{ + get-the-best; +} +elsif $silent ~~ Int +{ + get-many-solutions; +} +else +{ + get-one-solution; +} + +sub get-one-solution +{ + my $c = QueenCube.new(size => $size); + + $c.init($empty); + + if $queen + { + $c.queen($id, $_) for $queen.words; + } + + if $fill || $random + { + loop + { + my $pos = $random ?? $c.get-empty-cell-random !! $c.get-empty-cell; + last unless defined $pos; + say ": Queen at $pos" if $verbose; + my ($x, $y, $z) = $pos.split(";"); + $c.queen($id, $x, $y, $z); + } + } + + unless $silent + { + $newlines + ?? $c.display-with-newlines($colour, $newlines) + !! $c.display($colour); + } + + my $count = $c.number-of-queens; + say "Number of Queens: ", $count if $count > 1; + + return $count; +} + + +sub get-many-solutions +{ + my @result; + + @result.push(get-one-solution) for ^$silent; + + my %result; + + %result{$_}++ for @result; + + say "$_ (%result{$_})" for %result.keys.sort; +} + + +sub get-the-best +{ + my Int $best-count = 0; + my $best-cube; + + my $c = QueenCube.new(size => $size); + $c.init($empty); + + iterate($c); + + sub iterate ($cube) + { + for $cube.get-all-cells -> $cell + { + next unless $c.cell-is-free($cell); + + my $copy = $cube.clone; + $copy.queen($id, $cell); + + iterate($copy); + } + + my $q = $cube.number-of-queens; + if $q > $best-count + { + say ": New best cube with $q Queens (old had $best-count)" if $verbose; + $best-count = $q; + $best-cube = $cube + } + elsif $verbose + { + say ": Considering cube with $q Queens"; + } + } + + $newlines + ?? $c.display-with-newlines($colour, $newlines) + !! $c.display($colour); + + say "Number of Queens: ", $best-count; +} diff --git a/challenge-062/arne-sommer/raku/queen-cube-1 b/challenge-062/arne-sommer/raku/queen-cube-1 new file mode 100755 index 0000000000..ebd530bb35 --- /dev/null +++ b/challenge-062/arne-sommer/raku/queen-cube-1 @@ -0,0 +1,25 @@ +#! /usr/bin/env raku + +use lib "lib"; +use QueenCube; + +unit sub MAIN +( + $size = 8, + :$id = 'Q', + :$empty =".", + :$queen, + :$colour +); + +get-one-solution; + +sub get-one-solution +{ + my $c = QueenCube.new(size => $size); + + $c.init($empty); + $c.queen($id, $queen) if $queen; + + $c.display($colour); +} diff --git a/challenge-062/arne-sommer/raku/queen-cube-2 b/challenge-062/arne-sommer/raku/queen-cube-2 new file mode 100755 index 0000000000..7bc780690a --- /dev/null +++ b/challenge-062/arne-sommer/raku/queen-cube-2 @@ -0,0 +1,32 @@ +#! /usr/bin/env raku + +use lib "lib"; +use QueenCube; + +unit sub MAIN +( + $size = 8, + :$id = 'Q', + :$empty =".", + :$queen, + :$colour +); + +get-one-solution; + +sub get-one-solution +{ + my $c = QueenCube.new(size => $size); + + $c.init($empty); + + if $queen + { + $c.queen($id, $_) for $queen.words; + } + + $c.display($colour); + + my $count = $c.number-of-queens; + say "Number of Queens: ", $count if $count > 1; +} diff --git a/challenge-062/arne-sommer/raku/queen-cube-3 b/challenge-062/arne-sommer/raku/queen-cube-3 new file mode 100755 index 0000000000..7f6d5ea6b1 --- /dev/null +++ b/challenge-062/arne-sommer/raku/queen-cube-3 @@ -0,0 +1,35 @@ +#! /usr/bin/env raku + +use lib "lib"; +use QueenCube; + +unit sub MAIN +( + $size = 8, + :$id = 'Q', + :$empty =".", + :$queen, + :$colour, + :$newlines +); + +get-one-solution; + +sub get-one-solution +{ + my $c = QueenCube.new(size => $size); + + $c.init($empty); + + if $queen + { + $c.queen($id, $_) for $queen.words; + } + + $newlines + ?? $c.display-with-newlines($colour, $newlines) + !! $c.display($colour); + + my $count = $c.number-of-queens; + say "Number of Queens: ", $count if $count > 1; +} diff --git a/challenge-062/arne-sommer/raku/queen-cube-4 b/challenge-062/arne-sommer/raku/queen-cube-4 new file mode 100755 index 0000000000..71705cfe3e --- /dev/null +++ b/challenge-062/arne-sommer/raku/queen-cube-4 @@ -0,0 +1,49 @@ +#! /usr/bin/env raku + +use lib "lib"; +use QueenCube; + +unit sub MAIN +( + $size = 8, + :$id = 'Q', + :$empty =".", + :$queen, + :$colour, + :$newlines, + :$fill, + :$random, +); + +get-one-solution; + +sub get-one-solution +{ + my $c = QueenCube.new(size => $size); + + $c.init($empty); + + if $queen + { + $c.queen($id, $_) for $queen.words; + } + + if $fill || $random + { + loop + { + my ($pos) = $random ?? $c.get-empty-cell-random !! $c.get-empty-cell; + last unless defined $pos; + say ": Queen at $pos" if $verbose; + my ($x, $y, $z) = $pos.split(";"); + $c.queen($id, $x, $y, $z); + } + } + + $newlines + ?? $c.display-with-newlines($colour, $newlines) + !! $c.display($colour); + + my $count = $c.number-of-queens; + say "Number of Queens: ", $count if $count > 1; +} diff --git a/challenge-062/arne-sommer/raku/queen-cube-5 b/challenge-062/arne-sommer/raku/queen-cube-5 new file mode 100755 index 0000000000..2ca0ad01fb --- /dev/null +++ b/challenge-062/arne-sommer/raku/queen-cube-5 @@ -0,0 +1,75 @@ +#! /usr/bin/env raku + +use lib "lib"; +use QueenCube; + +unit sub MAIN +( + $size = 8, + :$id = 'Q', + :$empty =".", + :$queen, + :$colour, + :$newlines, + :$fill, + :$random, + :$silent +); + +if $silent ~~ Int +{ + get-many-solutions; +} +else +{ + get-one-solution; +} + + +sub get-one-solution +{ + my $c = QueenCube.new(size => $size); + + $c.init($empty); + + if $queen + { + $c.queen($id, $_) for $queen.words; + } + + if $fill || $random + { + loop + { + my ($pos) = $random ?? $c.get-empty-cell-random !! $c.get-empty-cell; + last unless defined $pos; + say ": Queen at $pos" if $verbose; + my ($x, $y, $z) = $pos.split(";"); + $c.queen($id, $x, $y, $z); + } + } + + unless $silent + { + $newlines + ?? $c.display-with-newlines($colour, $newlines) + !! $c.display($colour); + } + + my $count = $c.number-of-queens; + say "Number of Queens: ", $count if $count > 1; +} + + +sub get-many-solutions +{ + my @result; + + @result.push(get-one-solution) for ^$silent; + + my %result; + + %result{$_}++ for @result; + + say "$_ (%result{$_})" for %result.keys.sort; +} diff --git a/challenge-062/arne-sommer/raku/sea b/challenge-062/arne-sommer/raku/sea new file mode 100755 index 0000000000..294e52c2e8 --- /dev/null +++ b/challenge-062/arne-sommer/raku/sea @@ -0,0 +1,34 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@files, :$verbose, :$u); + +say ": Files: @files[]" if $verbose; + +my @input = @files.elems + ?? IO::CatHandle.new(@files).lines + !! lines; + +say ": Content: @input[]" if $verbose; + +my %sort; +my %seen; +my @output; + +for @input -> $current +{ + my ($mailbox, $domain) = $current.split('@'); + + say ": Candidate: $mailbox @ { $domain.lc }" if $verbose; + + if $u + { + my $candidate = $mailbox ~ '@' ~ $domain.lc; + next if %seen{$candidate}; + %seen{$candidate} = True; + } + + %sort{$current} = "{ $domain.lc } $mailbox"; + @output.push: $current; +} + +.say for @output.sort({ %sort{$^a} cmp %sort{$^b} }); diff --git a/challenge-062/arne-sommer/raku/sea-main b/challenge-062/arne-sommer/raku/sea-main new file mode 100755 index 0000000000..1644920d60 --- /dev/null +++ b/challenge-062/arne-sommer/raku/sea-main @@ -0,0 +1,34 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@files, :$verbose, :$u); + +say ": Files: @files[]" if $verbose; + +my @input = @files.elems + ?? IO::CatHandle.new(@files).lines + !! $*IN.lines; + +say ": Content: @input[]" if $verbose; + +my %sort; +my %seen; +my @output; + +for @input -> $current +{ + my ($mailbox, $domain) = $current.split('@'); + + say ": Candidate: $mailbox @ { $domain.lc }" if $verbose; + + if $u + { + my $candidate = $mailbox ~ '@' ~ $domain.lc; + next if %seen{$candidate}; + %seen{$candidate} = True; + } + + %sort{$current} = "{ $domain.lc } $mailbox"; + @output.push: $current; +} + +.say for @output.sort({ %sort{$^a} cmp %sort{$^b} }); diff --git a/challenge-062/arne-sommer/raku/sea-simple b/challenge-062/arne-sommer/raku/sea-simple new file mode 100755 index 0000000000..ae23411bfb --- /dev/null +++ b/challenge-062/arne-sommer/raku/sea-simple @@ -0,0 +1,13 @@ +#! /usr/bin/env raku + +my @input = $*ARGFILES.lines; + +my %sort; + +for @input -> $current +{ + my ($mailbox, $domain) = $current.split('@'); + %sort{$current} = "{ $domain.lc } $mailbox"; +} + +.say for @input.sort({ %sort{$^a} cmp %sort{$^b} }); diff --git a/stats/pwc-current.json b/stats/pwc-current.json index 2e34519488..8ce66799df 100644 --- a/stats/pwc-current.json +++ b/stats/pwc-current.json @@ -1,123 +1,23 @@ { - "legend" : { - "enabled" : 0 - }, - "series" : [ - { - "colorByPoint" : 1, - "data" : [ - { - "y" : 2, - "name" : "Athanasius", - "drilldown" : "Athanasius" - }, - { - "drilldown" : "Jared Martin", - "name" : "Jared Martin", - "y" : 1 - }, - { - "drilldown" : "Javier Luque", - "y" : 5, - "name" : "Javier Luque" - }, - { - "drilldown" : "Laurent Rosenfeld", - "y" : 3, - "name" : "Laurent Rosenfeld" - }, - { - "drilldown" : "Leo Manfredi", - "name" : "Leo Manfredi", - "y" : 1 - }, - { - "drilldown" : "Luca Ferrari", - "y" : 2, - "name" : "Luca Ferrari" - }, - { - "y" : 1, - "name" : "Markus Holzer", - "drilldown" : "Markus Holzer" - }, - { - "drilldown" : "Mohammad S Anwar", - "y" : 3, - "name" : "Mohammad S Anwar" - }, - { - "drilldown" : "Niels van Dijke", - "name" : "Niels van Dijke", - "y" : 2 - }, - { - "name" : "Pete Houston", - "y" : 1, - "drilldown" : "Pete Houston" - }, - { - "drilldown" : "Richard Park", - "y" : 1, - "name" : "Richard Park" - }, - { - "drilldown" : "Roger Bell_West", - "y" : 4, - "name" : "Roger Bell_West" - }, - { - "drilldown" : "Saif Ahmed", - "y" : 2, - "name" : "Saif Ahmed" - }, - { - "drilldown" : "Sangeet Kar", - "y" : 4, - "name" : "Sangeet Kar" - }, - { - "y" : 3, - "name" : "Shahed Nooshmand", - "drilldown" : "Shahed Nooshmand" - }, - { - "drilldown" : "Simon Miner", - "name" : "Simon Miner", - "y" : 1 - }, - { - "drilldown" : "Simon Proctor", - "y" : 1, - "name" : "Simon Proctor" - }, - { - "name" : "Wanderdoc", - "y" : 1, - "drilldown" : "Wanderdoc" - }, - { - "name" : "Yet Ebreo", - "y" : 1, - "drilldown" : "Yet Ebreo" - } - ], - "name" : "Perl Weekly Challenge - 062" - } - ], - "subtitle" : { - "text" : "[Champions: 19] Last updated at 2020-05-31 22:28:16 GMT" - }, - "yAxis" : { - "title" : { - "text" : "Total Solutions" - } - }, "drilldown" : { "series" : [ { - "id" : "Athanasius", + "data" : [ + [ + "Raku", + 2 + ], + [ + "Blog", + 1 + ] + ], + "id" : "Arne Sommer", + "name" : "Arne Sommer" + }, + { "name" : "Athanasius", + "id" : "Athanasius", "data" : [ [ "Perl", @@ -130,16 +30,17 @@ ] }, { + "name" : "Jared Martin", + "id" : "Jared Martin", "data" : [ [ "Perl", 1 ] - ], - "name" : "Jared Martin", - "id" : "Jared Martin" + ] }, { + "name" : "Javier Luque", "id" : "Javier Luque", "data" : [ [ @@ -154,10 +55,11 @@ "Blog", 1 ] - ], - "name" : "Javier Luque" + ] }, { + "name" : "Laurent Rosenfeld", + "id" : "Laurent Rosenfeld", "data" : [ [ "Perl", @@ -171,19 +73,17 @@ "Blog", 1 ] - ], - "name" : "Laurent Rosenfeld", - "id" : "Laurent Rosenfeld" + ] }, { + "name" : "Leo Manfredi", "id" : "Leo Manfredi", "data" : [ [ "Perl", 1 ] - ], - "name" : "Leo Manfredi" + ] }, { "data" : [ @@ -192,18 +92,18 @@ 2 ] ], - "name" : "Luca Ferrari", - "id" : "Luca Ferrari" + "id" : "Luca Ferrari", + "name" : "Luca Ferrari" }, { + "name" : "Markus Holzer", "id" : "Markus Holzer", "data" : [ [ "Raku", 1 ] - ], - "name" : "Markus Holzer" + ] }, { "data" : [ @@ -224,37 +124,36 @@ "id" : "Mohammad S Anwar" }, { + "name" : "Niels van Dijke", + "id" : "Niels van Dijke", "data" : [ [ "Perl", 2 ] - ], - "name" : "Niels van Dijke", - "id" : "Niels van Dijke" + ] }, { - "name" : "Pete Houston", "data" : [ [ "Perl", 1 ] ], + "name" : "Pete Houston", "id" : "Pete Houston" }, { + "name" : "Richard Park", + "id" : "Richard Park", "data" : [ [ "Blog", |
