word-guesser 0.1.0
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.
- data/.gitignore +4 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/LICENSE +38 -0
- data/README.markdown +24 -0
- data/Rakefile +5 -0
- data/bin/word-guesser +81 -0
- data/lib/word_guesser.rb +4 -0
- data/lib/word_guesser/dictionary.rb +17 -0
- data/lib/word_guesser/enable1.txt +172820 -0
- data/lib/word_guesser/version.rb +3 -0
- data/lib/word_guesser/word_collection.rb +42 -0
- data/lib/word_guesser/word_guesser.rb +48 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/word_collection_spec.rb +46 -0
- data/spec/word_guesser_spec.rb +45 -0
- data/word-guesser.gemspec +20 -0
- metadata +77 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
module WordGuesser
|
2
|
+
class WordCollection
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize base_word, words
|
6
|
+
@base_word = base_word
|
7
|
+
@words = words
|
8
|
+
end
|
9
|
+
|
10
|
+
def guessed_letter_frequency
|
11
|
+
frequencies = {}
|
12
|
+
original_letters = @base_word.tr('_', '')
|
13
|
+
@words.each do |word|
|
14
|
+
word.tr(original_letters, '').each_char do |char|
|
15
|
+
if frequencies.has_key? char
|
16
|
+
frequencies[char] += 1
|
17
|
+
else
|
18
|
+
frequencies[char] = 1
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
frequencies
|
24
|
+
end
|
25
|
+
|
26
|
+
def in_dictionary
|
27
|
+
WordCollection.new(@base_word, @words & Dictionary.words)
|
28
|
+
end
|
29
|
+
|
30
|
+
def each
|
31
|
+
@words.each {|word| yield word }
|
32
|
+
end
|
33
|
+
|
34
|
+
def size
|
35
|
+
@words.size
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_s
|
39
|
+
@words.to_a.join ', '
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module WordGuesser
|
4
|
+
class WordGuesser
|
5
|
+
def initialize base_word, letters_left
|
6
|
+
@base_word = base_word.downcase
|
7
|
+
original_letters = @base_word.tr('_', '').split('')
|
8
|
+
letters_left = letters_left.uniq if letters_left.respond_to? :uniq
|
9
|
+
@letters_left = letters_left.map {|l| l.downcase } - original_letters
|
10
|
+
end
|
11
|
+
|
12
|
+
def real_combinations
|
13
|
+
words = []
|
14
|
+
letters_group = "[#{Regexp.quote(@letters_left.join)}]"
|
15
|
+
Dictionary.words.grep(/^#{@base_word.gsub(/_/, letters_group)}$/) do |word|
|
16
|
+
words << word
|
17
|
+
end
|
18
|
+
|
19
|
+
WordCollection.new @base_word, words
|
20
|
+
end
|
21
|
+
|
22
|
+
def all_combinations
|
23
|
+
words = []
|
24
|
+
if @base_word.include? '_'
|
25
|
+
->(memo, groups, letters, this, &block) do
|
26
|
+
groups = groups.clone
|
27
|
+
current_group = groups.delete_at 0
|
28
|
+
memo = memo + current_group
|
29
|
+
if groups.any?
|
30
|
+
letters.each do |letter|
|
31
|
+
this.call(memo + letter, groups, letters, this, &block)
|
32
|
+
end
|
33
|
+
else
|
34
|
+
block.call memo
|
35
|
+
end
|
36
|
+
end.tap do |inject_letters|
|
37
|
+
inject_letters.call "", @base_word.split('_', -1), @letters_left, inject_letters do |word|
|
38
|
+
words << word
|
39
|
+
end
|
40
|
+
end
|
41
|
+
else
|
42
|
+
words << @base_word
|
43
|
+
end
|
44
|
+
|
45
|
+
WordCollection.new @base_word, words
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WordGuesser::WordCollection do
|
4
|
+
let(:word_collection) { described_class.new base_word, words }
|
5
|
+
let(:base_word) { stub }
|
6
|
+
let(:words) { stub Set }
|
7
|
+
|
8
|
+
describe "#in_dictionary" do
|
9
|
+
subject { word_collection.in_dictionary }
|
10
|
+
let(:words) { %w[foo bar baz goodbye whirl] }
|
11
|
+
let(:dictionary) { %w[foo bar hello world] }
|
12
|
+
|
13
|
+
before { WordGuesser::Dictionary.stub(:words).and_return dictionary }
|
14
|
+
|
15
|
+
its(:class) { should == WordGuesser::WordCollection }
|
16
|
+
it { subject.instance_variable_get(:@base_word).should == base_word }
|
17
|
+
it do
|
18
|
+
collection_words = subject.instance_variable_get(:@words).to_set
|
19
|
+
collection_words.subset?(words.to_set).should be_true
|
20
|
+
collection_words.subset?(dictionary.to_set).should be_true
|
21
|
+
(dictionary.to_set + words.to_set).superset?(collection_words).should be_true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#guessed_letter_frequency" do
|
26
|
+
subject { word_collection.guessed_letter_frequency }
|
27
|
+
let(:base_word) { "h___o" }
|
28
|
+
let(:words) { %w[hallo helio hello hillo hippo hullo hydro] }
|
29
|
+
|
30
|
+
it do
|
31
|
+
should == { 'l' => 9, 'i' => 3, 'e' => 2, 'p' => 2, 'r' => 1,
|
32
|
+
'u' => 1, 'y' => 1, 'd' => 1, 'a' => 1 }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#size" do
|
37
|
+
subject { word_collection.size }
|
38
|
+
let(:word_collection) { described_class.new(stub, words) }
|
39
|
+
let(:size) { double }
|
40
|
+
|
41
|
+
it do
|
42
|
+
words.should_receive(:size).and_return size
|
43
|
+
should == size
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WordGuesser::WordGuesser do
|
4
|
+
let(:word_guesser) { described_class.new base_word, letters }
|
5
|
+
|
6
|
+
describe "#all_combinations" do
|
7
|
+
subject { word_guesser.all_combinations }
|
8
|
+
let(:letters) { ['a', 'r'] }
|
9
|
+
|
10
|
+
context "when there is a _ at the start" do
|
11
|
+
let(:base_word) { "_oo" }
|
12
|
+
its(:to_set) { should == ["aoo", "roo"].to_set }
|
13
|
+
end
|
14
|
+
|
15
|
+
context "when there is a _ in the middle" do
|
16
|
+
let(:base_word) { "f_o" }
|
17
|
+
its(:to_set) { should == ["fao", "fro"].to_set }
|
18
|
+
end
|
19
|
+
|
20
|
+
context "when there is a _ at the end" do
|
21
|
+
let(:base_word) { "fo_" }
|
22
|
+
its(:to_set) { should == ["foa", "for"].to_set }
|
23
|
+
end
|
24
|
+
|
25
|
+
context "when there is no _" do
|
26
|
+
let(:base_word) { "foo" }
|
27
|
+
its(:to_a) { should == [base_word] }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#real_combinations" do
|
32
|
+
subject { word_guesser.real_combinations }
|
33
|
+
let(:base_word) { "b__"}
|
34
|
+
let(:letters) { [*('a'..'z')] }
|
35
|
+
let(:dictionary) { %w[foo bar baz biz hello world] }
|
36
|
+
|
37
|
+
before { WordGuesser::Dictionary.stub(:words).and_return dictionary }
|
38
|
+
|
39
|
+
its(:class) { should == WordGuesser::WordCollection }
|
40
|
+
it { subject.instance_variable_get(:@base_word).should == base_word }
|
41
|
+
it do
|
42
|
+
subject.instance_variable_get(:@words).to_set.should == Set.new(%w[bar baz biz])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "word_guesser/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "word-guesser"
|
7
|
+
s.version = WordGuesser::VERSION
|
8
|
+
s.authors = ["Andrew Marshall"]
|
9
|
+
s.email = ["andrew@johnandrewmarshall.com"]
|
10
|
+
s.homepage = "http://johnandrewmarshall.com/projects/word-guesser"
|
11
|
+
s.summary = %q{A word guesser}
|
12
|
+
s.description = %q{A simple app to guess possible words given known letters}
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
s.add_development_dependency "rspec"
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: word-guesser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Andrew Marshall
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-02-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &70255280143020 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70255280143020
|
25
|
+
description: A simple app to guess possible words given known letters
|
26
|
+
email:
|
27
|
+
- andrew@johnandrewmarshall.com
|
28
|
+
executables:
|
29
|
+
- word-guesser
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- .gitignore
|
34
|
+
- .travis.yml
|
35
|
+
- Gemfile
|
36
|
+
- LICENSE
|
37
|
+
- README.markdown
|
38
|
+
- Rakefile
|
39
|
+
- bin/word-guesser
|
40
|
+
- lib/word_guesser.rb
|
41
|
+
- lib/word_guesser/dictionary.rb
|
42
|
+
- lib/word_guesser/enable1.txt
|
43
|
+
- lib/word_guesser/version.rb
|
44
|
+
- lib/word_guesser/word_collection.rb
|
45
|
+
- lib/word_guesser/word_guesser.rb
|
46
|
+
- spec/spec_helper.rb
|
47
|
+
- spec/word_collection_spec.rb
|
48
|
+
- spec/word_guesser_spec.rb
|
49
|
+
- word-guesser.gemspec
|
50
|
+
homepage: http://johnandrewmarshall.com/projects/word-guesser
|
51
|
+
licenses: []
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options: []
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
requirements: []
|
69
|
+
rubyforge_project:
|
70
|
+
rubygems_version: 1.8.16
|
71
|
+
signing_key:
|
72
|
+
specification_version: 3
|
73
|
+
summary: A word guesser
|
74
|
+
test_files:
|
75
|
+
- spec/spec_helper.rb
|
76
|
+
- spec/word_collection_spec.rb
|
77
|
+
- spec/word_guesser_spec.rb
|