Unfair Dice Unfair Dice
Moderate
EN Russian

Для решения этой задачи, вы идете играть в кости, но прежде всего вы должны к этому хорошенько подготовиться. Суть игры давольно проста - оба игрока несколько раз кидают по одному кубику и тот, у кого выпадает наибольшее количество баллов - тот и выиграл.

Но это нестандартная игра в кости. Здесь каждый игрок на своем кубике может установить любое положительное число на каждой из сторон кубика, но при одном условии - количество сторон и сумма чисел на этих сторонах должна быть такой же, как и у соперника. Например, один из игроков использует шестигранный кубик с числами [3, 3, 3, 3, 6, 6] на гранях, тогда другой игрок также обязан использовать шестигранный кубик, где он нанес числа [4, 4, 4, 4, 4, 4]. Интересная часть этой игры заключается в том, что при равном числе сторон и одинаковой общей сложности, разные кости имеют разные шансы на выигрыш. Например игрок, который использует кубик со всеми 4-ми на сторонах, выиграет у соперника в 2-х случаях из 3-х.

Чтобы подготовиться к этой игре, вам необходимо исследовать различные варианты выбора номера. Для этого нужно написать программу, которая будет на входе принимать кубик противника, и выдавать на выходе некоторый кубик, который выиграет в более чем половине случаев. Если такого кубика не существует, то программа возвращать пустой список. Общую вероятность победы необходимо считать, как сумму вероятностей выиграша каждого числа с вашего кубика, по отношению к каждому числу кубика соперника. Т.е. если взять за условие, что 1 это выигрыш, 0 - это ничья, а -1 это проигрыш, тогда для пары кубиков [1, 1, 3] и [1, 2, 2], где [1, 1, 3] это кубик соперника, вероятность можно посчитать следующим образом: у "1" с вашего кубика ничья с двумя "1" соперника и проигрыш "3", что даёт в итоге 0+0+(-1)=-1, для "2" с вашего кубика - выигрыш в двух случаях из трех, или 1+1+(-1)=1. Суммируя все данные по каждому числу на вашем кубике -1+1+1 = 1, получаем число большее нуля, а это означает, что ваш кубик выиграет в более чем половине случаев. Если бы результат был равен 0, тогда это была бы ничья т.е. 50/50. А если бы результат был бы отрицательным - тогда это однозначный проигрыш вашего кубика.

На входе: Сортированный список с целыми числами, где каждое число соответсвует одной из сторон кубика соперника.

На выходе: Список с целыми числами вашего варианта кубика, по одному на каждую сторону, или пустой список.

Пример:

winning_die([3, 3, 3, 3, 6, 6]) == [4, 4, 4, 4, 4, 4] # или [3, 3, 4, 4, 5, 5]
winning_die([4, 4, 4, 4, 4, 4]) == [2, 2, 5, 5, 5, 5] # или [5, 5, 2, 2, 5, 5]
winning_die([2, 2, 5, 5, 5, 5]) == [3, 3, 3, 3, 6, 6]
winning_die([1, 1, 3]) == [1, 2, 2]
winning_die([1, 2, 3, 4, 5, 6]) == [] # Любой шестигранный кубик с суммой сторон = 21, будет иметь шансы на выигрыш не более чем 50/50.
winning_die([2, 3, 4, 5, 6, 7]) == [1, 1, 3, 7, 7, 8] # Как один из вариантов.
winning_die([1, 2, 3, 4, 5, 6]) == []

Как это использовать: Эта задача иллюстрирует некоторые неинтуитивные результаты в теории вероятности. Многие люди думают, что если у двух костей одинаковое количество сторон и такая же сумма сторон, то они похожи, и у них примерно одинаковые шансы друг против друга, т.е. 50/50. А еще более необычным является тот факт, что можно создать такие наборы кубиков, где кубик А выигрывает у B, B выигрывает у C, но при этом С выигрывает у А. Такой набор игральных костей называется нетранзитивные кости.

Предусловия:
3 ≤ len(die) ≤ 10
sum(die) ≤ 100
min(die) ≥ 1
max(die) ≤ 18