math24 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
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: []