Найти - Пользователи
Полная версия: Найти max в массиве массивов
Начало » Центр помощи » Найти max в массиве массивов
1
OksanaOksana
Здравствуйте, у меня есть задача. На плоскости нарисованы 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
fata1ex
Здравствуйте, у меня есть задача. На плоскости нарисованы 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}
OksanaOksana
спасибо, только этот код почему то не идет у меня…
fata1ex
Что значит “не идет”? Во-первых, у вас другая версия питона, поэтому могут быть нестыковки. Разбирайтесь, пишите, что не получается.

Ага. Bидимо, всё-таки надо суммировать выбранные игроками векторы, а не суммировать их длины. В таком случае логика выбора должна поменяться. С этим уж как-нибудь самостоятельно.
OksanaOksana
Я пока пытаюсь поработать со своим кривым кодом, у меня появился другой вопрос…
Если я с клавиатуры ввожу какой либо элемент(массив) своего массива векторов и при нахождении таково же удаляю его, длина массива у меня меняется соответственно и вылетает ошибка, как можно это реализовать?

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
fata1ex
Еще раз вам говорю: оформляйте ваши примеры в тегах 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]]
OksanaOksana
спасибо, помогло
py.user.next
OksanaOksana
Проигрывает тот, у кого сумма выбранных им векторов имеет меньшую длину.
сумма векторов - это вектор
например, два противоположных вектора в сумме дают нуль-вектор, длина которого равна нулю
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB