HW impossibility?: "Create a rock paper scissors program in ruby WITHOUT using conditionals"
Here's one only using hashes:
RULES = { :rock => {:rock => :draw, :paper => :paper, :scissors => :rock}, :paper => {:rock => :paper, :paper => :draw, :scissors => :scissors}, :scissors => {:rock => :rock, :paper => :scissors, :scissors => :draw}}def play(p1, p2) RULES[p1][p2]endputs play(:rock, :paper) # :paperputs play(:scissors, :rock) # :rockputs play(:scissors, :scissors) # :draw
def winner(p1, p2) wins = {rock: :scissors, scissors: :paper, paper: :rock} {true => p1, false => p2}[wins[p1] == p2]end
winner(:rock, :rock) # => :rock d'oh! – tokland
Per @sarnold, leaving this as an exercise for the student :).
I very much doubt you've seen array/set intersections, so just for fun:
def who_wins(p1, p2) win_moves = {"rock" => "paper", "paper" => "scissors", "scissors" => "rock"} ([p1, p2] & win_moves.values_at(p1, p2)).firstendwho_wins("rock", "paper") # "paper"who_wins("scissors", "rock") # "rock"who_wins("scissors", "scissors") # nil