Здравствуйте, у меня есть задача. На плоскости нарисованы 2002 вектора. Два игрока по очереди выбирают по одному вектору до тех пор, пока они не кончатся. Проигрывает тот, у кого сумма выбранных им векторов имеет меньшую длину. Может ли начинающий так построить свою игру, чтобы не проиграть?
Звучит как неудачная пародия. Первому игроку надо просто каждый раз брать максимальный вектор из существующих. Ознакомьтесь с тегом code, довольно сложно читать это.
from functools import total_ordering
from math import sqrt
from random import randint
class Point(object):
def __init__(self, x, y):
self._x = x
self._y = y
@property
def x(self):
return self._x
@property
def y(self):
return self._y
@total_ordering
class Vector(object):
def __init__(self, start, end):
self.start = start
self.end = end
self._length = sqrt( (self.end.x - self.start.x) ** 2 +
(self.end.y - self.start.y) ** 2 )
@property
def length(self):
return self._length
def __gt__(self, other):
return self.length > other.length
def __eq__(self, other):
return self.length == other.length
def generate_pairs(minx=0, maxx=100, miny=0, maxy=100, count=100):
for _ in xrange(count):
yield ( Point(randint(minx, maxx), randint(miny, maxy)),
Point(randint(minx, maxx), randint(miny, maxy)) )
def generate_vectors(gen_pairs, count=20):
return [ Vector(*pair) for pair in gen_pairs(count=count) ]
def choosing_game(vectors):
first_player_vectors = []
second_player_vectors = []
while vectors:
first_choice = max(vectors)
first_player_vectors.append(first_choice)
vectors.remove(first_choice)
second_choice = max(vectors)
second_player_vectors.append(second_choice)
vectors.remove(second_choice)
first_sum = sum([ vector.length for vector in first_player_vectors ])
second_sum = sum([ vector.length for vector in second_player_vectors ])
if first_sum == second_sum:
return 'draw'
elif first_sum > second_sum:
return 'first'
else:
return 'second'
def monte_carlo(trials=1000):
results = { 'draw': 0, 'first': 0, 'second': 0 }
for trial in xrange(trials):
vectors = generate_vectors(generate_pairs, 10)
results[choosing_game(vectors)] += 1
return results
print monte_carlo()
[22:52] home:~/dev python help.py
{'draw': 0, 'second': 0, 'first': 1000}