about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndinus <andinus@nand.sh>2021-03-03 23:13:35 +0530
committerAndinus <andinus@nand.sh>2021-03-03 23:13:35 +0530
commit4c77f3376020ea13754b2f635ce07094cdc4a226 (patch)
treeb9ddc29123b47aa515ac26defea624f88f2a5c06
parentedf8a7290888977ff0bc625f02a81abbc37fb984 (diff)
downloadoctans-4c77f3376020ea13754b2f635ce07094cdc4a226.tar.gz
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.
-rw-r--r--META6.json1
-rw-r--r--lib/Octans/CLI.rakumod50
-rw-r--r--lib/Octans/Puzzle.rakumod69
-rw-r--r--lib/Octans/Puzzle/Get.rakumod39
4 files changed, 70 insertions, 89 deletions
diff --git a/META6.json b/META6.json
index 4aee3ff..b92df2b 100644
--- a/META6.json
+++ b/META6.json
@@ -10,6 +10,7 @@
         "Octans::CLI" : "lib/Octans/CLI.rakumod",
         "Octans::Neighbors" : "lib/Octans/Neighbors.rakumod",
         "Octans::Puzzle" : "lib/Octans/Puzzle.rakumod",
+        "Octans::Puzzle::Get" : "lib/Octans/Puzzle/Get.rakumod",
         "Octans::RangeSearch" : "lib/Octans/RangeSearch.rakumod",
         "Octans::WordSearch" : "lib/Octans/WordSearch.rakumod"
     },
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<a̶>, :b<b̶>, :c<c̶>, :d<d̶>, :e<e̶>, :f<f̶>, :g<g̶>, :h<h̶>, :i<i̶>,
-    :j<j̶>, :k<k̶>, :l<l̶>, :m<m̶>, :n<n̶>, :o<o̶>, :p<p̶>, :q<q̶>, :r<r̶>,
-    :s<s̶>, :t<t̶>, :u<u̶>, :v<v̶>, :w<w̶>, :x<x̶>, :y<y̶>, :z<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<version>; }
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 { <grids> ** 2..* % \h }
-
-    # jget just get's the url & decodes the json. We access the
-    # description field of 1st media attachment.
-    if (jget($url)<media_attachments>[0]<description> ~~
-        / \n\n <rows>+ % \n /
-       ) -> $match {
-        for 0 .. $match<rows>.end -> $y {
-            for 0 .. $match<rows>[$y]<grids>.end -> $x {
-                @puzzle[$y][$x] = $match<rows>[$y]<grids>[$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 { <grids> ** 2..* % \h }
+
+    # jget just get's the url & decodes the json. We access the
+    # description field of 1st media attachment.
+    if (jget($url)<media_attachments>[0]<description> ~~
+        / \n\n <rows>+ % \n /
+       ) -> $match {
+        for 0 .. $match<rows>.end -> $y {
+            for 0 .. $match<rows>[$y]<grids>.end -> $x {
+                @grids[$y][$x] = $match<rows>[$y]<grids>[$x].lc;
+            }
+        }
+    }
+    return Puzzle.new(grids => @grids);
+}