diff options
author | Andinus <andinus@nand.sh> | 2021-01-19 21:53:16 +0530 |
---|---|---|
committer | Andinus <andinus@nand.sh> | 2021-01-19 21:53:16 +0530 |
commit | a5c540608c469a2797262facb766e175b932f0e2 (patch) | |
tree | 1e0eb79678d66f5ba657c63003592029757aefe7 /lib | |
parent | 5bb0f224483fbc1d57fd1c5a2f4a22dd7263ecd6 (diff) | |
download | octans-a5c540608c469a2797262facb766e175b932f0e2.tar.gz |
Re-structure for CPAN upload, include a dictionary file v0.1.0
bin/octans calls lib/Octans/CLI.rakumod which has the MAIN subroutine.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Octans/CLI.rakumod | 99 | ||||
-rw-r--r-- | lib/Octans/Neighbors.rakumod (renamed from lib/Neighbors.rakumod) | 2 | ||||
-rw-r--r-- | lib/Octans/Puzzle.rakumod (renamed from lib/Puzzle.rakumod) | 2 | ||||
-rw-r--r-- | lib/Octans/RangeSearch.rakumod (renamed from lib/RangeSearch.rakumod) | 2 | ||||
-rw-r--r-- | lib/Octans/WordSearch.rakumod (renamed from lib/WordSearch.rakumod) | 6 |
5 files changed, 105 insertions, 6 deletions
diff --git a/lib/Octans/CLI.rakumod b/lib/Octans/CLI.rakumod new file mode 100644 index 0000000..24ef59f --- /dev/null +++ b/lib/Octans/CLI.rakumod @@ -0,0 +1,99 @@ +use Octans::Puzzle; +use Octans::WordSearch; + +proto MAIN (|) is export {unless so @*ARGS {say $*USAGE; exit;}; {*}} +multi sub MAIN(Bool :$version) is hidden-from-USAGE { + say "Octans v" ~ $?DISTRIBUTION.meta<version>; +} + +multi sub MAIN ( + Str $url?, #= url for Algot's crossword + Str :$dict = (%?RESOURCES<mwords/354984si.ngl> // + "/usr/share/dict/words").Str, #= dictionary file + Bool :s($sample), #= run the sample puzzle + Bool :v($verbose), #= increase verbosity + Bool :$version, #= print version +) { + # Print usage & exit if both sample & url are not passed. + unless ($sample or $url) { + say $*USAGE; + exit 0; + } + + # @dict holds the sorted dictionary. Only consider words >= 7 + # chars. + my Str @dict = $dict.IO.lines.grep(*.chars >= 7); + + # @puzzle holds the puzzle. + # + # @gray-squares holds the list of indexes of valid starting + # positions in the puzzle. + my (@puzzle, @gray-squares); + + # Set the sample puzzle if requested. + if $sample { + @puzzle = [ + [<n a t k>], + [<i m e c>], + [<a r d e>], + [<t e c h>] + ]; + @gray-squares = [3, 0], [2, 0]; # $y, $x + } + + # Get the puzzle from $url if it's passed. + get-puzzle($url, @puzzle, @gray-squares) with $url; + + if $verbose { + # Don't print path if using the dictionary included with the + # program. + say "Dictionary: ", $dict.Str + unless ($dict.Str + eq %?RESOURCES<mwords/354984si.ngl>.Str); + say "Gray squares: ", @gray-squares; + say "Puzzle"; + " $_".say for @puzzle; + } + + # 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 { + my DateTime $initial = DateTime.now; + + # gather all the words that word-search finds starting from + # $pos. + for gather word-search( + @dict, @puzzle, $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 + ) { + # Print the word, along with the time taken (if $verbose). + say ($verbose ?? + "\n" ~ $word ~ " [" ~ DateTime.now - $initial ~ "𝑠]" !! + $word); + + # Print the puzzle, highlighting the path. + if $verbose { + for ^@puzzle.elems -> $y { + print " " x 3; + for ^@puzzle[$y].elems -> $x { + print " ", (@visited[$y][$x] ?? + (%𝒻𝒶𝓃𝒸𝓎-𝒸𝒽𝒶𝓇𝓈{@puzzle[$y][$x]} + // @puzzle[$y][$x]) !! + @puzzle[$y][$x] + ); + } + print "\n"; + } + } + } + } +} diff --git a/lib/Neighbors.rakumod b/lib/Octans/Neighbors.rakumod index 41cb35d..c6f1c00 100644 --- a/lib/Neighbors.rakumod +++ b/lib/Octans/Neighbors.rakumod @@ -1,4 +1,4 @@ -unit module Neighbors; +unit module Octans::Neighbors; # neighbors returns the neighbors of given index. Neighbors are cached # in @neighbors array. This way we don't have to compute them diff --git a/lib/Puzzle.rakumod b/lib/Octans/Puzzle.rakumod index bf4f8c3..a35c409 100644 --- a/lib/Puzzle.rakumod +++ b/lib/Octans/Puzzle.rakumod @@ -1,4 +1,4 @@ -unit module Puzzle; +unit module Octans::Puzzle; use WWW; diff --git a/lib/RangeSearch.rakumod b/lib/Octans/RangeSearch.rakumod index 16e43c1..e287d93 100644 --- a/lib/RangeSearch.rakumod +++ b/lib/Octans/RangeSearch.rakumod @@ -1,4 +1,4 @@ -unit module RangeSearch; +unit module Octans::RangeSearch; # range-starts-with returns a subset of given @dict list that start # with $str. It should be faster than: diff --git a/lib/WordSearch.rakumod b/lib/Octans/WordSearch.rakumod index 14d29b8..a1ed2c3 100644 --- a/lib/WordSearch.rakumod +++ b/lib/Octans/WordSearch.rakumod @@ -1,7 +1,7 @@ -unit module WordSearch; +unit module Octans::WordSearch; -use Neighbors; -use RangeSearch; +use Octans::Neighbors; +use Octans::RangeSearch; # word-search walks the given grid & tries to find words in the # dictionary. It walks in Depth-First manner (lookup Depth-First |