TLDR
Отсутствие упорядочения в наборе делает возвращение max(set(hands))
нестабильным, иногда возвращает неправильный ответ, иногда правильный.
После многих копаний, я думаю, я нашелисточник ошибки.Начнем с того, что ваша логика была правильной: вызвав set (), вы удалили дубликаты, поэтому результат должен быть одинаковым с дубликатами или без них.
В исходном коде, если второй тестовый пример закомментированиспользование set(hands)
пропустит другие случаи (по крайней мере, в моей среде).Таким образом, проблема может заключаться во втором тестовом случае.
Если вы изолируете второй тестовый случай и запустите программу с set(hands)
, скажем, 20 раз, сложная вещь случается: большую часть времениконтрольный пример проваливается, но через несколько раз он действительно проходит!
Это безумие!Один и тот же код дает разные результаты.Правильный вывод для второго контрольного примера - ('TD', 'TC', '7C', 'TH', 'TS')
.Но функция max также будет возвращать как минимум два других выхода ('TD', 'TC', '7C', 'TH', 'TC')
и ('TD', 'TC', '7C', 'TD', 'TS')
.
Если вы проверите возвращаемое значение hand_rank()
при вызове на всех этих трех руках, результаты будут одинаковыми (7, 10, 7)
.Другими словами, эти три руки идентичны в своем рейтинге.Таким образом, какой из них возвращать как max, зависит от того, передан ли он списку или набору функции max.
Если передан список, как в случае hands
, первое вхождениенаибольшее значение возвращается.В этом случае индекс ('TD', 'TC', '7C', 'TH', 'TS')
равен 9081, индекс ('TD', 'TC', '7C', 'TH', 'TC')
равен 9627, а индекс ('TD', 'TC', '7C', 'TD', 'TS')
равен 9102. Следовательно, когда передается hands
, правильный ответ ('TD', 'TC', '7C', 'TH', 'TS')
всегда возвращается.
Если набор передан, поскольку отсутствует внутреннее упорядочение, возвращаемое значение может варьироваться, что в точности соответствует поведению, которое мы наблюдали.Для дальнейшего тестирования вы можете попробовать это:
max([(2,'a'),(2,'b'),(2,'c')],key=lambda x:x[0]) # output (2, 'a')
max({(2,'a'),(2,'b'),(2,'c')},key=lambda x:x[0]) # output (2, 'c') or any of the other two depending on implementation
В заключение, причиной неудачного теста при пропуске set(hands)
является зависящее от реализации поведение вызова max на множестве, когда несколько элементов имеют одинаковое ранжирование.,Но чтобы продвинуть эту проблему дальше, может быть, просто удача, что правильный ответ возвращается с hands
, потому что, если во время шага комбинации неправильный ответ добавляется перед правильным ответом, неправильный ответ будет возвращен функцией max.,Я бы сказал, что контрольный пример следует изменить, чтобы включить все эти три руки в качестве потенциального правильного ответа.