words_matrix 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|