biscotti 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/CHANGELOG.md +8 -0
- data/Gemfile.lock +28 -30
- data/biscotti.gemspec +1 -1
- data/data/biscotti/words.lst +2570 -226141
- data/exe/biscotti +7 -24
- data/lib/biscotti.rb +4 -2
- data/lib/biscotti/cli.rb +42 -5
- data/lib/biscotti/version.rb +1 -1
- metadata +5 -6
data/exe/biscotti
CHANGED
@@ -12,36 +12,19 @@ $LOAD_PATH.unshift("#{__dir__}/../lib")
|
|
12
12
|
require 'biscotti'
|
13
13
|
require 'biscotti/cli'
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
OptionParser.new do |opts|
|
18
|
-
opts.banner = 'Usage: bundle exec biscotti [--version] [--help] <letters>'
|
15
|
+
BISCOTTI_HOME = File.realpath(File.join(File.dirname(__FILE__), '..'))
|
19
16
|
|
20
|
-
|
21
|
-
|
22
|
-
exit(0)
|
23
|
-
end
|
17
|
+
begin
|
18
|
+
options = Biscotti::CLI::OptParser.parse!(ARGV)
|
24
19
|
|
25
|
-
|
26
|
-
# TODO: Minimum character count
|
27
|
-
# TODO: Provide a custom dictionary
|
28
|
-
# TODO: Output as a grouped list by word length
|
29
|
-
# TODO: Verbose mode to emit more than just the list
|
30
|
-
# TODO: Alternative formats mode: JSON, Yaml, Text (default)
|
20
|
+
dictionary_file = options.fetch(:dictionary, File.join(BISCOTTI_HOME, 'data', 'biscotti', 'words.lst')).freeze
|
31
21
|
|
32
|
-
|
33
|
-
warn(opts)
|
34
|
-
exit(0)
|
35
|
-
end
|
36
|
-
end.parse!
|
22
|
+
# Raise error if dictionary file doesn't exist or cannot be read.
|
37
23
|
|
38
|
-
|
24
|
+
dictionary = Biscotti.load_dictionary(dictionary_file).freeze
|
39
25
|
|
40
|
-
BISCOTTI_HOME = File.realpath(File.join(File.dirname(__FILE__), '..'))
|
41
|
-
|
42
|
-
begin
|
43
|
-
dictionary = Biscotti.load_dictionary(File.join(BISCOTTI_HOME, 'data', 'biscotti', 'words.lst').freeze)
|
44
26
|
letters = ARGV.flat_map { |word| word.downcase.split('') }.sort.join
|
27
|
+
|
45
28
|
min_word_length = 2
|
46
29
|
|
47
30
|
output = Biscotti.find_words(
|
data/lib/biscotti.rb
CHANGED
@@ -34,10 +34,12 @@ module Biscotti
|
|
34
34
|
w.concat(letters.permutation(letter_count).to_a.map(&:join))
|
35
35
|
end
|
36
36
|
|
37
|
+
letters_count = letters.count
|
38
|
+
word_length_range = (min_word_length..letters_count).freeze
|
39
|
+
|
37
40
|
words & dictionary
|
38
41
|
.map(&:chomp)
|
39
|
-
.select { |word| word.length
|
40
|
-
.select { |word| word.length <= letters.count }
|
42
|
+
.select { |word| word_length_range.include?(word.length) }
|
41
43
|
.map { |word| word.strip.downcase.split('') }
|
42
44
|
.select { |word| (word - letters).empty? }
|
43
45
|
.select { |word| word.all? { |l0| word.count { |l1| l1 == l0 } <= letters_frequency_idx[l0] } }
|
data/lib/biscotti/cli.rb
CHANGED
@@ -1,13 +1,50 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'optparse'
|
4
|
+
|
3
5
|
module Biscotti
|
4
6
|
module CLI
|
5
|
-
|
6
|
-
|
7
|
-
|
7
|
+
class OptParser
|
8
|
+
def self.parse!(args)
|
9
|
+
options = {}
|
10
|
+
|
11
|
+
parser = OptionParser.new do |opts|
|
12
|
+
opts.banner = 'Usage: bundle exec biscotti [--version] [--help] [--dictionary=/path/to/words.lst] <letters>'
|
13
|
+
|
14
|
+
opts.on('-V', '--version', 'Print version info') do
|
15
|
+
$stdout.puts("biscotti version #{Biscotti::VERSION}")
|
16
|
+
exit(0)
|
17
|
+
end
|
18
|
+
|
19
|
+
opts.on('-D', '--dictionary=DICTIONARY', 'Path to the words list') do |dictionary|
|
20
|
+
options[:dictionary] = dictionary
|
21
|
+
end
|
22
|
+
|
23
|
+
# TODO: Print dictionary
|
24
|
+
# TODO: Minimum character count
|
25
|
+
# TODO: Provide a custom dictionary
|
26
|
+
# TODO: Output as a grouped list by word length
|
27
|
+
# TODO: Verbose mode to emit more than just the list
|
28
|
+
# TODO: Alternative formats mode: JSON, Yaml, Text (default)
|
29
|
+
|
30
|
+
opts.on_tail('-h', '--help', 'Show this message') do
|
31
|
+
warn(opts)
|
32
|
+
exit(0)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
begin
|
37
|
+
parser.parse!(args)
|
38
|
+
rescue StandardError => e
|
39
|
+
puts e.message
|
40
|
+
|
41
|
+
exit(1)
|
42
|
+
end
|
43
|
+
|
44
|
+
options[:letters] = ARGV
|
8
45
|
|
9
|
-
|
10
|
-
|
46
|
+
options
|
47
|
+
end
|
11
48
|
end
|
12
49
|
end
|
13
50
|
end
|
data/lib/biscotti/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: biscotti
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Hall
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-06-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '12.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '12.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -105,8 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
105
105
|
- !ruby/object:Gem::Version
|
106
106
|
version: '0'
|
107
107
|
requirements: []
|
108
|
-
|
109
|
-
rubygems_version: 2.7.7
|
108
|
+
rubygems_version: 3.0.4
|
110
109
|
signing_key:
|
111
110
|
specification_version: 4
|
112
111
|
summary: Totally not a way to cheat at letter scramble games.
|