Уведомления

Группа в Telegram: @pythonsu

#1 Май 29, 2012 20:27:22

OksanaOksana
Зарегистрирован: 2012-05-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти max в массиве массивов

Здравствуйте, у меня есть задача. На плоскости нарисованы 2002 вектора. Два игрока по очереди выбирают по одному вектору до тех пор, пока они не кончатся. Проигрывает тот, у кого сумма выбранных им векторов имеет меньшую длину. Может ли начинающий так построить свою игру, чтобы не проиграть?
вот как задала векторы, на выходе получаю массив массивов с двумя координатами векторов(пока до 20 взяла):*
Как можно найти максимальную координату x, то есть первую (не просто max от всего массива)
*
from random import *
from math import *

class vector(object):
def __init__(self,x,y):
self.x = x
self.y = y

mas_x =
mas_y =
for i in range(20):
a = randint (1, 10)
mas_x.append(a)

for i in range(20):
a = randint (1, 10)
mas_y.append(a)

print mas_x
print mas_y
mas_x_y =
mas_vector =
j = 0
while j!=20:
vector.x = mas_x
vector.y = mas_y
mas_x_y= mas_x_y + +
mas_vector = mas_vector +
mas_x_y =
j = j + 1
print
print('Вот наши векторы!!!')
print
print mas_vector

Офлайн

#2 Май 29, 2012 21:03:59

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Найти max в массиве массивов

Здравствуйте, у меня есть задача. На плоскости нарисованы 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}



Отредактировано fata1ex (Май 30, 2012 00:37:41)

Офлайн

#3 Май 29, 2012 21:41:46

OksanaOksana
Зарегистрирован: 2012-05-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти max в массиве массивов

спасибо, только этот код почему то не идет у меня…

Офлайн

#4 Май 29, 2012 21:45:01

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Найти max в массиве массивов

Что значит “не идет”? Во-первых, у вас другая версия питона, поэтому могут быть нестыковки. Разбирайтесь, пишите, что не получается.

Ага. Bидимо, всё-таки надо суммировать выбранные игроками векторы, а не суммировать их длины. В таком случае логика выбора должна поменяться. С этим уж как-нибудь самостоятельно.



Отредактировано fata1ex (Май 30, 2012 00:38:22)

Офлайн

#5 Май 29, 2012 23:18:26

OksanaOksana
Зарегистрирован: 2012-05-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти max в массиве массивов

Я пока пытаюсь поработать со своим кривым кодом, у меня появился другой вопрос…
Если я с клавиатуры ввожу какой либо элемент(массив) своего массива векторов и при нахождении таково же удаляю его, длина массива у меня меняется соответственно и вылетает ошибка, как можно это реализовать?

while len(mas_vector) >= 1:
print mas_vector
a = input ('Выберите вектор: ')
user_score += 1
j = 0
len_mas = len(mas_vector)
while j!=len_mas:
if a == mas_vector:
mas_vector.pop(j)
j = j + 1
else:
j = j + 1

Офлайн

#6 Май 29, 2012 23:33:21

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Найти max в массиве массивов

Еще раз вам говорю: оформляйте ваши примеры в тегах code.

>>> arrays = [[1,2],[3,4],[5,6]]
>>> needle = map(int, raw_input('Enter array to remove: ').split())
Enter array to remove: 1 2
>>> needle
[1, 2]
>>> arrays.remove(needle)
>>> arrays
[[3, 4], [5, 6]]



Офлайн

#7 Май 30, 2012 01:12:54

OksanaOksana
Зарегистрирован: 2012-05-27
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти max в массиве массивов

спасибо, помогло

Офлайн

#8 Май 30, 2012 02:31:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

Найти max в массиве массивов

OksanaOksana
Проигрывает тот, у кого сумма выбранных им векторов имеет меньшую длину.
сумма векторов - это вектор
например, два противоположных вектора в сумме дают нуль-вектор, длина которого равна нулю



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version