From 4c77f3376020ea13754b2f635ce07094cdc4a226 Mon Sep 17 00:00:00 2001 From: Andinus Date: Wed, 3 Mar 2021 23:13:35 +0530 Subject: Make class Puzzle, remove fancy chars, make module for get-puzzle - Puzzle is a class that provides the grids & gray-squares. - Fancy chars were removed for ASCII characters. - get-puzzle is now in its own module. --- lib/Octans/CLI.rakumod | 50 ++++++++++--------------------- lib/Octans/Puzzle.rakumod | 69 ++++++++++--------------------------------- lib/Octans/Puzzle/Get.rakumod | 39 ++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 89 deletions(-) create mode 100644 lib/Octans/Puzzle/Get.rakumod (limited to 'lib/Octans') diff --git a/lib/Octans/CLI.rakumod b/lib/Octans/CLI.rakumod index 744fba8..48477ef 100644 --- a/lib/Octans/CLI.rakumod +++ b/lib/Octans/CLI.rakumod @@ -1,5 +1,6 @@ use Octans::Puzzle; use Octans::WordSearch; +use Octans::Puzzle::Get; proto MAIN (|) is export { unless so @*ARGS { say $*USAGE; exit }; {*} } @@ -14,21 +15,9 @@ multi sub MAIN ( # chars by default. my Str @dict = $dict.IO.lines.grep(*.chars >= $length); - # @puzzle holds the puzzle. - # - # @gray-squares holds the list of indexes of valid starting - # positions in the puzzle. - my (@puzzle, @gray-squares); - - # Get the puzzle from $path. - if $path.IO.f { - @puzzle = $path.IO.lines.map(*.words.cache.Array); - } else { - @puzzle = get-puzzle($path); - } - - # set-gray-squares also removes asterisks from @puzzle. - @gray-squares = set-gray-squares(@puzzle); # ($y, $x) + my $puzzle = $path.IO.f + ?? Puzzle.new(grids => $path.IO.lines.map(*.words.Array)) + !! get-puzzle($path); if so $verbose { # Don't print path if using the dictionary included with the @@ -37,50 +26,40 @@ multi sub MAIN ( say "Dictionary: " ~ $dict.Str; } - say "Gray squares: ", @gray-squares; + say "Gray squares: ", $puzzle.gray-squares; say "Puzzle"; - " $_".say for @puzzle; + " $_".say for $puzzle.grids; } - # After the solution is found, the path is printed with these - # fancy chars. - my %𝒻𝒶𝓃𝒸𝓎-𝒸𝒽𝒶𝓇𝓈 = - :a, :b, :c, :d, :e, :f, :g, :h, :i, - :j, :k, :l, :m, :n, :o, :p, :q, :r, - :s, :t, :u, :v, :w, :x, :y, :z; - # start-pos block loops over each starting position. - start-pos: for @gray-squares -> $pos { + start-pos: for $puzzle.gray-squares -> $pos { my DateTime $initial = DateTime.now; # gather all the words that word-search finds starting from # $pos. word: for gather word-search( - @dict, @puzzle, $pos[0], $pos[1], + @dict, $puzzle.grids, $pos[0], $pos[1], ) -> ( # word-search returns the word along with @visited which # holds the list of all grids that were visited when the # word was found. $word, @visited ) { - # If not $verbose then print the word. + # If not $verbose then just print the word. unless so $verbose { say $word; next word; } # Print the word, along with the time taken. - say "\n" ~ $word ~ " [" ~ DateTime.now - $initial ~ "𝑠]"; + printf "\n%s \[%.8f𝑠\]\n", $word, DateTime.now - $initial; # Print the puzzle, highlighting the path. - for ^@puzzle.elems -> $y { + for ^$puzzle.grids.elems -> $y { print " " x 3; - for ^@puzzle[$y].elems -> $x { - print " " ~ ( - @visited[$y][$x] - ?? (%𝒻𝒶𝓃𝒸𝓎-𝒸𝒽𝒶𝓇𝓈{@puzzle[$y][$x]} // @puzzle[$y][$x]) - !! @puzzle[$y][$x] - ); + for ^$puzzle.grids[$y].elems -> $x { + printf " {$puzzle.grids[$y][$x]}%s", + @visited[$y][$x] ?? "/" !! " "; } print "\n"; } @@ -88,6 +67,7 @@ multi sub MAIN ( } } + multi sub MAIN ( Bool :$version #= print version ) { say "Octans v" ~ $?DISTRIBUTION.meta; } diff --git a/lib/Octans/Puzzle.rakumod b/lib/Octans/Puzzle.rakumod index a9563cb..731cc8e 100644 --- a/lib/Octans/Puzzle.rakumod +++ b/lib/Octans/Puzzle.rakumod @@ -1,59 +1,20 @@ -unit module Octans::Puzzle; - -use WWW; - -# get-puzzle returns the @puzzle given input path. -sub get-puzzle ( - Str $path -) is export { - my @puzzle; - - # $url will hold the url that we'll call to get the toot data. - my Str $url; - - # User can pass 2 types of links, either it will be the one - # when they view it from their local instance or the one they - # get from Algot's profile. We set $url from it. - if $path.match("web/statuses") -> $match { - $url = $match.replace-with("api/v1/statuses"); - } else { - $url = "https://mastodon.art/api/v1/statuses/" ~ $path.split("/")[*-1]; - } - - # grids capture grids of a row. - my token grids { \S \*? } - # rows capture rows of the puzzle. - my token rows { ** 2..* % \h } - - # jget just get's the url & decodes the json. We access the - # description field of 1st media attachment. - if (jget($url)[0] ~~ - / \n\n + % \n / - ) -> $match { - for 0 .. $match.end -> $y { - for 0 .. $match[$y].end -> $x { - @puzzle[$y][$x] = $match[$y][$x].lc; +class Puzzle is export { + has @.grids; + has @!gray-squares; + + submethod TWEAK() { + for 0 .. @!grids.end -> $y { + for 0 .. @!grids[$y].end -> $x { + # Remove the markers from the puzzle & push the + # positions to @!gray-squares. + if @!grids[$y][$x].match("*") -> $match { + @!grids[$y][$x] = $match.replace-with(""); + push @!gray-squares, ($y, $x); + } } } } - return @puzzle; -} - -# set-gray squares will set the @gray-squares array while removing the -# "*" in @puzzle. Algot marks them with an asterisk ("*") after the -# character. -sub set-gray-squares ( - @puzzle --> List -) is export { - my List @gray-squares; - for 0 .. @puzzle.end -> $y { - for 0 .. @puzzle[$y].end -> $x { - if @puzzle[$y][$x].ends-with("*") { - @puzzle[$y][$x] .= chop; - push @gray-squares, ($y, $x); - } - } - } - return @gray-squares; + # Accessor for @!gray-squares. + method gray-squares() { @!gray-squares; } } diff --git a/lib/Octans/Puzzle/Get.rakumod b/lib/Octans/Puzzle/Get.rakumod new file mode 100644 index 0000000..1783796 --- /dev/null +++ b/lib/Octans/Puzzle/Get.rakumod @@ -0,0 +1,39 @@ +use WWW; +use Octans::Puzzle; + +# get-puzzle returns Puzzle.new() given input path. +sub get-puzzle ( + Str $path +) is export { + my @grids; + + # $url will hold the url that we'll call to get the toot data. + my Str $url; + + # User can pass 2 types of links, either it will be the one + # when they view it from their local instance or the one they + # get from Algot's profile. We set $url from it. + if $path.match("web/statuses") -> $match { + $url = $match.replace-with("api/v1/statuses"); + } else { + $url = "https://mastodon.art/api/v1/statuses/" ~ $path.split("/")[*-1]; + } + + # grids capture grids of a row. + my token grids { \S \*? } + # rows capture rows of the puzzle. + my token rows { ** 2..* % \h } + + # jget just get's the url & decodes the json. We access the + # description field of 1st media attachment. + if (jget($url)[0] ~~ + / \n\n + % \n / + ) -> $match { + for 0 .. $match.end -> $y { + for 0 .. $match[$y].end -> $x { + @grids[$y][$x] = $match[$y][$x].lc; + } + } + } + return Puzzle.new(grids => @grids); +} -- cgit 1.4.1-2-gfad0