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 ADDED
@@ -0,0 +1,8 @@
1
+
2
+ tester.rb
3
+
4
+ lib/web.rb
5
+
6
+ lib/web/captcha.rb
7
+
8
+ lib/web/result.rb
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: []