Yup, this is still very much alpha and can be refactored. I’ve broken it apart into multiple files, had other plans and ran out of time, but the meat of the code is in guessing_game.rb.
magic_trick.rb
class MagicTrick
attr_reader :tricks
def initialize(tricks, file_input = './magic_trick_input.txt')
@tricks = tricks
parse File.read(file_input)
end
def parse(contents)
tricks = @tricks.new contents.split("\n")
tricks.perform
puts tricks.results
end
end
magic_trick = MagicTrick.new(GuessingGame)
guessing_game.rb
class GuessingGame
attr_reader :total_tricks, :trick_config, :results
def initialize(trick_config)
@total_tricks = trick_config.slice!(0).to_i
@trick_config = trick_config
@results = []
end
def perform
@trick_config.each_slice(10).each_with_index { |line, idx| build(line, idx) }
end
private
def build(l, idx)
tricks = get_card_grid(l)
@results < < "Case #%s: %s" % [idx+1, validate(tricks)]
end
def validate(trick)
return 'Volunteer cheated!' if trick[0] === trick[1]
intersection = trick[0] & trick[1]
return intersection[0] if intersection.any?
'Bad magician!'
end
def get_card_grid(line)
2.times.map do |index|
start = index*5
range = (start+1..start+14)
line[range][(line[start].to_i)-1].split
end
end
end
magic_trick_input.txt
3
2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
3
1 2 5 4
3 11 6 15
9 10 7 12
13 14 8 16
2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
3
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
You must log in to post a comment.