Skip to content

Instantly share code, notes, and snippets.

@christiangenco
Created September 19, 2013 22:59
Show Gist options
  • Select an option

  • Save christiangenco/6631011 to your computer and use it in GitHub Desktop.

Select an option

Save christiangenco/6631011 to your computer and use it in GitHub Desktop.
Find the ideal move for The Factor Game (http://illuminations.nctm.org/ActivityDetail.aspx?ID=12)
require 'pry'
class Integer
def factors() (1...self).select { |n| (self % n).zero? } end
end
class Array
def score(n)
total = n
minus = n.factors.inject(0) {|sum, f|
if self.index f
f + sum
else
sum
end
}
return 0 if minus == 0
total - minus
end
def moves
self.map{|n|
[n, self.score(n)]
}
end
def best
moves = self.moves.sort_by{|a| a[1]}
move = moves.last
moves.reverse.each{|m|
if m[1] == move[1] && m[0] != move[0]
puts "\t#{m}"
# move = m
# move = m if rand > 0.5
end
break if m[1] < move[1] || m[1] == 0
}
move
end
end
numbers = (1..49).to_a
# numbers = (1..100).to_a
scores = [0, 0]
turn = 0
while numbers.length > 0
player = turn % 2
other = (turn+1) % 2
# if player == 0
move, score = numbers.best
# else
# move, score = numbers.moves.sample
# end
puts "Player #{player} chooses #{move}, player #{other} forced to choose #{(move.factors & numbers).join(', ')} (#{score})"
numbers.delete(move)
numbers -= move.factors
scores[player] += score
# binding.pry
turn += 1
end
puts "final: #{scores}"
@christiangenco
Copy link
Author

Example:

Player 0 chooses 47, player 1 forced to choose 1 (46)
Player 1 chooses 49, player 0 forced to choose 7 (42)
Player 0 chooses 35, player 1 forced to choose 5 (30)
Player 1 chooses 39, player 0 forced to choose 3, 13 (23)
Player 0 chooses 26, player 1 forced to choose 2 (24)
Player 1 chooses 46, player 0 forced to choose 23 (23)
Player 0 chooses 33, player 1 forced to choose 11 (22)
Player 1 chooses 45, player 0 forced to choose 9, 15 (21)
Player 0 chooses 38, player 1 forced to choose 19 (19)
Player 1 chooses 44, player 0 forced to choose 4, 22 (18)
Player 0 chooses 34, player 1 forced to choose 17 (17)
  [30, 14]
Player 1 chooses 28, player 0 forced to choose 14 (14)
Player 0 chooses 42, player 1 forced to choose 6, 21 (15)
Player 1 chooses 30, player 0 forced to choose 10 (20)
Player 0 chooses 40, player 1 forced to choose 8, 20 (12)
Player 1 chooses 32, player 0 forced to choose 16 (16)
  [24, 12]
Player 0 chooses 48, player 1 forced to choose 12, 24 (12)
Player 1 chooses 36, player 0 forced to choose 18 (18)
Player 0 chooses 43, player 1 forced to choose  (0)
Player 1 chooses 41, player 0 forced to choose  (0)
Player 0 chooses 37, player 1 forced to choose  (0)
Player 1 chooses 31, player 0 forced to choose  (0)
Player 0 chooses 29, player 1 forced to choose  (0)
Player 1 chooses 27, player 0 forced to choose  (0)
Player 0 chooses 25, player 1 forced to choose  (0)
final: [197, 195]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment