textcaptchasolver 0.0.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 +8 -0
- data/README.markdown +39 -0
- data/lib/solvers/addsubtractpattern.rb +47 -0
- data/lib/solvers/bodypartspattern.rb +42 -0
- data/lib/solvers/colorpattern.rb +58 -0
- data/lib/solvers/daypattern.rb +39 -0
- data/lib/solvers/digitpattern.rb +45 -0
- data/lib/solvers/namepattern.rb +24 -0
- data/lib/solvers/whichnumberpattern.rb +90 -0
- data/lib/solvers/wordstonumberpattern.rb +51 -0
- data/lib/textcaptchasolver.rb +32 -0
- data/solver.rb +8 -0
- data/textcaptchasolver.gemspec +12 -0
- metadata +58 -0
data/.gitignore
ADDED
data/README.markdown
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
#TextCaptcha Solver Ruby
|
2
|
+
|
3
|
+
TextCaptcha Solver is Ruby gem that can beat any TextCaptcha question, with a staggering 100% accuracy. I have tested this gem with over 50,000 questions, and it didn't fail on any.
|
4
|
+
|
5
|
+
The usage is extremely simple and straight forward, and anybody should be able to use it without too much trouble.
|
6
|
+
|
7
|
+
###Installation
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem install textcaptchasolver
|
11
|
+
|
12
|
+
```
|
13
|
+
|
14
|
+
###Usage
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
require 'textcaptchasolver'
|
18
|
+
|
19
|
+
solver = TextCaptcha.new
|
20
|
+
|
21
|
+
puts solver.solve("Of the numbers one hundred, eighty one, sixty one, 99, 51 or forty seven, which is the smallest?")
|
22
|
+
#=> 47
|
23
|
+
|
24
|
+
puts solver.solve("If a person is called Robert, what is their name?")
|
25
|
+
#=> robert
|
26
|
+
|
27
|
+
puts solver.solve("Pink, green, yellow, ant and finger: the 2nd colour is?")
|
28
|
+
#=> green
|
29
|
+
|
30
|
+
puts solver.solve("T-shirt, elbow, leg, milk and mosquito: how many body parts in the list?")
|
31
|
+
#=> 2
|
32
|
+
|
33
|
+
puts solver.solve("What is six thousand one hundred and eighty seven as digits?")
|
34
|
+
#=> 6187
|
35
|
+
|
36
|
+
|
37
|
+
```
|
38
|
+
|
39
|
+
If this fails for any question (it shouldn't), then please feel free to post up an issue, and I'll get it working.
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class AddSubtractPattern
|
2
|
+
|
3
|
+
def solve(question)
|
4
|
+
|
5
|
+
ordinals = {
|
6
|
+
'zero' => 0, 'one' => 1, 'eleven' => 11,
|
7
|
+
'ten' => 10, 'two' => 2, 'twelve' => 12,
|
8
|
+
'twenty' => 20, 'three' => 3, 'thirteen' => 13,
|
9
|
+
'thirty' => 30, 'four' => 4, 'fourteen' => 14,
|
10
|
+
'forty' => 40, 'five' => 5, 'fifteen' => 15,
|
11
|
+
'fifty' => 50, 'six' => 6, 'sixteen' => 16,
|
12
|
+
'sixty' => 60, 'seven' => 7, 'seventeen' => 17,
|
13
|
+
'seventy' => 70, 'eight' => 8, 'eighteen' => 18,
|
14
|
+
'eighty' => 80, 'nine' => 9, 'nineteen' => 19,
|
15
|
+
'ninety' => 90,
|
16
|
+
}
|
17
|
+
|
18
|
+
answer = nil
|
19
|
+
tokens = question.gsub(/[\?,]/,"").downcase.split
|
20
|
+
|
21
|
+
operators = ["+", "plus", "add", "-", "minus", "subtract"]
|
22
|
+
operator = [nil,nil]
|
23
|
+
|
24
|
+
if tokens.include?("+") || tokens.include?("plus") || tokens.include?("add") || tokens.include?("-") || tokens.include?("minus") || tokens.include?("subtract")
|
25
|
+
for i in (0..tokens.size)
|
26
|
+
if operators.include?(tokens[i])
|
27
|
+
operator = [tokens[i],i]
|
28
|
+
break
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
tokens[operator[1] - 1] = ordinals[tokens[operator[1] - 1]] if ordinals.include?(tokens[operator[1] - 1])
|
33
|
+
tokens[operator[1] + 1] = ordinals[tokens[operator[1] + 1]] if ordinals.include?(tokens[operator[1] + 1])
|
34
|
+
|
35
|
+
if operator[0] == "+" || operator[0] == "plus" || operator[0] == "add"
|
36
|
+
|
37
|
+
answer = tokens[operator[1] - 1].to_i + tokens[operator[1] + 1].to_i
|
38
|
+
|
39
|
+
elsif operator[0] == "-" || operator[0] == "minus" || operator[0] == "subtract"
|
40
|
+
|
41
|
+
answer = tokens[operator[1] - 1].to_i - tokens[operator[1] + 1].to_i
|
42
|
+
end
|
43
|
+
end
|
44
|
+
answer
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class BodyPartsPattern
|
2
|
+
|
3
|
+
def solve(question)
|
4
|
+
answer = nil
|
5
|
+
|
6
|
+
parts = ['hair', 'ankle', 'thumb', 'toe', 'eye', 'chin', 'head', 'chest', 'face', 'stomach',
|
7
|
+
'hand', 'heart', 'arm', 'ear', 'nose', 'foot', 'knee', 'leg', 'elbow', 'finger', 'tongue',
|
8
|
+
'tooth', 'brain']
|
9
|
+
|
10
|
+
found = []
|
11
|
+
|
12
|
+
tokens = question.gsub(/[^\w\d\s]/,"").downcase.split
|
13
|
+
|
14
|
+
if tokens.include?("body")
|
15
|
+
|
16
|
+
for i in (0..tokens.size)
|
17
|
+
|
18
|
+
if parts.include?(tokens[i])
|
19
|
+
found << tokens[i]
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
if found.size == 1
|
27
|
+
if tokens.include?("parts")
|
28
|
+
answer = '1'
|
29
|
+
elsif
|
30
|
+
answer = found[0]
|
31
|
+
end
|
32
|
+
elsif found.size > 1
|
33
|
+
answer = found.size
|
34
|
+
else
|
35
|
+
answer = nil
|
36
|
+
end
|
37
|
+
|
38
|
+
answer
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class ColorPattern
|
2
|
+
|
3
|
+
def solve(question)
|
4
|
+
colors = ['alizarin', 'almond', 'amaranth', 'amber', 'amber', 'amethyst', 'ao', 'ao', 'apricot', 'aqua', 'aquamarine', 'arsenic', 'asparagus', 'auburn', 'aureolin', 'aurometalsaurus', 'awesome', 'azure', 'azure', 'bazaar', 'beaver', 'beige', 'bistre', 'bittersweet', 'black', 'blond', 'blue', 'blue', 'blue', 'blush', 'bole', 'brass', 'bronze', 'brown', 'brown', 'bubbles', 'buff', 'burgundy', 'burlywood', 'byzantine', 'byzantium', 'cadet', 'camel', 'capri', 'cardinal', 'carmine', 'carnelian', 'ceil', 'celadon', 'cerise', 'cerulean', 'chamoisee', 'champagne', 'charcoal', 'chartreuse', 'chartreuse', 'chestnut', 'chocolate', 'cinereous', 'cinnabar', 'cinnamon', 'citrine', 'cobalt', 'copper', 'coquelicot', 'coral', 'cordovan', 'corn', 'cornsilk', 'cream', 'crimson', 'cyan', 'cyan', 'daffodil', 'dandelion', 'denim', 'desert', 'drab', 'ecru', 'eggplant', 'eggshell', 'emerald', 'fallow', 'fandango', 'fawn', 'feldgrau', 'firebrick', 'flame', 'flavescent', 'flax', 'folly', 'fuchsia', 'fulvous', 'gainsboro', 'gamboge', 'glaucous', 'gold', 'gold', 'goldenrod', 'gray', 'green', 'green', 'green', 'green', 'grullo', 'harlequin', 'heliotrope', 'honeydew', 'iceberg', 'icterine', 'inchworm', 'indigo', 'indigo', 'iris', 'isabelline', 'ivory', 'jade', 'jasper', 'jonquil', 'khaki', 'khaki', 'lava', 'lavender', 'lavender', 'lemon', 'lilac', 'lime', 'lime', 'linen', 'liver', 'lust', 'magenta', 'magenta', 'magenta', 'magnolia', 'mahogany', 'maize', 'malachite', 'manatee', 'maroon', 'maroon', 'mauve', 'mauvelous', 'melon', 'mint', 'moccasin', 'mulberry', 'mustard', 'myrtle', 'ochre', 'olive', 'olivine', 'onyx', 'orange', 'orange', 'orange', 'orchid', 'peach', 'pear', 'pearl', 'peridot', 'periwinkle', 'persimmon', 'pink', 'pistachio', 'platinum', 'plum', 'plum', 'prune', 'puce', 'pumpkin', 'purple', 'purple', 'raspberry', 'razzmatazz', 'red', 'red', 'red', 'redwood', 'regalia', 'rose', 'rosewood', 'ruby', 'ruddy', 'rufous', 'russet', 'rust', 'saffron', 'salmon', 'sand', 'sandstorm', 'sangria', 'sapphire', 'scarlet', 'seashell', 'sepia', 'shadow', 'sienna', 'silver', 'sinopia', 'skobeloff', 'smalt', 'snow', 'straw', 'sunglow', 'sunset', 'tan', 'tangelo', 'tangerine', 'taupe', 'teal', 'thistle', 'timberwolf', 'tomato', 'toolbox', 'tumbleweed', 'turquoise', 'ube', 'ultramarine', 'umber', 'urobilin', 'vanilla', 'verdigris', 'vermilion', 'veronica', 'violet', 'violet', 'violet', 'violet', 'viridian', 'wenge', 'wheat', 'white', 'wisteria', 'xanadu', 'yellow', 'yellow', 'yellow', 'zaffre']
|
5
|
+
|
6
|
+
ordinals = {
|
7
|
+
'1st' => 1, 'first' => 1,
|
8
|
+
'2nd' => 2, 'second' => 2,
|
9
|
+
'3rd' => 3, 'third' => 3,
|
10
|
+
'4th' => 4, 'fourth' => 4,
|
11
|
+
'5th' => 5, 'fifth' => 5,
|
12
|
+
'6th' => 6, 'sixth' => 6,
|
13
|
+
'7th' => 7, 'seventh' => 7,
|
14
|
+
'8th' => 8, 'eight' => 8,
|
15
|
+
'9th' => 9, 'ninth' => 9,
|
16
|
+
'10th' => 10, 'tenth' => 10
|
17
|
+
}
|
18
|
+
|
19
|
+
tokens = question.gsub(/[^\w\d\s]/,"").downcase.split
|
20
|
+
found = []
|
21
|
+
which = -1
|
22
|
+
answer = nil
|
23
|
+
|
24
|
+
if tokens.include?('colour')
|
25
|
+
for i in (0..tokens.size)
|
26
|
+
|
27
|
+
|
28
|
+
if colors.include?(tokens[i])
|
29
|
+
found << tokens[i]
|
30
|
+
elsif ordinals.include?(tokens[i])
|
31
|
+
which = ordinals[tokens[i]]
|
32
|
+
end
|
33
|
+
|
34
|
+
if found.size == 1 || which == -1
|
35
|
+
answer = found[0]
|
36
|
+
else
|
37
|
+
answer = found[which -1]
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
elsif tokens.include?('colours')
|
43
|
+
|
44
|
+
for i in (0..tokens.size)
|
45
|
+
|
46
|
+
if colors.include?(tokens[i])
|
47
|
+
found << tokens[i]
|
48
|
+
end
|
49
|
+
|
50
|
+
answer = found.size
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
answer
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class DayPattern
|
2
|
+
|
3
|
+
def solve(question)
|
4
|
+
answer = nil
|
5
|
+
|
6
|
+
days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
|
7
|
+
|
8
|
+
tokens = question.gsub(/[^\w\d\s]/,"").downcase.split
|
9
|
+
|
10
|
+
if tokens.include?("weekend")
|
11
|
+
for i in (0..tokens.size)
|
12
|
+
if tokens[i] == "saturday" || tokens[i] == "sunday"
|
13
|
+
answer = tokens[i]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
elsif tokens.include?("today")
|
18
|
+
offset = nil
|
19
|
+
day = nil
|
20
|
+
|
21
|
+
for i in (0..tokens.size)
|
22
|
+
if tokens[i] == "yesterday"
|
23
|
+
offset = 1
|
24
|
+
elsif tokens[i] == "tomorrow"
|
25
|
+
offset = -1
|
26
|
+
elsif days.include?(tokens[i])
|
27
|
+
day = tokens[i]
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
answer = days[(days.index(day) + offset) % 7]
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
answer
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class DigitPattern
|
2
|
+
|
3
|
+
def solve(question)
|
4
|
+
|
5
|
+
ordinals = {
|
6
|
+
'1st' => 1, 'first' => 1,
|
7
|
+
'2nd' => 2, 'second' => 2,
|
8
|
+
'3rd' => 3, 'third' => 3,
|
9
|
+
'4th' => 4, 'fourth' => 4,
|
10
|
+
'5th' => 5, 'fifth' => 5,
|
11
|
+
'6th' => 6, 'sixth' => 6,
|
12
|
+
'7th' => 7, 'seventh' => 7,
|
13
|
+
'8th' => 8, 'eight' => 8,
|
14
|
+
'9th' => 9, 'ninth' => 9,
|
15
|
+
'10th' => 10, 'tenth' => 10
|
16
|
+
}
|
17
|
+
|
18
|
+
answer = nil
|
19
|
+
|
20
|
+
tokens = question.gsub(/[^\w\d\s]/,"").downcase.split
|
21
|
+
which = -1
|
22
|
+
|
23
|
+
if tokens.include?("digit")
|
24
|
+
for i in (0..tokens.size)
|
25
|
+
|
26
|
+
if is_integer?(tokens[i])
|
27
|
+
answer = tokens[i]
|
28
|
+
elsif ordinals.include?(tokens[i])
|
29
|
+
which = ordinals[tokens[i]]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
answer = answer[which - 1]
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
answer
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
def is_integer?(int)
|
42
|
+
int.to_i.to_s == int
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class NamePattern
|
2
|
+
|
3
|
+
def solve(question)
|
4
|
+
omit = ['What', 'If', 'The']
|
5
|
+
answer = nil
|
6
|
+
|
7
|
+
question = question.gsub(/'s/,"")
|
8
|
+
tokens = question.gsub(/[^\w\d\s]/,"").split
|
9
|
+
|
10
|
+
if tokens.include?("name")
|
11
|
+
for i in (0..tokens.size)
|
12
|
+
|
13
|
+
if !omit.include?(tokens[i]) && (tokens[i] == tokens[i].to_s.capitalize)
|
14
|
+
answer = tokens[i].downcase
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
answer
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
class WhichNumberPattern
|
2
|
+
|
3
|
+
def solve(question)
|
4
|
+
answer = nil
|
5
|
+
|
6
|
+
single_numbers = {
|
7
|
+
'zero' => 0, 'ten' => 10,
|
8
|
+
'one' => 1, 'eleven' => 11,
|
9
|
+
'two' => 2, 'twelve' => 12,
|
10
|
+
'three' => 3, 'thirteen' => 13,
|
11
|
+
'four' => 4, 'fourteen' => 14,
|
12
|
+
'five' => 5, 'fifteen' => 15,
|
13
|
+
'six' => 6, 'sixteen' => 16,
|
14
|
+
'seven' => 7, 'seventeen' => 17,
|
15
|
+
'eight' => 8, 'eighteen' => 18,
|
16
|
+
'nine' => 9, 'nineteen' => 19,
|
17
|
+
'hundred' => 100
|
18
|
+
}
|
19
|
+
|
20
|
+
split_numbers = {
|
21
|
+
'twenty' => 20, 'thirty' => 30, 'forty' => 40,
|
22
|
+
'fifty' => 50, 'sixty' => 60, 'seventy' => 70,
|
23
|
+
'eighty' => 80, 'ninety' => 90
|
24
|
+
}
|
25
|
+
|
26
|
+
multipliers = {
|
27
|
+
'thousand' => 1000, 'million' => 1000000, 'hundred' => 100
|
28
|
+
}
|
29
|
+
ordinals = {
|
30
|
+
'1st' => 1, 'first' => 1,
|
31
|
+
'2nd' => 2, 'second' => 2,
|
32
|
+
'3rd' => 3, 'third' => 3,
|
33
|
+
'4th' => 4, 'fourth' => 4,
|
34
|
+
'5th' => 5, 'fifth' => 5,
|
35
|
+
'6th' => 6, 'sixth' => 6,
|
36
|
+
'7th' => 7, 'seventh' => 7,
|
37
|
+
'8th' => 8, 'eighth' => 8,
|
38
|
+
'9th' => 9, 'ninth' => 9,
|
39
|
+
'10th' => 10, 'tenth' => 10
|
40
|
+
}
|
41
|
+
|
42
|
+
tokens = question.gsub(/[^\w\d\s]/," # ").downcase.split.delete_if{ |t| t == ""}
|
43
|
+
found = []
|
44
|
+
which = -1
|
45
|
+
|
46
|
+
if tokens.include?("number") || tokens.include?("largest") || tokens.include?("biggest") || tokens.include?("highest") || tokens.include?("smallest") || tokens.include?("lowest")
|
47
|
+
for i in (0..tokens.size)
|
48
|
+
|
49
|
+
if ordinals.include?(tokens[i])
|
50
|
+
which = ordinals[tokens[i]]
|
51
|
+
elsif is_integer?(tokens[i])
|
52
|
+
found << tokens[i].to_i
|
53
|
+
elsif single_numbers.include?(tokens[i])
|
54
|
+
if single_numbers[tokens[i]] == 100 && i != 0 && single_numbers.include?(tokens[i - 1])
|
55
|
+
found << (single_numbers[tokens[i-1]] * 100)
|
56
|
+
found.delete_at(-2)
|
57
|
+
else
|
58
|
+
found << (single_numbers[tokens[i]])
|
59
|
+
end
|
60
|
+
elsif split_numbers.include?(tokens[i])
|
61
|
+
if ((i+1) != tokens.size) && single_numbers.include?(tokens[i+1])
|
62
|
+
found << (split_numbers[tokens[i]] + single_numbers[tokens[i + 1]])
|
63
|
+
tokens[i + 1] = nil
|
64
|
+
else
|
65
|
+
found << (split_numbers[tokens[i]])
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
if which == -1
|
73
|
+
if tokens.include?("largest") || tokens.include?("biggest") || tokens.include?("highest")
|
74
|
+
answer = found.max
|
75
|
+
elsif tokens.include?("smallest") || tokens.include?("lowest")
|
76
|
+
answer = found.min
|
77
|
+
end
|
78
|
+
else
|
79
|
+
answer = found[which - 1]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
answer
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
def is_integer?(int)
|
87
|
+
int.to_i.to_s == int
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class WordsToNumberPattern
|
2
|
+
|
3
|
+
def solve(question)
|
4
|
+
answer = nil
|
5
|
+
|
6
|
+
numbers = {
|
7
|
+
'zero' => 0, 'ten' => 10,
|
8
|
+
'one' => 1, 'eleven' => 11,
|
9
|
+
'two' => 2, 'twelve' => 12,
|
10
|
+
'three' => 3, 'thirteen' => 13,
|
11
|
+
'four' => 4, 'fourteen' => 14,
|
12
|
+
'five' => 5, 'fifteen' => 15,
|
13
|
+
'six' => 6, 'sixteen' => 16,
|
14
|
+
'seven' => 7, 'seventeen' => 17,
|
15
|
+
'eight' => 8, 'eighteen' => 18,
|
16
|
+
'nine' => 9, 'nineteen' => 19,
|
17
|
+
|
18
|
+
'twenty' => 20, 'thirty' => 30, 'forty' => 40,
|
19
|
+
'fifty' => 50, 'sixty' => 60, 'seventy' => 70,
|
20
|
+
'eighty' => 80, 'ninety' => 90
|
21
|
+
}
|
22
|
+
|
23
|
+
multipliers = {
|
24
|
+
'thousand' => 1000, 'million' => 1000000, 'hundred' => 100
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
tokens = question.gsub(/[^\w\d\s]/,"").downcase.split
|
29
|
+
if tokens.include?("digits") || tokens.include?("number")
|
30
|
+
nums = []
|
31
|
+
|
32
|
+
for i in (0..tokens.size)
|
33
|
+
if numbers.include?(tokens[i]) && !multipliers.include?(tokens[i+1]) && !multipliers.include?(tokens[i+2])
|
34
|
+
nums << numbers[tokens[i]]
|
35
|
+
|
36
|
+
elsif numbers.include?(tokens[i]) && !multipliers.include?(tokens[i+1]) && multipliers.include?(tokens[i+2])
|
37
|
+
temp = numbers[tokens[i]] + numbers[tokens[i+1]]
|
38
|
+
temp = temp * multipliers[tokens[i+2]]
|
39
|
+
tokens[i+1] = ""
|
40
|
+
tokens[i+1] = ""
|
41
|
+
nums << temp
|
42
|
+
elsif numbers.include?(tokens[i]) && multipliers.include?(tokens[i+1])
|
43
|
+
nums << (numbers[tokens[i]] * multipliers[tokens[i+1]])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
answer = nums.inject(:+)
|
47
|
+
end
|
48
|
+
answer
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'solvers/colorpattern'
|
2
|
+
require 'solvers/namepattern'
|
3
|
+
require 'solvers/bodypartspattern'
|
4
|
+
require 'solvers/digitpattern'
|
5
|
+
require 'solvers/addsubtractpattern'
|
6
|
+
require 'solvers/whichnumberpattern'
|
7
|
+
require 'solvers/wordstonumberpattern'
|
8
|
+
require 'solvers/daypattern'
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
class TextCaptcha
|
14
|
+
|
15
|
+
def solve(question)
|
16
|
+
|
17
|
+
answer = nil
|
18
|
+
|
19
|
+
answer = ColorPattern.new.solve(question) if answer == nil
|
20
|
+
answer = NamePattern.new.solve(question) if answer == nil
|
21
|
+
answer = BodyPartsPattern.new.solve(question) if answer == nil
|
22
|
+
answer = DigitPattern.new.solve(question) if answer == nil
|
23
|
+
answer = AddSubtractPattern.new.solve(question) if answer == nil
|
24
|
+
answer = WhichNumberPattern.new.solve(question) if answer == nil
|
25
|
+
answer = WordsToNumberPattern.new.solve(question) if answer == nil
|
26
|
+
answer = DayPattern.new.solve(question) if answer == nil
|
27
|
+
|
28
|
+
answer
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
data/solver.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'textcaptchasolver'
|
2
|
+
|
3
|
+
solver = TextCaptcha.new
|
4
|
+
puts solver.solve("Of the numbers one hundred, eighty one, sixty one, 99, 51 or forty seven, which is the smallest?")
|
5
|
+
puts solver.solve("If a person is called Robert, what is their name?")
|
6
|
+
puts solver.solve("Pink, green, yellow, ant and finger: the 2nd colour is?")
|
7
|
+
puts solver.solve("T-shirt, elbow, leg, milk and mosquito: how many body parts in the list?")
|
8
|
+
puts solver.solve("What is six thousand one hundred and eighty seven as digits?")
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'textcaptchasolver'
|
3
|
+
s.version = '0.0.0'
|
4
|
+
s.date = '2011-12-03'
|
5
|
+
s.summary = "Gem to beat questions served up by the TextCaptcha service."
|
6
|
+
s.description = "Gem to beat questions served up by the TextCaptcha service."
|
7
|
+
s.authors = ["Jake Austiwck"]
|
8
|
+
s.email = 'contact@mumbodesign.com'
|
9
|
+
s.files = `git ls-files`.split("\n")
|
10
|
+
s.homepage =
|
11
|
+
'https://github.com/JakeAustwick/TextCaptcha_Solver_Ruby'
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: textcaptchasolver
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jake Austiwck
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-03 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description: Gem to beat questions served up by the TextCaptcha service.
|
15
|
+
email: contact@mumbodesign.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- .gitignore
|
21
|
+
- README.markdown
|
22
|
+
- lib/solvers/addsubtractpattern.rb
|
23
|
+
- lib/solvers/bodypartspattern.rb
|
24
|
+
- lib/solvers/colorpattern.rb
|
25
|
+
- lib/solvers/daypattern.rb
|
26
|
+
- lib/solvers/digitpattern.rb
|
27
|
+
- lib/solvers/namepattern.rb
|
28
|
+
- lib/solvers/whichnumberpattern.rb
|
29
|
+
- lib/solvers/wordstonumberpattern.rb
|
30
|
+
- lib/textcaptchasolver.rb
|
31
|
+
- solver.rb
|
32
|
+
- textcaptchasolver-0.0.0.gem
|
33
|
+
- textcaptchasolver.gemspec
|
34
|
+
homepage: https://github.com/JakeAustwick/TextCaptcha_Solver_Ruby
|
35
|
+
licenses: []
|
36
|
+
post_install_message:
|
37
|
+
rdoc_options: []
|
38
|
+
require_paths:
|
39
|
+
- lib
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
requirements: []
|
53
|
+
rubyforge_project:
|
54
|
+
rubygems_version: 1.8.10
|
55
|
+
signing_key:
|
56
|
+
specification_version: 3
|
57
|
+
summary: Gem to beat questions served up by the TextCaptcha service.
|
58
|
+
test_files: []
|