Обновление: я понимаю, что поставил вопрос очень плохо.Вот второй прогон.
Рассмотрим следующую функцию:
myList = []
optimumList = []
def findOptimumListItems():
n = 5
for i in range (n + 1):
for j in range (n + 1 - i):
myList.append((i, j, n-i-j))
for i in myList:
win = 0.0
draw = 0.0
for j in myList:
score = 0
if (i[0] > j[0]):
score += 1
if (i[0] == j[0]):
score += 0.5
if (i[1] > j[1]):
score += 1
if (i[1] == j[1]):
score += 0.5
if (i[2] > j[2]):
score += 1
if (i[2] == j[2]):
score += 0.5
if (score == 2):
win += 1
if (score == 1.5):
draw += 1
if (win/(len(myList)-win-draw) > 1.0):
optimumList.append(i)
return optimumList
Сначала я составлю список.Для n = 5 сгенерированный список имеет вид:
[(0, 0, 5), (0, 1, 4), (0, 2, 3), (0, 3, 2), (0, 4, 1),
(0, 5, 0), (1, 0, 4), (1, 1, 3), (1, 2, 2), (1, 3, 1),
(1, 4, 0), (2, 0, 3), (2, 1, 2), (2, 2, 1), (2, 3, 0),
(3, 0, 2), (3, 1, 1), (3, 2, 0), (4, 0, 1), (4, 1, 0),
(5, 0, 0)]
Затем функция берет каждый элемент списка и сравнивает его с самим списком.Вот как вы это делаете: скажем, я сравниваю [0, 0, 5] с [3, 1, 1].0 проигрывает 3 (поэтому нет очков), 0 проигрывает 1, поэтому нет очков, 5 побед против 1 (1 очко за это).За ничью 0,5 очка, за победу - 1 очко.Для любого предмета, если выигрыши больше, чем проигрыши, тогда этот предмет считается оптимальным и добавляется в оптимальный список.
Для n = 5 оптимальный список:
[(0, 2, 3), (0, 3, 2), (1, 1, 3), (1, 2, 2), (1, 3, 1), (2, 0, 3),
(2, 1, 2), (2, 2, 1), (2, 3, 0), (3, 0, 2), (3, 1, 1), (3, 2, 0)]
Myвопрос: как я могу написать вышеупомянутую функцию в кратком способе?Меня особенно интересуют функциональные алгоритмы.Будут оценены ответы на Python, Ruby, Java, Haskell.(Сказав это, если у вас есть четкое решение на любом языке; это нормально.)
Извините за повторение того же вопроса.Я согласен, что первоначальный вопрос был запутанным и трудным для понимания.Надеюсь, теперь все ясно.
Обновление (после комментария rampion): Существует ли эффективный алгоритм для этой (или этого типа) проблемы?