2015-03-12 5 views
0

Программа, которую я делаю, предназначена для проверки судоку из текстового файла. Пока у меня это есть.Удаление дубликатов со словарного значения

file=input("Enter a filename: ") 
with open(file) as data: 
    rowt=[0 for i in range(9)] 
    colt=[0 for i in range(9)] 
    for a,b in enumerate(data): 
     sb_rowt = 0 
     print (a,b) 
     for c, d in enumerate(b.split()): 
      print (c,d) 
      sb_rowt+=int(d) 
      colt[c]+=int(d) 
     rowt[a]=sb_rowt 
    rows=all(i==45 for i in rowt) 
    cols=all(i==45 for i in colt) 
    print(rows and cols) 

Проблема с этим состоит в том, что если у меня есть текстовый файл, например, как это

5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 5 

программа будет по-прежнему выводится как верно. Я знаю, что мне нужно удалить любые повторяющиеся записи, но я не уверен, как это сделать.

+0

Вместо проверки, добавляет ли сумма до 45, просто проверить, присутствуют ли все номера! –

ответ

0

Вопрос: Я думаю, что вы не на правильном пути. Действителен или нет, на плате всегда должно быть 9 * 9 номеров. Вы получаете правильный ввод, но не проверяете его. Подумайте об уточнении алгоритма проверки.

0

Вы должны отделить чтения и проверки операций:

# read first 
file = input("Enter a filename: ") 
with open(file) as data: 
    array = [ [ int(i) for i in line.split() ] for line in data ] 

И проверить только тогда.

# first create a set of numbers 1...9 
all_numbers = set(range(1, 10)) 

# validate rows and columns: 
valid = True 

# we validate ith row and column in the same loop 
for i in range(9): 
    row_i = array[i] 
    column_i = [ array[rownum][i] for rownum in range(9) ] 
    valid &= set(row_i) == all_numbers 
    valid &= set(column_i) == all_numbers 

# valid is True if all constraints succeeded. 

# TODO: in sudoku you also need to validate the 
# 3x3 subsquares. 
0

Вы не можете просто использовать сумму чисел, чтобы проверить сетку. Вместо этого, вы должны проверить, содержит ли каждая строка и каждый столбец все числа от 1 до 9.

Вы могли бы попробовать что-то вроде этого:

all_nums = set(range(1, 10)) 
with open("data") as data: 
    field = [[int(x) for x in line.split()] for line in data] 
    rows = map(set, field) 
    cols = map(set, zip(*field)) 
    rows_ok = all(row == all_nums) for row in rows) 
    cols_ok = all(col == all_nums) for col in cols) 

Сначала я создать список списков целых чисел от ввод данных. Затем я извлекаю строки и столбцы (zip(*field) в основном переворачивает field сбоку) и превращайте их в set, так как порядок не важен. Наконец, я просто сравниваю строки и столбцы с all_nums.

0
import csv 
import collections 

with open('path/to/file') as infile: 
    board = [[int(i) for i in row] for row in csv.reader(infile)] 
for r,row in enumerate(board): 
    counts = collections.Counter(row) 
    if all(row[k]==1 for k in range(1,10)): 
     continue 
    raise ValueError("failed on row %d" %r) 

for c,col in enumerate(zip(*rows)): 
    if all(col[k]==1 for k in range(1,10)): 
     continue 
    raise ValueError("failed on col %d" %c) 

# todo: check each 3x3 square 
0

Поставка ваш совет, как список списков:

def validate(board): 
    valid = set(range(1, 10)) 
    return (all(valid == set(r) for r in board) and 
      all(valid == set(c) for c in zip(*board)) and 
      all(valid == set(board[i][j:j+3] + board[i+1][j:j+3] + board[i+2][j:j+3]) 
       for i in (0, 3, 6) for j in (0, 3, 6))) 
Смежные вопросы