質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3712閲覧

Pythonでカックロを解きたい

mothi5656

総合スコア27

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/22 06:07

前提・実現したいこと

Pythonでカックロを解く
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

斜め線の数字で片方しかない部分がエラーの原因と考え、whileで条件を書いたのですが、エラーが解消できませんでした。

エラーメッセージ SyntaxError: invalid character in identifier

該当のソースコード

Python ソースコード from mip import* from itertools import product #model md=Model(name="") # CSVファイル入力 csv_file = sys.argv[1] with open(csv_file) as inp_f: read_file = csv.reader(inp_f) data = [row for row in read_file] sizes = data.pop(0) row = int(sys.argv[2]) #行数i cols = int(sys.argv[3]) #列数j #変数 x = [md.add_var('x_{}_{}_{}'.format(i,j,k),var_type='B')for i, j, k in product(range(rows), range(cols), range(9))] #制約 #白マスには1~9の数字が1つ入る for j in range(row): for i in range(cols): if '' in data[i][j]: md += xsum(x[i][j][k] for k in range(9)) == 1 continue #行の1つの白マスのつながりには、同じ数字が入らない for k in range(9): md += xsum(x[i][j][k] for j in range(cols)) <= 1 #縦への1つの白マスのつながりには、同じ数字が入らない for k in range(9): md += xsum(x[i][j][k] for i in range(row)) <= 1 #行の合計が等しいか for i in range(row): for j in range(cols): if '\' in data[i][j]: former, latter = data[i][j].split('\') xcnt = 0 while i<row and '' in data[i][j]: xcnt += 1 if latter != '': for j in range(xcnt): md += xsum((k+1) * x[i][j][k] for j in range(9)) == int(latter) #列の合計が等しいか for j in range(cols): for i in range(row): if '\' in data[i][j]: former, latter = data[i][j].split('\') ycnt = 0 while j<cols and '' in data[i][j]: ycnt += 1 if former != '': for i in range(ycnt): md += xsum((k+1) * x[i][j][k] for i in range(9)) == int(former) #出力

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

色々と間違っていましたが、できたので結果を残しておきます。

コード from mip import* from itertools import product import sys import csv #model md=Model(name="") # CSVファイル入力 csv_file = sys.argv[1] with open(csv_file+'.csv') as inp_f: read_file = csv.reader(inp_f) data = [row for row in read_file] sizes = data.pop(0) rows = int(sys.argv[2]) #行数 cols = int(sys.argv[3]) #列数 #変数 x = [[[md.add_var('x_{}_{}_{}'.format(j,i,k),var_type='B')for k in range(9)]for i in range(cols)]for j in range(rows)] #制約 #白マスには1~9の数字が1つ入る for j in range(rows): for i in range(cols): if not data[j][i]: md += xsum(x[j][i][k] for k in range(9)) == 1 for j in range(rows): for i in range(cols): if '\' in data[j][i]: former, latter = data[j][i].split('\') xcnt = 0 if latter: while i+xcnt+1 < cols and (not data[j][i+xcnt+1]): xcnt += 1 md += xsum((k+1) * x[j][i+n+1][k] for k,n in product(range(9),range(xcnt))) == int(latter) #行の合計が等しいか for k in range(9): md += xsum(x[j][i+n+1][k] for n in range(xcnt)) <= 1 #行の1つの白マスのつながりには、同じ数字が入らない for i in range(cols): for j in range(rows): if '\' in data[j][i]: former, latter = data[j][i].split('\') ycnt = 0 if former: while j+ycnt+1 < rows and (not data[j+ycnt+1][i]): ycnt += 1 md += xsum((k+1) * x[j+n+1][i][k] for k,n in product(range(9),range(ycnt))) == int(former) #列の合計が等しいか for k in range(9): md += xsum(x[j+n+1][i][k] for n in range(ycnt)) <= 1 #列の1つの白マスのつながりには、同じ数字が入らない # 求解 status = md.optimize() md.write("test.lp") #空白に値を代入 for j,i in product(range(rows),range(cols)): if not data[j][i]: for k in range(9): if x[j][i][k].x >= 0.99: data[j][i] = k+1 data.insert(0,sizes) #出力 with open(csv_file+'_sol.csv','w') as out_f: out_file = csv.writer(out_f) out_file.writerows(data)

投稿2021/06/22 13:15

mothi5656

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mochitabe

2022/06/27 11:34

xcnt 何ですか?
guest

0

range(9)) == int(latter)のintの前に全角空白が入っているのが原因です。

投稿2021/06/22 08:48

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問