words_matrix 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +9 -0
- data/bin/words_matrix +27 -0
- data/data/dict.txt +178692 -0
- data/lib/words_matrix.rb +8 -0
- data/lib/words_matrix/config.rb +7 -0
- data/lib/words_matrix/dictionary.rb +29 -0
- data/lib/words_matrix/matrix.rb +82 -0
- data/lib/words_matrix/service.rb +45 -0
- data/spec/fixtures/test_dict.txt +13 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/words_matrix/dictionary_spec.rb +20 -0
- data/spec/words_matrix/matrix_spec.rb +73 -0
- data/spec/words_matrix/service_spec.rb +93 -0
- data/words_matrix.gemspec +36 -0
- metadata +144 -0
data/lib/words_matrix.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
class WordsMatrix::Dictionary
|
2
|
+
attr_reader :words
|
3
|
+
|
4
|
+
def initialize(min_length, max_length, dict_path)
|
5
|
+
@dict_path = dict_path
|
6
|
+
@words = read_content(min_length, max_length)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
def read_content(min_length, max_length)
|
11
|
+
contents = File.read(@dict_path).split("\n")
|
12
|
+
|
13
|
+
result = {}
|
14
|
+
|
15
|
+
contents.each do |word_line|
|
16
|
+
word = word_line[/^\S+/].to_s.upcase
|
17
|
+
|
18
|
+
break if word.length > max_length
|
19
|
+
if word.length >= min_length
|
20
|
+
result[word[0]] ||= {}
|
21
|
+
result[word[0]][word] = word_line
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
result
|
26
|
+
rescue SystemCallError => e
|
27
|
+
raise IOError, "error while reading dictionary file: #{e.message}"
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
class WordsMatrix::Matrix
|
2
|
+
attr_reader :grid, :tokens
|
3
|
+
|
4
|
+
def initialize(n, min_length)
|
5
|
+
@n = n
|
6
|
+
@min_length = min_length
|
7
|
+
@grid = generate_grid
|
8
|
+
parse_to_tokens!
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
grid.map do |line|
|
13
|
+
line.join(" ")
|
14
|
+
end.join("\n")
|
15
|
+
end
|
16
|
+
|
17
|
+
def words_from(x, y)
|
18
|
+
raise ArgumentError, "Incorrect range" unless (0..@n-1).include?(x) || (0..@n-1).include?(y)
|
19
|
+
[
|
20
|
+
horizontal_line((y...@n).to_a, x),
|
21
|
+
horizontal_line((0..y).to_a.reverse, x),
|
22
|
+
vertical_line((x...@n).to_a, y),
|
23
|
+
vertical_line((0..x).to_a.reverse, y),
|
24
|
+
diagonal((x...@n).to_a, y),
|
25
|
+
diagonal((0..x).to_a.reverse, y),
|
26
|
+
diagonal((x...@n).to_a, y, -1),
|
27
|
+
diagonal((0..x).to_a.reverse, y, -1)
|
28
|
+
].flatten.compact
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def generate_grid
|
33
|
+
vowels = %w[A E O U I]
|
34
|
+
consonants = ('B'..'Z').to_a - vowels
|
35
|
+
|
36
|
+
Array.new(@n) do
|
37
|
+
Array.new(@n) do
|
38
|
+
(rand(4).zero? ? consonants : vowels).sample
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def parse_to_tokens!
|
44
|
+
@tokens = Hash.new([])
|
45
|
+
|
46
|
+
(0...@n).each do |x|
|
47
|
+
(0...@n).each do |y|
|
48
|
+
words = words_from(x, y)
|
49
|
+
@tokens[@grid[x][y]] += words if words.any?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def horizontal_line(y_range, x)
|
55
|
+
return nil if invalid_range?(y_range)
|
56
|
+
|
57
|
+
y_range.to_a.map do |yt|
|
58
|
+
@grid[x][yt]
|
59
|
+
end.join
|
60
|
+
end
|
61
|
+
|
62
|
+
def vertical_line(x_range, y)
|
63
|
+
return nil if invalid_range?(x_range)
|
64
|
+
|
65
|
+
x_range.to_a.map do |xt|
|
66
|
+
@grid[xt][y]
|
67
|
+
end.join
|
68
|
+
end
|
69
|
+
|
70
|
+
def diagonal(x_range, y, multiplier=1)
|
71
|
+
return nil if invalid_range?(x_range) || !(0...@n).include?(y + multiplier*@min_length)
|
72
|
+
|
73
|
+
x_range.to_a.map.with_index do |xt, i|
|
74
|
+
next unless (0...@n).include? y+i*multiplier
|
75
|
+
@grid[xt][y+i*multiplier]
|
76
|
+
end.join
|
77
|
+
end
|
78
|
+
|
79
|
+
def invalid_range?(range)
|
80
|
+
range.size < @min_length
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class WordsMatrix::Service
|
2
|
+
attr_reader :matrix, :dictionary, :words
|
3
|
+
|
4
|
+
def initialize(config={})
|
5
|
+
config = WordsMatrix::Config::DEFAULTS.merge(config) { |key, default, local|
|
6
|
+
local || default
|
7
|
+
}
|
8
|
+
|
9
|
+
validate_options!(config)
|
10
|
+
@matrix = WordsMatrix::Matrix.new(config[:n].to_i, config[:min_length].to_i)
|
11
|
+
@dictionary = WordsMatrix::Dictionary.new(config[:min_length].to_i, config[:n].to_i, config[:dict_path])
|
12
|
+
|
13
|
+
@words = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def find_words
|
17
|
+
@matrix.tokens.each_pair do |letter, tokens|
|
18
|
+
next unless @dictionary.words.has_key?(letter)
|
19
|
+
words = @dictionary.words[letter].keys
|
20
|
+
|
21
|
+
tokens.each do |token|
|
22
|
+
words_found = words.select { |word| token =~ /^#{word}.*/ }
|
23
|
+
|
24
|
+
@words += words_found.map { |word| @dictionary.words[letter][word] }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
@words.uniq!
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_s
|
31
|
+
words_found = @words.any? ? @words.join("\n") : "none :("
|
32
|
+
["Matrix:",
|
33
|
+
matrix.to_s,
|
34
|
+
"",
|
35
|
+
"Words found:",
|
36
|
+
words_found].join("\n")
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def validate_options!(config)
|
41
|
+
raise ArgumentError, "matrix size should be a positive integer" if config[:n].to_i < 1
|
42
|
+
raise ArgumentError, "min word length should be a positive integer and less than matrix size" unless (0..config[:n].to_i).include?(config[:min_length].to_i)
|
43
|
+
raise ArgumentError, "dictionary path is not a valid file path" unless File.readable?(config[:dict_path])
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
AA rough, cindery lava [n -S]
|
3
|
+
JAZZ to {enliven=v} [v -ED, -ING, -ES]
|
4
|
+
ALBUM a book for preserving photographs or stamps [n -S]
|
5
|
+
PHYLLOME a leaf of a plant [n -S]
|
6
|
+
PHYSICAL a medical examination of the body [n -S]
|
7
|
+
PHYSIQUE the form or structure of the body [n -S]
|
8
|
+
PHYTANES <phytane=n> [n]
|
9
|
+
PHYTONIC <phyton=n> [adj]
|
10
|
+
WITHDRAWNNESSES <withdrawnness=n> [n]
|
11
|
+
WOEBEGONENESSES <woebegoneness=n> [n]
|
12
|
+
WONDERFULNESSES <wonderfulness=n> [n]
|
13
|
+
WORRISOMENESSES <worrisomeness=n> [n]
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WordsMatrix::Dictionary do
|
4
|
+
let(:dict_path) {'spec/fixtures/test_dict.txt'}
|
5
|
+
let(:subject) {WordsMatrix::Dictionary.new(6, 9, dict_path)}
|
6
|
+
|
7
|
+
describe "#initialize" do
|
8
|
+
its(:words) { should_not be_nil }
|
9
|
+
|
10
|
+
it "should save only words of required length" do
|
11
|
+
expect(subject.words.keys).to eq ["P"]
|
12
|
+
end
|
13
|
+
|
14
|
+
context "file unreadable" do
|
15
|
+
it "should raise an error" do
|
16
|
+
expect{ WordsMatrix::Dictionary.new(15, 15, "inexisting path")}.to raise_error(IOError, /error while reading dictionary file: No such file or directory/)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WordsMatrix::Matrix do
|
4
|
+
let(:matrix) {WordsMatrix::Matrix.new(6, 4)}
|
5
|
+
let(:sample_grid) {
|
6
|
+
[
|
7
|
+
%w[A B C D E X],
|
8
|
+
%w[F G H I J X],
|
9
|
+
%w[K L M N O X],
|
10
|
+
%w[P Q R S T X],
|
11
|
+
%w[U V W X Y X],
|
12
|
+
%w[A B C D E X]
|
13
|
+
]
|
14
|
+
}
|
15
|
+
|
16
|
+
describe "#initialize" do
|
17
|
+
it "should initialize grid" do
|
18
|
+
expect(matrix.grid).not_to be_nil
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should parse grid to tokens" do
|
22
|
+
expect(matrix.tokens).not_to be_empty
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#grid" do
|
27
|
+
subject(:grid) { matrix.grid }
|
28
|
+
|
29
|
+
its(:size) { should eq 6 }
|
30
|
+
it "should have approximately 3 times more vowels" do
|
31
|
+
consonants_count = subject.flatten.count {|letter| !%w[A E I O U].include?(letter)}
|
32
|
+
|
33
|
+
expect(consonants_count).to be_within(10).of(subject.size**2 / 4)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#tokens" do
|
38
|
+
before { allow_any_instance_of(WordsMatrix::Matrix).to receive(:generate_grid).and_return([["A", "B", "C"],["D", "E", "F"], ["G", "H", "I"]]) }
|
39
|
+
let(:matrix) { WordsMatrix::Matrix.new(3, 3) }
|
40
|
+
|
41
|
+
it "should exclude too short tokens" do
|
42
|
+
expect(matrix.tokens.keys).not_to include("E")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#words_from" do
|
47
|
+
it "should skip all combinations shorter than min_length" do
|
48
|
+
expect(matrix.words_from(1, 0).any?{ |el| el.size < 4 }).to be false
|
49
|
+
end
|
50
|
+
|
51
|
+
context "letter check" do
|
52
|
+
before do
|
53
|
+
allow_any_instance_of(WordsMatrix::Matrix).to receive(:generate_grid).and_return(sample_grid)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should fetch appropriate horizontal letter combinations" do
|
57
|
+
expect(matrix.words_from(1,4)).to include("JIHGF")
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should fetch appropriate vertical letter combinations" do
|
61
|
+
expect(matrix.words_from(1,4)).to include("JOTYE")
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should fetch appropriate diagonal letter combinations" do
|
65
|
+
expect(matrix.words_from(1,4)).to include("JNRVA")
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should not contain any additional letter combinations" do
|
69
|
+
expect(matrix.words_from(1,4).size).to eq 3
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WordsMatrix::Service do
|
4
|
+
describe "#initialize" do
|
5
|
+
context "no local options given" do
|
6
|
+
let(:service) { WordsMatrix::Service.new }
|
7
|
+
|
8
|
+
it "should use default options" do
|
9
|
+
expect(service.matrix.grid.size).to eq WordsMatrix::Config::DEFAULTS[:n]
|
10
|
+
expect(service.matrix.instance_variable_get(:"@min_length")).to eq WordsMatrix::Config::DEFAULTS[:min_length]
|
11
|
+
expect(service.dictionary.instance_variable_get(:"@dict_path")).to eq WordsMatrix::Config::DEFAULTS[:dict_path]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context "local options given" do
|
16
|
+
let(:local_options) { {n: 5, dict_path: 'spec/fixtures/test_dict.txt', min_length: 4} }
|
17
|
+
it "should use local options with higher priority" do
|
18
|
+
service = WordsMatrix::Service.new(local_options)
|
19
|
+
|
20
|
+
expect(service.matrix.grid.size).to eq local_options[:n]
|
21
|
+
expect(service.matrix.instance_variable_get(:"@min_length")).to eq local_options[:min_length]
|
22
|
+
expect(service.dictionary.instance_variable_get(:"@dict_path")).to eq local_options[:dict_path]
|
23
|
+
end
|
24
|
+
|
25
|
+
context "invalid options" do
|
26
|
+
it "should validate the matrix size" do
|
27
|
+
local_options[:n] = double("something weird", to_i: 0)
|
28
|
+
expect{ WordsMatrix::Service.new(local_options) }.to raise_error(ArgumentError, "matrix size should be a positive integer")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should validate the min word size" do
|
32
|
+
local_options[:min_length] = 35
|
33
|
+
expect{ WordsMatrix::Service.new(local_options) }.to raise_error(ArgumentError, "min word length should be a positive integer and less than matrix size")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should check if dictionary file exists" do
|
37
|
+
local_options[:dict_path] = 'no file here'
|
38
|
+
expect{ WordsMatrix::Service.new(local_options) }.to raise_error(ArgumentError, "dictionary path is not a valid file path")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#find_words" do
|
45
|
+
let(:sample_grid) {
|
46
|
+
[
|
47
|
+
%w[A B C D E X],
|
48
|
+
%w[F B L I M P],
|
49
|
+
%w[K L M N O S],
|
50
|
+
%w[P Q R S T X],
|
51
|
+
%w[U V W A Y X],
|
52
|
+
%w[A B C D E X]
|
53
|
+
]
|
54
|
+
}
|
55
|
+
let(:service) { WordsMatrix::Service.new(n: 6, min_length: 4) }
|
56
|
+
|
57
|
+
before { allow_any_instance_of(WordsMatrix::Matrix).to receive(:generate_grid).and_return(sample_grid) }
|
58
|
+
|
59
|
+
it "should find all words not shorter than 4 chars" do
|
60
|
+
expected_result = [
|
61
|
+
"BLIMP a nonrigid aircraft [n -S] : BLIMPISH [adj]",
|
62
|
+
"DINS <din=v> [v]",
|
63
|
+
"EARL a British nobleman [n -S]",
|
64
|
+
"LIMP lacking rigidity [adj LIMPER, LIMPEST] / to walk lamely [v -ED, -ING, -S]",
|
65
|
+
"TOME a large book [n -S]"]
|
66
|
+
service.find_words
|
67
|
+
|
68
|
+
expect(service.words).to eq(expected_result)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "#to_s" do
|
73
|
+
let(:service) { WordsMatrix::Service.new(n: 6, min_length: 4, dict_path: 'spec/fixtures/test_dict.txt') }
|
74
|
+
|
75
|
+
before { service.find_words }
|
76
|
+
|
77
|
+
it "should print the matrix content" do
|
78
|
+
expect( service.to_s ).to include(service.matrix.to_s)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should print the words found" do
|
82
|
+
expect(service.to_s).to include(service.words.join("\n"))
|
83
|
+
end
|
84
|
+
|
85
|
+
context "no words found" do
|
86
|
+
it "should print a related message" do
|
87
|
+
allow(service).to receive(:words).and_return([])
|
88
|
+
|
89
|
+
expect(service.to_s).to include("Words found:\nnone :(")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'words_matrix'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "words_matrix"
|
8
|
+
spec.version = WordsMatrix::VERSION
|
9
|
+
spec.authors = ["Alona Mekhovova"]
|
10
|
+
spec.email = ["alona.tarasova@gmail.com"]
|
11
|
+
spec.summary = "Words search in a random letter matrix"
|
12
|
+
spec.description = %q{
|
13
|
+
A command line app able to generate a random word search grid n x n (n: number of rows/number of columns) and find all the words inside it.
|
14
|
+
|
15
|
+
- The grid letters must be uppercase.
|
16
|
+
- The valid words are defined inside the file dict.txt
|
17
|
+
- The minimum size of a valid word is 3 characters.
|
18
|
+
- The program must detect all possible directions: horizontal, vertical and diagonal.
|
19
|
+
|
20
|
+
(The words can be on reverse order)
|
21
|
+
}
|
22
|
+
spec.homepage = "https://github.com/alony/words_matrix"
|
23
|
+
spec.license = "MIT"
|
24
|
+
|
25
|
+
spec.files = `git ls-files -z`.split("\x0")
|
26
|
+
spec.executables = ["words_matrix"]
|
27
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
28
|
+
spec.require_paths = ["lib", "data"]
|
29
|
+
|
30
|
+
spec.add_runtime_dependency "thor"
|
31
|
+
|
32
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
33
|
+
spec.add_development_dependency "rake"
|
34
|
+
spec.add_development_dependency "rspec"
|
35
|
+
spec.add_development_dependency "rspec-its"
|
36
|
+
end
|
metadata
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: words_matrix
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alona Mekhovova
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.6'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.6'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec-its
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: "\n A command line app able to generate a random word search grid
|
84
|
+
n x n (n: number of rows/number of columns) and find all the words inside it.\n\n
|
85
|
+
\ - The grid letters must be uppercase.\n - The valid words are defined inside
|
86
|
+
the file dict.txt\n - The minimum size of a valid word is 3 characters.\n -
|
87
|
+
The program must detect all possible directions: horizontal, vertical and diagonal.\n\n
|
88
|
+
\ (The words can be on reverse order)\n "
|
89
|
+
email:
|
90
|
+
- alona.tarasova@gmail.com
|
91
|
+
executables:
|
92
|
+
- words_matrix
|
93
|
+
extensions: []
|
94
|
+
extra_rdoc_files: []
|
95
|
+
files:
|
96
|
+
- ".gitignore"
|
97
|
+
- Gemfile
|
98
|
+
- LICENSE.txt
|
99
|
+
- README.md
|
100
|
+
- Rakefile
|
101
|
+
- bin/words_matrix
|
102
|
+
- data/dict.txt
|
103
|
+
- lib/words_matrix.rb
|
104
|
+
- lib/words_matrix/config.rb
|
105
|
+
- lib/words_matrix/dictionary.rb
|
106
|
+
- lib/words_matrix/matrix.rb
|
107
|
+
- lib/words_matrix/service.rb
|
108
|
+
- spec/fixtures/test_dict.txt
|
109
|
+
- spec/spec_helper.rb
|
110
|
+
- spec/words_matrix/dictionary_spec.rb
|
111
|
+
- spec/words_matrix/matrix_spec.rb
|
112
|
+
- spec/words_matrix/service_spec.rb
|
113
|
+
- words_matrix.gemspec
|
114
|
+
homepage: https://github.com/alony/words_matrix
|
115
|
+
licenses:
|
116
|
+
- MIT
|
117
|
+
metadata: {}
|
118
|
+
post_install_message:
|
119
|
+
rdoc_options: []
|
120
|
+
require_paths:
|
121
|
+
- lib
|
122
|
+
- data
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
requirements: []
|
134
|
+
rubyforge_project:
|
135
|
+
rubygems_version: 2.2.2
|
136
|
+
signing_key:
|
137
|
+
specification_version: 4
|
138
|
+
summary: Words search in a random letter matrix
|
139
|
+
test_files:
|
140
|
+
- spec/fixtures/test_dict.txt
|
141
|
+
- spec/spec_helper.rb
|
142
|
+
- spec/words_matrix/dictionary_spec.rb
|
143
|
+
- spec/words_matrix/matrix_spec.rb
|
144
|
+
- spec/words_matrix/service_spec.rb
|