Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 26, 2010 20:50:23

ghostly_dog
От:
Зарегистрирован: 2010-04-26
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Останавливается процесс обработки

Решил в целях практики сделать вывод данных для судоку. Но при нахождение повторного значение в вертикали обработка останавливается, подозреваю что забивается память, но не понятно по чему.
Python 3.1.x

import random

A=[[],[],[],[],[],[],[],[],[]]
gorizontal=[]
line=str()

ok=True
while ok:
i=0
print("")
print("")
while i<9:
num=random.randint(1,9)
if A[i].count(num)==0 and gorizontal.count(num)==0:
A[i].append(num)
gorizontal.append(num)
i+=1
else:
continue
for i in gorizontal:
line+= " " + str(i)
print(line)
gorizontal=[]
line=""
if len(A[8]) == 9:
ok=False

input("Нажмите любую кнопку")
Почему то не выполняется этот условия, при нахождение в вертикали повтора. Вернее не идет сброс на начало цикла. Хотя по горизонтали все проходит
       if A[i].count(num)==0 and gorizontal.count(num)==0: 
A[i].append(num)
gorizontal.append(num)
i+=1
else:
continue



Отредактировано (Апрель 26, 2010 22:25:30)

Офлайн

#2 Апрель 26, 2010 22:14:50

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Останавливается процесс обработки

Почему переменная b юзается без определения?
Я получаю вот это при попытке выполнить ваш код:
NameError: name ‘b’ is not defined



Офлайн

#3 Апрель 26, 2010 22:26:04

ghostly_dog
От:
Зарегистрирован: 2010-04-26
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Останавливается процесс обработки

Ed
Почему переменная b юзается без определения?
Я получаю вот это при попытке выполнить ваш код:
NameError: name ‘b’ is not defined
это опечатка, исправил исходный код



Офлайн

#4 Апрель 27, 2010 00:07:57

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Останавливается процесс обработки

Циклит у вас из-за логической ошибки в алгоритме.
Достаточно, чтобы числа, которых не хватает в gorizontal уже были в A и все, вы попали.
Вот вам пример:
При i=8, A = и gorizontal = вы из вашего цикла while(i<9) не выйдете.



Офлайн

#5 Апрель 27, 2010 08:28:34

ghostly_dog
От:
Зарегистрирован: 2010-04-26
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Останавливается процесс обработки

Ed
Циклит у вас из-за логической ошибки в алгоритме.
Достаточно, чтобы числа, которых не хватает в gorizontal уже были в A и все, вы попали.
Вот вам пример:
При i=8, A = и gorizontal = вы из вашего цикла while(i<9) не выйдете.
Спс, понял свою ошибку. значит надо придумывать другой алгоритм.
Если ли какой ниб метод при котором рандом смотрит есть ли исключение?



Отредактировано (Апрель 27, 2010 08:33:11)

Офлайн

#6 Апрель 27, 2010 12:55:27

ghostly_dog
От:
Зарегистрирован: 2010-04-26
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Останавливается процесс обработки

переделал код полностью

import random

vert = [[], [], [], [], [], [], [], [], []]
gor = [[], [], [], [], [], [], [], [], []]
for x in range(0, 9):
for y in range(0, 9):
vert[x].append(" ")
gor[x].append(" ")


ok = True
while ok:
for x in range(0, 9):
for y in range(0, 9):
if vert[x][y] == " ":
num = random.randint(1, 9)
if vert[x].count(num) == 0:
if gor[y].count(num) == 0:
vert[x][y] = num
gor[y][x] = num
if vert.count(" ") == 0:
ok = False

def print_sud():
line = "|"
print("-" * 50)
for x in range(0, 9):
if x in (3, 6, 9):
print("|", "-" * 46, "|")
for y in range(0, 9):
if y in (3, 6, 9):
line += "|"
line += " " + str(gor[x][y]) + " "
print(line, "|")
line = "|"
print("-" * 50)


print_sud()
input("Нажмите любую кнопку")
смог добиться того чтобы он не останавливался, но почему выходит из цикла если остаются пробелы в списке
--------------------------------------------------
| 4 8 6 | 3 9 | 1 |
| 8 2 1 | 5 | 4 9 |
| 6 5 | 9 7 | 1 |
| ---------------------------------------------- |
| 7 6 2 | 1 9 | 3 |
| 3 9 | 6 4 | 8 |
| 4 7 | 2 | |
| ---------------------------------------------- |
| 3 8 | | 6 2 |
| 4 | 8 | 5 |
| 9 | 5 | 7 |
--------------------------------------------------
подобрать значения же можно



Отредактировано (Апрель 27, 2010 17:30:20)

Офлайн

#7 Апрель 27, 2010 15:18:59

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Останавливается процесс обработки

Если я правильно понял ваш код, то пробелы остаются потому что если условия vert.count(num)==0 и gor.count(num)==0 не выполняется, то vert и gor не устанавливаются и вы переходите к следующему элементу, а эти так и останутся пустыми.

Кстати, стиль оставляет желать лучшего. Читаем это: http://www.python.org/dev/peps/pep-0008/ и для начала прекращаем называть функции русскими именами.



Офлайн

#8 Апрель 27, 2010 16:26:59

ghostly_dog
От:
Зарегистрирован: 2010-04-26
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Останавливается процесс обработки

но я в цикле ставлю проверку

    if vert.count(" ")==0:
ok= False
как я полагаю, пока он находит пробелы цикл не должен завершаться

прочел бы документацию, если была бы на русском



Офлайн

#9 Апрель 27, 2010 22:02:03

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Останавливается процесс обработки

ghostly_dog
как я полагаю, пока он находит пробелы цикл не должен завершаться
vert - это двумерный список. Пробелы у вас на уровень ниже.
прочел бы документацию, если была бы на русском
А гугл на что? http://habrahabr.ru/blogs/python/76738/



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version