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 +7 -0
- data/bin/math24 +8 -0
- data/lib/math24.rb +35 -0
- data/lib/math24gamecli.rb +20 -0
- data/lib/math24solver.rb +68 -0
- metadata +48 -0
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
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
|
data/lib/math24solver.rb
ADDED
@@ -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: []
|