Skip to content

Instantly share code, notes, and snippets.

@solutus
Last active June 26, 2020 15:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save solutus/f95e4601b3e9a8f53eb5f177146fe31a to your computer and use it in GitHub Desktop.
Save solutus/f95e4601b3e9a8f53eb5f177146fe31a to your computer and use it in GitHub Desktop.
# Представь, что ты работаешь в букмекерской конторе программистом и тебя попросили написать функцию,
# которая на вход принимает два футбольных счета - тот который загадал клиент когда делал ставку
# и реальный результат футбольного матча (то как сыграли команды на самом деле). На выходе нужно получить:
# 2 - если клиент полностью угадал счет
# 1 - если клиент угадал какая команда победит или угадал ничью
# 0 - если не угадал ничего
#
# счет кодируется строкой вида "1:0"
#
def run(client_result, real_result)
results = { exact: 2, win_or_draw: 1, nothing: 0 }.freeze
# contract
pattern = /\d+:\d+/
[client_result, real_result].each do |input|
raise "#{input} is invalid. pattern: #{pattern}" unless input.match pattern
end
return results.fetch(:exact) if client_result == real_result
p_left, p_right = client_result.split(':').map(&:to_i)
r_left, r_right = real_result.split(':').map(&:to_i)
win_or_draw_guessed = (p_left - p_right <=> 0) == (r_left - r_right <=> 0)
return results.fetch(:win_or_draw) if win_or_draw_guessed
return results.fetch(:nothing)
end
def test_me(predict_result, real_result, expected)
result = run(predict_result, real_result)
puts "#{predict_result} - #{real_result} : #{result}"
puts "result: #{ result == expected}"
puts "---------------"
end
test_me("1:0", "1:0", 2)
test_me("0:1", "0:1", 2)
test_me("2:2", "2:2", 2)
test_me("1:0", "2:1", 1)
test_me("1:3", "2:4", 1)
test_me("1:1", "2:2", 1)
test_me("9:0", "10:0", 1)
test_me("1:2", "1:0", 0)
test_me("2:1", "1:2", 0)
test_me("2:1", "1:1", 0)
test_me("1:1", "2:1", 0)
test_me("1:1", "2:3", 0)
begin
run("x:0", "1:0")
rescue => e
puts e.message
end
begin
run("1:0", "1:x")
rescue => e
puts e.message
end
@solutus
Copy link
Author

solutus commented Jun 26, 2020

1:0 - 1:0 : 2
result: true
---------------
0:1 - 0:1 : 2
result: true
---------------
2:2 - 2:2 : 2
result: true
---------------
1:0 - 2:1 : 1
result: true
---------------
1:3 - 2:4 : 1
result: true
---------------
1:1 - 2:2 : 1
result: true
---------------
9:0 - 10:0 : 1
result: true
---------------
1:2 - 1:0 : 0
result: true
---------------
2:1 - 1:2 : 0
result: true
---------------
2:1 - 1:1 : 0
result: true
---------------
1:1 - 2:1 : 0
result: true
---------------
1:1 - 2:3 : 0
result: true
---------------
x:0 is invalid. pattern: (?-mix:\d+:\d+)
1:x is invalid. pattern: (?-mix:\d+:\d+)

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