math24 1.1.3

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6471c0c4c26dce758c64a452f953efa61de09207
4
+ data.tar.gz: 66c302a541221b82957288e5307dc69cb32f204c
5
+ SHA512:
6
+ metadata.gz: ac6023283a671d39976afafc69cd542507c55bb7adab00428b6d10f9964188ba13e83aa9655ef5b5e902fe62ba1227be3c510a6967006bbd50ecb4e8b947c50d
7
+ data.tar.gz: ce45ecf3083ad9beb4a0ccd0d551add26c07b1219373bbfefdb1cd096b8736637ce66cdcad93bb74c03e9018a2f0cc1f473e50558c295948ea5014565b3a1ff0
data/bin/math24 ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'math24'
4
+ require_relative '../lib/math24solver.rb'
5
+ require_relative '../lib/math24gamecli.rb'
6
+
7
+ cli = Math24GameCli.new
8
+ cli.run()
data/lib/math24.rb ADDED
@@ -0,0 +1,35 @@
1
+ require 'math24solver'
2
+
3
+ class Math24
4
+
5
+ attr_accessor :numbers
6
+ attr_reader :last_answer
7
+
8
+ def initialize
9
+ end
10
+
11
+ def solution?(solution)
12
+ if solution.scan(/\A(\(*(\d{1}[()\s]*[*+-\/]+[()\s]*){3}\d{1}\)*)\z/).flatten.first == solution
13
+ @last_answer = instance_eval(solution)
14
+ return last_answer == 24
15
+ else
16
+ @last_answer = "???"
17
+ end
18
+ return false
19
+ end
20
+
21
+ def generate_problem()
22
+ loop do
23
+ numbers = []
24
+ 4.times do |i|
25
+ numbers << rand(1..9).to_s
26
+ end
27
+ math24 = Math24Solver.new()
28
+ math24.numbers = numbers
29
+ if math24.solve() != "No solution found"
30
+ @numbers = numbers
31
+ return numbers
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,20 @@
1
+ require 'math24'
2
+ class Math24GameCli
3
+ def run()
4
+ game = Math24.new()
5
+ problem = game.generate_problem().join(' ')
6
+
7
+ loop do
8
+ puts "Solve: #{problem}"
9
+ attempt = gets.chomp
10
+ break if attempt.downcase == "exit"
11
+
12
+ if game.solution?(attempt)
13
+ puts "Correct!\n\n"
14
+ problem = game.generate_problem().join(' ')
15
+ else
16
+ puts "Try again...\n\n" unless problem.empty?
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,68 @@
1
+ class Math24Solver
2
+ attr_accessor :numbers
3
+ attr_reader :operators
4
+ attr_accessor :target
5
+
6
+ def initialize(operators = ["+", "-", "*", "/"])
7
+ @operators = operators
8
+ @target = 24
9
+ end
10
+
11
+ def solve(problem_numbers = [])
12
+ if problem_numbers.empty?
13
+ return "Please provide numbers" if @numbers.empty?
14
+ else
15
+ @numbers = problem_numbers
16
+ end
17
+
18
+ @numbers.each do |number|
19
+ if (number.to_i < 1) || (number.to_i > 9) || (number.to_f != number.to_i)
20
+ return "Please only enter integers between 1 and 9"
21
+ end
22
+ end
23
+
24
+ op_permutation = @operators.repeated_permutation(3)
25
+ num_permutation = @numbers.permutation(4).to_a.uniq
26
+
27
+ num_permutation.each do |numbers|
28
+ op_permutation.each do |operators|
29
+ begin
30
+ forward_result = instance_eval("((#{numbers[0].to_f} #{operators[0]} #{numbers[1]}.to_f) #{operators[1]} #{numbers[2]}.to_f) #{operators[2]} #{numbers[3].to_f}")
31
+ rescue ZeroDivisionError
32
+ forward_result = 0
33
+ end
34
+ begin
35
+ alternate_result = instance_eval("(#{numbers[0].to_f} #{operators[0]} #{numbers[1].to_f}) #{operators[1]} (#{numbers[2].to_f} #{operators[2]} #{numbers[3].to_f})")
36
+ rescue ZeroDivisionError
37
+ alternate_result = 0
38
+ end
39
+
40
+ begin
41
+ reverse_result = instance_eval("#{numbers[0].to_f} #{operators[0]} (#{numbers[1].to_f} #{operators[1]} (#{numbers[2].to_f} #{operators[2]} #{numbers[3].to_f}))")
42
+ rescue ZeroDivisionError
43
+ reverse_result = 0
44
+ end
45
+
46
+ if forward_result == @target
47
+ if (operators.include?("+") || operators.include?("-")) && (operators.include?("*") || operators.include?("/"))
48
+ #Might need parentheses for order of operations
49
+ return "((#{numbers[0]} #{operators[0]} #{numbers[1]}) #{operators[1]} #{numbers[2]}) #{operators[2]} #{numbers[3]} = 24"
50
+ else
51
+ return "#{numbers[0]} #{operators[0]} #{numbers[1]} #{operators[1]} #{numbers[2]} #{operators[2]} #{numbers[3]} = 24"
52
+ end
53
+ elsif alternate_result == @target
54
+ return "(#{numbers[0]} #{operators[0]} #{numbers[1]}) #{operators[1]} (#{numbers[2]} #{operators[2]} #{numbers[3]}) = 24"
55
+ elsif reverse_result == @target
56
+ return "#{numbers[0]} #{operators[0]} (#{numbers[1]} #{operators[1]} (#{numbers[2]} #{operators[2]} #{numbers[3]})) = 24"
57
+ end
58
+ end
59
+ end
60
+ return "No solution found"
61
+ end
62
+ end
63
+
64
+
65
+
66
+
67
+
68
+
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: math24
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Randall Reed, Jr.
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-07-08 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Randomly generates a solvable 24 Game problem, verifies user's solution
14
+ email: randallreedjr@gmail.com
15
+ executables:
16
+ - math24
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/math24
21
+ - lib/math24.rb
22
+ - lib/math24gamecli.rb
23
+ - lib/math24solver.rb
24
+ homepage: http://rubygems.org/gems/math24
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.2.2
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Command-line Math 24 game
48
+ test_files: []