about summary refs log tree commit diff stats
path: root/.github
Commit message (Expand)AuthorAgeFilesLines
* core.main: `--version`: Report Python version and localenfnty2017-02-192-0/+4
* GitHub issue templates: Minor reorder and rewordingnfnty2017-01-172-6/+6
* GitHub issue templates: Add terminal emulatornfnty2017-01-162-6/+8
* GitHub issue templates: Reorder and improve editabilitynfnty2017-01-162-49/+62
* GitHub issue templates: Add extra spacesnfnty2017-01-162-11/+18
* Added GitHub issue templatesnfnty2017-01-162-0/+76
* Revert "Add github issue/PR templates"hut2016-08-272-14/+0
* Add github issue/PR templateshut2016-08-272-0/+14
nus@nand.sh> 2021-01-24 21:02:39 +0530 Add an option to specify minimum length' href='/andinus/octans/commit/lib/Octans/CLI.rakumod?id=ae4d889f6a55b452e4b8eb6c6d955750f3ec90ed'>ae4d889 ^
a5c5406 ^
a5c5406 ^
a5c5406 ^
ae4d889 ^

a5c5406 ^



d744a93 ^
a5c5406 ^

07d3e5b ^




c390480 ^

d744a93 ^

a5c5406 ^














07d3e5b ^

a5c5406 ^















07d3e5b ^


a5c5406 ^





02cd965 ^




a5c5406 ^






02cd965 ^










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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104


                       

                                                                 
                
                                                     

                                                                  
                                                         
                                            
   
                                                                 

                                                           



                                                               
                              

                                




                                                          

     

                                                           














                                                                                                                            

                                                                                            















                                                                      


                                                                           





                                                      




                                                                                                           






                               










                                            







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

proto MAIN (|) is export {unless so @*ARGS {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 :v($verbose), #= increase verbosity
) {
    # @dict holds the sorted dictionary. Only consider words >= 7
    # 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)

    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";
                }
            }
        }
    }
}

# Modify USAGE to include input file format.
sub USAGE {
    say $*USAGE;
    say "\nInput file format:

    n a t k
    i m e c
    a* r d e
    t* e c h";
}

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

multi sub MAIN (
    Bool :$help #= print help
) { USAGE(); exit; }