require 'test/unit'
class WrongNumberOfPlayersError < StandardError ; end
class NoSuchStrategyError < StandardError ; end
STRATS = ['R','P','S']
PLAYER2_WINS = [['R','P'], ['P','S'],['S','R']]
def rps_game_winner(game)
raise WrongNumberOfPlayersError unless game.length == 2
# strategy error checking
raise NoSuchStrategyError unless game[0].length == 2 && game[1].length == 2
strat1 = game[0][1].upcase
strat2 = game[1][1].upcase
raise NoSuchStrategyError unless STRATS.include?(strat1) && STRATS.include?(strat2)
matchup = [strat1, strat2]
return PLAYER2_WINS.include?(matchup) ? game[1] : game[0] # player1 wins if 2 doesn't
end
class RpsWinner < Test::Unit::TestCase
def test_examples
expected = ['John', 'P']
actual = rps_game_winner([['John', 'P'], ['Rick', 'R']])
assert_equal(expected, actual)
expected = ['John', 'P']
actual = rps_game_winner([['John', 'P'], ['Rick', 'R']])
assert_equal(expected, actual)
end
def test_num_of_players_errors
assert_raise WrongNumberOfPlayersError do
rps_game_winner([['John', 'P'], ['Rick', 'R'], ['Rick', 'R']])
end
assert_raise WrongNumberOfPlayersError do
rps_game_winner([['John', 'P']])
end
assert_raise WrongNumberOfPlayersError do
rps_game_winner("Hello")
end
assert_raise WrongNumberOfPlayersError do
rps_game_winner([])
end
assert_raise WrongNumberOfPlayersError do
rps_game_winner([[]])
end
end
def test_num_of_players_errors
assert_raise NoSuchStrategyError do
rps_game_winner([['John', 'Q'], ['Rick', 'R']])
end
assert_raise NoSuchStrategyError do
rps_game_winner([['John', 'R'], ['Rick', 'X']])
end
assert_nothing_raised NoSuchStrategyError do
rps_game_winner([['John', 'p'], ['Rick', 'r']])
end
end
end
cmVxdWlyZSAndGVzdC91bml0JwoKY2xhc3MgV3JvbmdOdW1iZXJPZlBsYXllcnNFcnJvciA8IFN0YW5kYXJkRXJyb3IgOyBlbmQgCmNsYXNzIE5vU3VjaFN0cmF0ZWd5RXJyb3IgPCBTdGFuZGFyZEVycm9yIDsgZW5kIAogClNUUkFUUyA9IFsnUicsJ1AnLCdTJ10KUExBWUVSMl9XSU5TID0gW1snUicsJ1AnXSwgWydQJywnUyddLFsnUycsJ1InXV0KCmRlZiBycHNfZ2FtZV93aW5uZXIoZ2FtZSkgCiAgICByYWlzZSBXcm9uZ051bWJlck9mUGxheWVyc0Vycm9yIHVubGVzcyBnYW1lLmxlbmd0aCA9PSAyIAoKICAgICMgc3RyYXRlZ3kgZXJyb3IgY2hlY2tpbmcKICAgIHJhaXNlIE5vU3VjaFN0cmF0ZWd5RXJyb3IgdW5sZXNzIGdhbWVbMF0ubGVuZ3RoID09IDIgJiYgZ2FtZVsxXS5sZW5ndGggPT0gMgogICAgc3RyYXQxID0gZ2FtZVswXVsxXS51cGNhc2UKICAgIHN0cmF0MiA9IGdhbWVbMV1bMV0udXBjYXNlCiAgICByYWlzZSBOb1N1Y2hTdHJhdGVneUVycm9yIHVubGVzcyBTVFJBVFMuaW5jbHVkZT8oc3RyYXQxKSAmJiBTVFJBVFMuaW5jbHVkZT8oc3RyYXQyKQoKICAgIG1hdGNodXAgPSBbc3RyYXQxLCBzdHJhdDJdCiAgICByZXR1cm4gUExBWUVSMl9XSU5TLmluY2x1ZGU/KG1hdGNodXApID8gZ2FtZVsxXSA6IGdhbWVbMF0gIyBwbGF5ZXIxIHdpbnMgaWYgMiBkb2Vzbid0CmVuZCAKCgpjbGFzcyBScHNXaW5uZXIgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQoKICAgIGRlZiB0ZXN0X2V4YW1wbGVzCiAgICAgICAgZXhwZWN0ZWQgPSBbJ0pvaG4nLCAnUCddCiAgICAgICAgYWN0dWFsID0gcnBzX2dhbWVfd2lubmVyKFtbJ0pvaG4nLCAnUCddLCBbJ1JpY2snLCAnUiddXSkKICAgICAgICBhc3NlcnRfZXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkKCiAgICAgICAgZXhwZWN0ZWQgPSBbJ0pvaG4nLCAnUCddCiAgICAgICAgYWN0dWFsID0gcnBzX2dhbWVfd2lubmVyKFtbJ0pvaG4nLCAnUCddLCBbJ1JpY2snLCAnUiddXSkKICAgICAgICBhc3NlcnRfZXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkKICAgIGVuZAoKICAgIGRlZiB0ZXN0X251bV9vZl9wbGF5ZXJzX2Vycm9ycwogICAgICAgIGFzc2VydF9yYWlzZSBXcm9uZ051bWJlck9mUGxheWVyc0Vycm9yIGRvCiAgICAgICAgICAgIHJwc19nYW1lX3dpbm5lcihbWydKb2huJywgJ1AnXSwgWydSaWNrJywgJ1InXSwgWydSaWNrJywgJ1InXV0pCiAgICAgICAgZW5kCiAgICAgICAgYXNzZXJ0X3JhaXNlIFdyb25nTnVtYmVyT2ZQbGF5ZXJzRXJyb3IgZG8KICAgICAgICAgICAgcnBzX2dhbWVfd2lubmVyKFtbJ0pvaG4nLCAnUCddXSkKICAgICAgICBlbmQKICAgICAgICBhc3NlcnRfcmFpc2UgV3JvbmdOdW1iZXJPZlBsYXllcnNFcnJvciBkbwogICAgICAgICAgICBycHNfZ2FtZV93aW5uZXIoIkhlbGxvIikKICAgICAgICBlbmQKICAgICAgICBhc3NlcnRfcmFpc2UgV3JvbmdOdW1iZXJPZlBsYXllcnNFcnJvciBkbwogICAgICAgICAgICBycHNfZ2FtZV93aW5uZXIoW10pCiAgICAgICAgZW5kCiAgICAgICAgYXNzZXJ0X3JhaXNlIFdyb25nTnVtYmVyT2ZQbGF5ZXJzRXJyb3IgZG8KICAgICAgICAgICAgcnBzX2dhbWVfd2lubmVyKFtbXV0pCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICBkZWYgdGVzdF9udW1fb2ZfcGxheWVyc19lcnJvcnMKICAgICAgICBhc3NlcnRfcmFpc2UgTm9TdWNoU3RyYXRlZ3lFcnJvciBkbwogICAgICAgICAgICBycHNfZ2FtZV93aW5uZXIoW1snSm9obicsICdRJ10sIFsnUmljaycsICdSJ11dKQogICAgICAgIGVuZAogICAgICAgIGFzc2VydF9yYWlzZSBOb1N1Y2hTdHJhdGVneUVycm9yIGRvCiAgICAgICAgICAgIHJwc19nYW1lX3dpbm5lcihbWydKb2huJywgJ1InXSwgWydSaWNrJywgJ1gnXV0pCiAgICAgICAgZW5kCiAgICAgICAgYXNzZXJ0X25vdGhpbmdfcmFpc2VkIE5vU3VjaFN0cmF0ZWd5RXJyb3IgZG8KICAgICAgICAgICAgcnBzX2dhbWVfd2lubmVyKFtbJ0pvaG4nLCAncCddLCBbJ1JpY2snLCAnciddXSkKICAgICAgICBlbmQKICAgIGVuZAplbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA==