我正在编写一个脚本来有效地解决数独谜题,但我认为我的代码中有一部分非常难看,并且想要简化。
def square(cell):
rows='ABCDEFGHI'
cols='123456789'
cell_row = cell[0][0]
cell_col = cell[0][1]
if cell_row in rows[0:3]:
x = 'A'
if cell_row in rows[3:6]:
x = 'B'
if cell_row in rows[6:9]:
x = 'C'
if cell_col in cols[0:3]:
y = 'a'
if cell_col in cols[3:6]:
y = 'b'
if cell_col in cols[6:9]:
y = 'c'
return (['Aa','Ab','Ac','Ba','Bb','Bc','Ca','Cb','Cc'].index(x+y))+1
鉴于数独板由9个3x3正方形组成,此功能的目的是获取板上单元的坐标并返回单元所属的3x3平方的数字(顶部的正方形) left是数字1,右下角是数字9)。输入'单元格'形式为[' A5',6],其中A表示行,5表示列,6表示单元格的值。
我所使用的代码,但它必须是一种更有效或更明智的方式。我会很感激任何建议。
答案 0 :(得分:1)
我能够制作一个大大简化的公式版本。我开始为行和列分配一个从0开始的索引。然后我使用整数除法来获取有关正方形所在的3块的信息。由于向下移动3个行的行会使索引增加3,而向右移动只会将其增加1,我将行索引相乘分裂后3点。这是完成的功能:
def square(cell):
coords = (ord(cell[0][0]) - 65,int(cell[0][1]) - 1)
return 3 * (coords[0] // 3) + coords[1] // 3 + 1
答案 1 :(得分:1)
就我个人而言,我认为像'65'和'97'这样的魔术数字不会使解决方案更具有可呈现性!怎么样:
def square(cell):
rows = 'ABCDEFGHI'
cell_row = rows.index(cell[0][0])
cell_col = int(cell[0][1]) - 1
return 3 * (cell_row // 3) + cell_col // 3 + 1
答案 2 :(得分:0)
编辑:修正偏移量为1 - 尽管我宁愿从0开始,因为您可能希望将返回的值用作另一个(子)数组的索引。 / p>
由于我不能评论其他答案,但这里只有我的2美分: cdlane的回答比这里介绍的要慢一些。如果你摆脱了.lower()(我认为你现在不关心失败保险箱)并且使用Brien的答案你会获得另一个轻微的性能提升。我不知道你对square()进行评估的频率,但也许值得放弃对性能的可读性;)
我认为附加的代码片段可以解决这个问题。
def square(cell):
# http://www.asciitable.com/
# https://docs.python.org/3/library/functions.html#ord
row = ord(cell[0][0].lower()) - 97
column = int(cell[0][1])-1
return 3*(row//3) + column//3 + 1