about summary refs log tree commit diff stats
path: root/README
blob: 6c5f32522d9fe41425c107884d6d861112b1cdb5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
generated by cgit-pink 1.4.1-2-gfad0 (git 2.36.2.497.gbbea4dcf42) at 2024-12-22 19:01:49 +0000
 



tionary file' href='/andinus/octans/commit/lib/Octans/CLI.rakumod?h=v0.2.2&id=a5c540608c469a2797262facb766e175b932f0e2'>a5c5406 ^
4c77f33 ^
a5c5406 ^

edf8a72 ^
4c77f33 ^
a5c5406 ^





fba3351 ^

a5c5406 ^

4c77f33 ^
edf8a72 ^
4c77f33 ^

bdb1dbc ^




a5c5406 ^
edf8a72 ^
a5c5406 ^



02cd965 ^
34dcef1 ^
07d3e5b ^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

                       
                        
 
                                                                       
 
               
                                                     

                                                                  
                                                         

                                         
                                                                 

                                                           
 
                           

                                                                              
 
                    

                                                                    



                                                                  
                                                   
                     
                                       

     
                                                        
                                                 

                                                                   
                                     
                                                   





                                                                    

                                                       

                                                      
                                            
                              

                                                        




                                                                      
                 
                           



             
 
               

                                                    
use Octans::Puzzle;
use Octans::WordSearch;
use Octans::Puzzle::Get;

proto MAIN(|) is export { unless so @*ARGS { say $*USAGE; exit }; {*} }

multi sub MAIN(
    Str $path, #= path to the crossword (file or url)
    Str :$dict = (%?RESOURCES<mwords/354984si.ngl> //
                  "/usr/share/dict/words").Str, #= dictionary file
    Int :$length = 7, #= minimum word length (default: 7)
    Bool :$verbose, #= increase verbosity
) is export {
    # @dict holds the sorted dictionary. Only consider words >= 7
    # chars by default.
    my Str @dict = $dict.IO.lines.grep(*.chars >= $length);

    my $puzzle = $path.IO.f
                  ?? Puzzle.new(grids => $path.IO.lines.map(*.lc.words.Array))
                  !! get-puzzle($path);

    if so $verbose {
        # Don't print path if using the dictionary included with the
        # program.
        unless $dict.Str eq %?RESOURCES<mwords/354984si.ngl>.Str {
            say "Dictionary: " ~ $dict.Str;
        }

        say "Gray squares: ", $puzzle.gray-squares;
        say "Puzzle";
        "    $_".say for $puzzle.grids;
    }

    # start-pos block loops over each starting position.
    start-pos: for $puzzle.gray-squares -> $pos {
        # gather all the words that word-search finds starting from
        # $pos.
        word: for gather word-search(
            @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
        ) {
            printf "%s$word\n", $verbose ?? "\n" !! "";
            next word unless so $verbose;

            # Print the puzzle, highlighting the path.
            for ^$puzzle.grids.elems -> $y {
                print " " x 3;
                for ^$puzzle.grids[$y].elems -> $x {
                    printf " {$puzzle.grids[$y][$x]}%s",
                    @visited[$y][$x]
                     # visited gray squares get marked with "*",
                     # visited squares with "/" & unvisited with " ".
                     ?? ($puzzle.is-gray-square($y, $x) ?? "*" !! "/")
                     !! " ";
                }
                print "\n";
            }
        }
    }
}

multi sub MAIN(
    Bool :$version #= print version
) { say "Octans v" ~ $?DISTRIBUTION.meta<version>; }