Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First, sort and finish ranges with distance 2 and 3 first solution in Clear category for Signpost by derrickding95
from copy import deepcopy
def signpost(grid, directions):
row = len(grid)
col = len(grid[0])
next_step = {}
fail = [[0 for i in range(col)] for j in range(row)]
numbered = []
empty = []
history = []
task_range = []
in_grid = lambda x,y: 0<=x 2:
break
else:
x_c, y_c = navi(start)
x1, y1 = navi(end)
t = [(i,j) for (i,j) in next_step[(x_c, y_c)] if not grid[i][j] and (x1,y1) in next_step[(i,j)]]
if len(t) == 1:
(x_t, y_t) = t[0]
grid[x_t][y_t] = grid[x_c][y_c] + 1
numbered.append((x_t,y_t))
ref.append(grid[x_t][y_t])
empty.remove(t[0])
task_range.pop(pointer)
else:
pointer += 1
if not empty:
return grid
n = 0
while empty and n < 100:
n += 1
print(n)
obvious()
task_range = build_task()
pointer = 0
while pointer < len(task_range):
(start, end) = task_range[pointer]
if end - start > 3:
break
elif end-start == 2:
x_c, y_c = navi(start)
x1, y1 = navi(end)
t = [(i,j) for (i,j) in next_step[(x_c, y_c)] if not grid[i][j] and (x1,y1) in next_step[(i,j)]]
if len(t) == 1:
(x_t, y_t) = t[0]
grid[x_t][y_t] = grid[x_c][y_c] + 1
numbered.append((x_t,y_t))
ref.append(grid[x_t][y_t])
empty.remove(t[0])
task_range.pop(pointer)
else:
pointer += 1
elif end-start == 3:
x_c, y_c = navi(start)
x1, y1 = navi(end)
templist = [(i,j) for (i,j) in next_step[(x_c, y_c)] if not grid[i][j]]
templist0 = []
for (i,j) in templist:
templist2 = [(k,l) for (k,l) in next_step[(i,j)] if not grid[k][l] and (x1,y1) in next_step[(k,l)]]
if len(templist2) > 1:
templist0 = []
break
elif len(templist2) == 1:
templist0.append([(i,j),templist2[0]])
if len(templist0) == 1:
[(i,j),(x_t,y_t)] = templist0[0]
grid[i][j] = grid[x_c][y_c] + 1
numbered.append((i,j))
ref.append(grid[i][j])
empty.remove((i,j))
grid[x_t][y_t] = grid[i][j] + 1
numbered.append((x_t,y_t))
ref.append(grid[x_t][y_t])
empty.remove((x_t,y_t))
task_range.pop(pointer)
else:
pointer += 1
# else:
# pointer+= 1
if not empty:
return grid
pointer = 0
task_range = build_task()
while pointer < len(task_range):
(start, end) = task_range[pointer]
x_c, y_c = navi(start)
x1, y1 = navi(end)
count = start
while (x_c,y_c) != (x1,y1):
progressing = True
if fail[x_c][y_c] == len([(i,j) for (i,j) in next_step[(x_c,y_c)] if not grid[i][j] or grid[i][j] == grid[x_c][y_c]+1]):
progressing = False
if progressing:
if grid[x_c][y_c] + 1 in ref:
x_t, y_t = navi(grid[x_c][y_c] + 1)
if (x_t, y_t) in next_step[(x_c, y_c)]:
x_c,y_c = x_t,y_t
else:
progressing = False
else:
choices = [(i,j) for (i,j) in next_step[(x_c,y_c)] if not grid[i][j]]
if not choices:
progressing = False
else:
(x_t,y_t) = choices[0]
history.append(deepcopy([grid, numbered, ref, empty, next_step, fail, (x_c, y_c), (x_t, y_t), (x1,y1), count, pointer]))
grid[x_t][y_t] = grid[x_c][y_c] + 1
x_c,y_c = x_t,y_t
numbered.append((x_c,y_c))
empty.remove((x_c,y_c))
ref.append(grid[x_t][y_t])
if grid[x_c][y_c] == count:
progressing = False
else:
count += 1
if progressing:
obvious()
if not progressing:
[grid, numbered, ref, empty, next_step, fail, (x_c,y_c), (x_t,y_t), (x1,y1), count, pointer] = history.pop(-1)
fail[x_c][y_c] += 1
next_step[(x_c,y_c)].remove((x_t,y_t))
next_step[(x_c,y_c)].append((x_t,y_t))
pointer += 1
return grid
if __name__ == '__main__':
# 15
signpost([[1234,488,978,878,0,1478,879,541,444,487,0,0,0,0,0,401,336,799,0,0,1233,1232,0,0,0,292,1267,490,1388,337,0,0,51,647,0,1477,489,0,880,877,1395,1183,1235,977,291,0,179,714,0,0],[0,1500,1136,334,544,0,0,0,993,992,712,38,0,1073,47,1044,561,1211,587,0,1408,562,0,1128,0,1268,1126,0,968,1499,1216,0,0,0,1269,0,1127,1134,0,1135,990,0,333,1043,1070,617,0,1069,0,560],[220,1241,0,1486,399,0,0,507,750,219,509,916,506,0,1179,1045,508,375,1485,0,203,0,0,1350,893,183,0,1441,0,1099,0,244,447,376,0,0,692,0,0,0,0,693,1313,200,199,1100,1046,0,527,749],[581,234,228,319,0,597,651,1392,1106,598,596,0,0,1180,1379,1074,768,0,235,0,229,204,1380,407,0,450,1224,767,1328,595,0,769,594,449,770,0,318,1396,320,0,1204,0,0,0,844,1181,650,0,285,0],[0,1173,1092,540,0,469,0,0,153,732,0,0,1172,1220,1174,40,238,85,0,0,0,504,1026,0,86,0,1079,0,467,1093,128,117,372,1095,1025,155,82,0,0,84,1024,1414,1096,0,696,0,657,0,83,1094],[0,63,677,0,543,1418,0,546,0,1432,0,961,0,942,933,0,0,0,263,947,1435,0,0,675,0,1147,0,0,29,0,64,440,1436,0,1434,872,65,498,0,962,0,869,946,676,825,0,1373,0,0,0],[307,1227,0,0,1342,0,0,1066,1226,429,0,1198,430,532,428,306,275,0,190,611,305,191,310,1225,981,1244,1228,308,1285,0,0,570,50,0,210,1229,1199,1067,666,0,0,1476,612,667,1341,1230,304,0,938,0],[1450,1019,0,0,1090,793,0,0,789,0,0,0,930,792,410,1463,0,0,0,409,382,1248,863,0,102,381,1294,491,1351,0,100,0,985,380,1017,501,502,794,0,0,317,0,670,1247,1413,1464,1259,1400,1446,0],[720,223,287,0,437,953,0,1088,958,0,584,493,951,1039,436,402,726,404,1273,949,389,0,1124,1482,391,0,252,0,492,727,534,955,1274,957,439,0,1103,390,757,341,0,1131,956,286,0,438,1104,1481,0,0],[0,0,623,913,915,688,387,0,558,0,1488,914,931,231,98,0,454,1159,281,388,1377,1148,485,1206,282,855,0,0,1050,338,875,689,0,1085,557,772,385,1411,463,340,1208,1376,0,0,0,0,622,690,621,559],[0,0,721,0,0,788,653,0,1139,1240,1252,1137,202,1221,0,0,1427,842,0,1425,0,1271,1424,1426,363,1055,856,796,21,0,1275,1367,446,0,1311,201,1390,1291,0,1423,795,1374,0,1054,843,0,654,0,0,0],[1385,1156,1030,687,459,960,652,0,0,0,819,494,54,1155,453,821,185,0,299,1461,1409,1272,737,0,1352,297,460,309,157,205,921,327,0,1153,738,1084,1101,1152,1154,0,1203,0,296,206,148,164,655,1287,820,298],[0,1497,551,840,944,625,1111,1348,552,733,1439,1087,415,0,664,1166,193,0,1498,0,925,736,734,924,169,0,1266,156,0,1316,0,0,1315,1086,416,945,0,0,0,1098,1317,0,422,975,163,918,194,0,735,1112],[803,566,1364,0,520,1210,0,365,354,731,708,1355,0,0,663,400,0,370,1188,0,0,0,802,371,1365,1072,1454,1004,355,79,0,0,1071,242,884,1003,0,519,748,0,0,1401,245,828,518,1005,0,609,885,247],[1161,1020,0,632,115,1061,24,25,353,0,1162,0,1160,167,575,0,335,0,602,26,810,0,510,352,811,0,911,0,0,809,0,0,758,0,208,524,511,0,12,324,939,760,423,1246,601,11,808,0,284,0],[779,0,0,1303,1109,480,108,17,0,858,1108,31,226,166,572,0,0,107,301,110,1056,0,778,859,0,1057,1378,627,965,963,537,571,0,646,1302,257,777,0,30,0,0,0,0,211,0,109,16,1114,0,0],[0,780,678,0,0,411,564,1452,1430,1443,73,8,58,0,0,0,42,0,1191,6,0,905,599,9,894,1146,1453,476,966,904,213,214,78,895,77,0,0,0,75,0,1310,344,212,249,600,0,0,715,0,7],[1384,682,1363,839,1325,565,412,114,1107,0,184,576,835,1118,1324,577,413,0,131,1192,173,837,638,637,0,0,0,0,1326,910,0,0,1037,0,556,130,0,0,464,1080,0,466,0,129,578,836,331,1201,1036,315],[0,1242,0,0,398,0,0,0,1168,483,818,495,0,1320,1177,3,0,568,1048,1049,1406,0,636,1469,0,1471,0,1321,37,923,0,0,255,1141,1484,4,614,0,0,775,1470,1255,0,986,397,615,1047,0,1254,817],[719,0,56,686,0,113,293,32,1167,57,0,515,0,106,0,729,1323,680,300,425,0,81,989,261,87,0,988,0,0,112,0,260,0,0,0,0,1102,718,0,0,728,294,94,33,121,773,0,424,0,685],[0,0,0,928,151,1362,72,1347,0,1345,369,640,929,27,1284,822,0,1158,1344,1360,926,0,639,0,1353,97,1458,0,0,801,61,0,0,1455,0,1143,691,0,0,673,326,868,0,150,1340,618,1346,1457,0,0],[805,0,264,0,405,406,0,278,784,368,277,1305,414,514,1063,366,0,134,0,1343,0,171,132,0,170,634,1295,133,0,146,127,0,0,0,0,418,343,0,367,342,999,1296,1421,0,149,806,0,1307,1034,936],[0,832,394,0,408,851,451,1335,1119,0,1304,702,1333,0,188,624,455,0,588,1145,175,701,1120,1489,362,1475,1265,1038,431,0,0,0,36,971,831,1144,833,589,1334,797,1023,761,0,742,0,0,1332,984,0,248],[0,0,288,1262,0,269,753,0,104,1077,1251,253,1064,0,1062,0,876,912,1190,710,709,268,1027,1417,53,0,142,254,158,903,533,995,52,1289,0,1075,267,0,756,1250,798,899,754,976,0,0,882,1288,1076,289],[393,683,0,841,1398,0,0,1215,1169,1008,69,0,1214,0,0,1031,0,1212,497,0,0,1149,0,0,0,824,60,0,967,1041,536,0,1460,917,1006,0,1150,93,0,1422,392,0,1032,1042,0,1231,0,1399,1033,323],[0,782,705,347,521,1419,0,629,659,68,707,348,783,660,187,661,66,0,0,0,846,1083,0,350,523,658,1278,628,432,346,847,706,313,725,0,1082,92,0,522,1249,240,312,1371,0,0,241,1372,349,724,314],[804,0,474,1495,766,699,1012,1013,0,0,889,0,812,273,890,0,813,0,1314,0,1407,0,272,1207,0,0,1465,475,888,1466,271,118,473,0,472,1002,0,0,0,1116,316,0,0,161,695,0,815,0,698,0],[1383,0,969,19,591,852,28,18,0,908,1437,0,360,1219,1175,1,186,1157,764,1382,176,763,1121,0,361,0,0,35,0,0,592,177,1040,902,998,0,762,590,0,1369,0,1123,1370,1218,0,900,0,328,0,1129],[420,125,550,103,0,0,23,745,0,0,0,607,137,791,1236,0,140,530,144,0,1164,139,529,604,1163,225,141,123,830,345,126,1165,608,0,1016,419,145,89,0,90,239,138,746,0,0,555,22,606,0,0],[1223,217,1195,631,0,442,1494,0,0,0,643,973,1282,1196,1283,45,0,567,215,216,174,0,862,1483,1258,887,974,642,0,426,1257,1193,1194,0,0,1357,457,0,1493,0,0,644,46,0,1300,0,897,983,886,1298]],[["E","E","E","E","S","E","E","W","E","W","E","E","SE","W","S","S","E","SE","S","S","W","W","SE","SE","SW","SW","SW","S","SW","S","SW","E","S","SE","W","W","W","SE","SW","W","SW","W","SW","W","W","SE","SW","S","S","SW"],["SE","","SE","SE","SW","S","S","E","E","W","E","SE","SE","SE","E","S","E","S","S","W","S","W","W","SE","S","E","E","SE","SW","W","S","S","E","S","SW","SW","W","E","SW","W","W","NW","W","W","SW","S","NE","W","W","W"],["S","S","SW","SE","SE","N","S","E","SE","W","SE","SE","W","S","SW","E","W","E","W","SE","SE","W","S","SE","S","SW","E","SW","W","E","SW","SE","SE","SE","E","S","E","S","S","SE","W","S","SW","SW","W","SW","S","S","SW","W"],["SE","E","E","E","SW","E","S","N","S","SE","W","SE","SE","E","E","SE","E","SE","SW","S","SE","SE","NW","SW","S","SW","SW","W","E","W","W","E","W","W","NE","SE","W","SW","E","N","W","N","SE","S","S","W","W","NE","SW","S"],["E","E","E","NE","E","E","S","E","E","S","SW","N","W","S","S","SW","SE","E","E","W","SW","N","S","SW","S","S","SE","S","W","E","SE","S","S","E","W","SW","E","S","NW","W","W","W","E","S","SE","S","SW","SW","W","W"],["E","E","S","E","N","S","E","S","E","W","SE","E","S","S","S","N","N","S","SW","S","E","S","NE","E","E","SW","SE","E","SE","S","E","SW","SW","W","W","E","SW","SW","SE","SW","N","SW","W","W","NW","W","SW","SE","W","S"],["E","E","SE","SE","SE","SE","SE","E","W","E","SE","E","SE","SE","W","W","S","SE","E","E","W","W","SE","W","SE","SW","E","S","SW","W","W","S","N","E","SE","E","S","NW","E","E","N","NW","S","W","W","S","W","W","SW","NW"],["E","S","N","SW","W","E","W","E","NE","SW","E","E","S","W","SW","E","SW","SE","NE","W","E","SE","W","S","SW","W","S","SE","SW","W","E","SE","SE","W","W","E","W","SE","W","E","NW","W","N","W","NW","SW","SW","SW","SW","SW"],["SE","NE","S","NE","E","SE","S","NW","NE","E","E","S","E","SE","W","S","E","SW","E","W","E","E","N","S","SE","NW","SW","E","W","SE","S","E","SW","W","NW","NW","E","W","SW","S","W","W","W","W","NW","W","W","W","S","S"],["NE","E","SE","E","NE","E","E","NW","E","E","SE","W","N","S","NE","SE","S","SW","E","NE","SE","S","NW","S","E","SE","W","SE","W","W","SW","E","SE","S","W","SE","E","NE","S","N","SW","W","W","SE","W","N","W","SW","W","N"],["S","S","NW","E","SE","NE","E","N","SW","NW","E","E","NE","SE","E","NE","S","E","E","E","SW","S","W","W","W","SW","NW","SE","SE","S","NW","SE","N","SW","SW","W","W","W","SE","W","W","NE","S","W","N","W","S","W","S","SW"],["N","SE","SE","NE","E","NE","N","NE","W","SE","E","S","S","W","NE","S","S","N","S","SW","E","NW","E","E","S","E","N","NW","S","E","NW","SE","W","E","NW","NW","S","W","W","NW","N","W","W","SW","S","W","S","S","W","W"],["E","E","E","S","E","SE","E","S","NW","E","S","NW","E","W","SE","SW","E","SE","NE","SW","S","NE","E","W","S","W","N","NE","N","E","N","NW","W","W","SE","NE","N","N","SW","NW","E","W","S","S","NE","E","SE","W","W","SW"],["S","SE","E","E","S","NE","N","SE","E","N","SE","NE","NW","NW","N","N","SW","E","N","N","NE","NE","W","NE","E","NW","SE","E","NE","S","S","N","W","W","E","W","W","W","NE","S","NE","W","SE","SW","W","SW","W","N","S","S"],["E","E","E","S","N","SE","E","E","N","S","SE","E","W","NE","SW","E","N","E","SW","SW","E","N","E","W","SW","E","SW","W","SW","W","SE","S","W","NE","S","SE","W","SE","E","S","N","S","SE","N","W","W","W","S","N","NW"],["SE","NE","W","SE","NE","S","E","S","E","E","W","SW","N","N","NE","N","SW","W","SE","NE","E","SW","W","SW","SE","W","NW","S","S","E","S","W","E","N","W","SE","W","E","W","W","SW","W","S","SW","W","W","W","S","SW","NW"],["E","N","E","E","N","SE","SW","E","N","E","W","E","SE","W","S","S","W","S","SE","E","E","N","E","NE","E","N","N","S","S","W","E","SW","NW","NW","W","W","SE","SE","W","W","NW","SW","W","N","N","E","NW","SW","N","W"],["N","S","N","N","E","NW","E","NW","NE","E","NE","E","E","SW","W","E","SW","W","SE","SE","S","E","S","W","SW","N","E","SE","N","NW","W","W","SW","SW","N","W","E","W","W","W","W","NW","N","W","NW","W","W","NW","W","SW"],["E","E","E","N","N","NE","E","NE","S","S","N","S","N","E","S","E","S","E","E","NE","S","NE","NE","E","NE","N","S","W","NW","NW","W","N","N","SE","NW","N","E","NW","SW","N","W","SW","W","W","W","N","W","SW","W","W"],["N","NE","E","N","E","NE","E","E","N","NE","NE","SW","W","NE","N","NW","NW","N","N","SE","N","NE","NE","E","N","E","W","N","SW","W","NE","W","NW","W","NE","SW","N","W","SE","SE","W","W","N","W","NW","NW","E","W","N","W"],["E","NE","NW","E","E","NW","NE","N","N","E","NE","NE","N","SW","NE","SE","W","N","W","E","W","NW","W","N","N","NW","SW","W","E","NW","NE","SW","E","SE","N","S","N","W","E","W","NW","N","W","W","N","NE","W","W","W","N"],["E","E","SE","E","E","NE","E","N","SW","NE","W","W","N","NW","SW","E","SW","NE","NE","NW","N","W","E","NE","W","SE","E","W","NW","E","N","W","NW","NW","NE","S","NE","SE","W","W","NW","NW","SW","W","NW","E","N","N","N","SW"],["E","E","S","NE","NE","S","W","E","E","NE","NE","E","E","SW","NE","NW","S","S","E","NE","S","W","S","S","N","NE","N","NW","S","W","NE","W","NW","SE","W","W","NW","S","W","SE","N","SW","E","W","W","W","W","NW","N","NW"],["E","NW","E","W","E","SE","E","E","NW","E","N","E","NE","SE","N","E","NE","NW","N","N","W","W","SW","NW","NW","S","W","NE","SW","N","N","W","W","N","NE","E","W","N","N","W","NW","SE","W","N","W","NW","N","W","W","SW"],["NE","E","E","NE","E","N","N","NE","NW","SE","W","E","W","N","W","E","W","W","NE","E","E","E","E","SW","W","NE","NE","SW","N","E","N","N","NW","NE","W","SW","NE","NE","NE","N","W","N","E","N","NE","NW","N","N","N","NW"],["N","E","E","E","E","NW","NW","NE","E","NE","N","E","NW","E","N","NW","E","W","W","NE","E","NE","E","S","NE","W","SE","W","NE","W","NE","W","E","NW","N","W","NE","N","W","N","E","W","E","NW","W","NW","N","W","W","N"],["N","N","E","W","NE","N","E","SE","E","E","E","E","E","E","W","W","E","W","NE","S","N","S","W","NE","N","E","E","N","W","E","W","NW","W","E","W","N","NW","N","W","NW","N","E","NW","SE","N","W","E","N","W","N"],["N","E","E","N","E","E","NE","W","NE","N","NE","N","E","N","N","NW","NW","N","NW","W","E","W","E","N","N","E","E","NE","N","NW","W","N","NW","NW","NE","NW","W","W","NW","E","NE","NW","N","W","N","W","NW","SE","W","N"],["N","E","N","NE","E","E","N","E","W","E","SW","E","E","N","NE","S","E","NW","E","NW","E","W","W","W","W","NW","N","W","NE","N","N","NW","NE","E","N","W","NW","E","N","NW","N","W","W","NW","N","NW","W","W","N","NW"],["NE","NE","E","N","N","NE","NW","W","N","E","E","E","E","NW","N","E","E","N","E","W","N","E","N","NE","NE","NE","NE","W","N","E","W","E","W","NW","NE","E","W","NW","W","E","W","N","NW","N","NE","NW","NW","N","W","W"]])
# 14
# signpost([[1,0,0,325,385,0,0,0,714,1185,730,0,847,3,0,0,0,0,962,963,0,494,609,25,211,0,0,712,731,0,493,699,0,0,0,321,0,938,846,324],[16,725,134,188,0,146,133,562,0,0,398,311,0,0,716,114,0,0,867,191,0,666,684,1153,113,223,661,0,546,0,0,979,0,0,726,0,935,268,0,0],[0,144,0,0,0,122,618,140,0,141,592,617,977,0,0,0,810,139,337,18,0,0,80,79,0,123,0,425,0,0,0,0,593,0,823,0,81,250,177,0],[0,7,696,166,818,981,0,46,781,0,693,694,489,0,47,554,0,552,400,470,0,0,8,0,695,0,45,228,165,980,796,1141,167,0,939,918,551,0,0,0],[947,0,0,1019,0,0,344,438,0,1172,70,488,0,928,180,0,830,481,462,0,163,38,264,762,37,675,0,480,0,71,39,22,0,0,920,0,588,0,245,244],[669,452,0,1163,308,1008,0,1006,671,915,873,0,372,1005,670,976,832,258,0,640,0,265,0,1162,111,229,100,0,307,0,662,639,0,0,0,0,1007,1089,451,257],[948,0,561,31,433,145,820,0,0,836,949,373,703,11,942,833,1199,685,231,0,560,0,0,0,704,951,230,32,835,434,686,0,0,799,722,950,587,710,576,834],[340,0,418,0,102,0,466,0,416,1079,838,341,0,239,13,1004,0,240,881,1068,1069,417,841,0,596,0,839,944,0,0,1151,1070,862,1135,579,536,103,1080,0,706],[151,200,383,0,309,0,888,1113,724,903,0,310,0,149,423,1111,856,1108,975,0,0,0,542,297,0,53,0,382,1112,317,0,910,0,424,580,0,0,904,152,333],[0,159,437,816,1122,914,790,1062,869,0,0,1188,1180,1181,0,421,1198,941,1059,0,815,276,656,892,597,1183,1044,913,763,0,0,178,682,1182,270,893,299,269,735,654],[0,0,0,1173,0,204,1082,1065,253,804,0,750,0,0,377,0,745,205,401,548,1083,880,0,0,0,0,708,446,182,751,376,1145,749,403,0,607,0,0,0,292],[808,0,672,187,487,0,0,1063,923,0,1016,362,0,1077,924,0,1171,0,0,806,807,0,0,296,295,809,313,801,92,190,314,0,681,800,0,532,584,1015,294,1010],[1053,393,0,486,0,510,0,0,0,0,432,392,1030,882,0,1035,0,1148,1036,42,989,0,1052,322,566,1138,0,802,720,0,0,1147,0,0,533,0,348,347,1137,0],[2,160,436,612,1123,252,132,632,649,677,884,777,1196,0,129,740,549,1021,926,957,1085,943,319,0,574,1074,631,650,130,161,131,0,747,775,676,0,435,251,861,678],[496,789,932,0,0,866,1158,1012,0,0,931,1128,0,0,1127,173,0,0,516,118,515,495,865,1159,0,933,99,953,586,73,772,557,680,774,0,0,1011,0,242,0],[1040,0,0,30,355,0,0,0,0,448,572,1039,0,0,545,357,479,0,1058,1057,874,825,759,0,112,224,571,227,0,972,771,743,447,29,824,0,455,454,356,0],[0,870,429,756,1054,88,343,27,778,89,0,779,0,0,431,1018,1126,1115,871,471,342,937,1191,0,154,1184,1046,853,1192,642,0,286,0,0,643,430,1048,281,153,284],[511,0,0,1104,628,363,60,0,0,965,0,0,512,328,925,364,831,0,57,1167,0,0,657,0,897,0,56,651,0,0,630,0,0,196,55,0,0,61,0,0],[279,354,0,0,386,757,901,0,500,0,368,67,0,0,378,175,0,1020,0,415,0,826,878,0,0,0,414,380,181,74,0,1142,115,379,601,507,367,280,176,51],[339,1055,0,0,885,449,0,646,0,409,331,886,509,412,0,1093,690,108,0,41,733,189,1092,1118,110,0,767,106,585,653,647,1143,477,107,645,528,1049,718,450,0],[1028,1024,0,326,1106,97,497,633,501,0,277,0,1133,117,544,1003,1125,940,0,17,498,0,1051,0,518,0,69,14,105,0,1002,1026,98,798,96,530,0,0,247,0],[1041,0,26,900,0,0,467,408,1087,0,0,66,1098,86,1174,1168,573,930,974,156,898,1088,890,0,0,0,660,0,0,973,929,911,1097,232,727,537,468,709,0,0],[667,199,0,1195,559,1060,198,0,358,995,0,0,513,0,1175,0,183,94,994,472,0,473,0,298,0,0,44,474,0,72,792,0,395,0,1176,894,0,0,987,558],[0,1154,78,1194,0,1000,261,563,0,410,788,1038,1132,786,844,1075,1032,375,1121,993,689,1131,0,1117,0,0,0,1001,476,1037,207,813,397,1177,0,527,583,0,0,0],[794,9,135,0,521,330,541,700,990,35,444,168,0,445,917,637,335,0,992,0,0,0,0,970,36,124,701,0,0,659,793,0,396,991,728,858,0,520,971,334],[302,0,1034,523,0,329,345,305,34,274,591,0,758,1076,0,589,1120,390,389,0,303,0,304,0,969,0,478,5,0,517,770,1144,769,864,524,529,1096,0,0,291],[266,128,370,0,0,595,984,623,1056,0,0,0,0,996,721,555,1165,854,336,90,875,997,655,998,896,1139,1045,0,982,983,0,1140,0,0,855,895,0,267,0,0],[127,754,828,614,0,203,483,85,503,272,260,616,0,785,0,0,829,0,288,0,388,827,504,0,289,1073,237,0,732,484,837,287,0,0,126,857,0,906,570,0],[850,0,603,851,406,121,0,1064,565,967,64,353,877,0,0,404,256,0,65,673,0,405,0,1161,453,674,0,852,821,352,0,0,748,738,351,0,0,63,241,120],[0,1023,427,958,0,594,59,0,843,1071,219,220,959,218,0,213,746,1116,0,0,0,216,0,0,0,0,101,6,1017,0,0,235,491,1022,644,960,12,215,625,1200]],[["S","E","SE","S","S","E","SE","SE","SE","S","E","SE","S","W","S","S","SE","SW","E","E","S","S","SW","SW","W","W","SW","W","S","SE","W","SW","SE","W","SE","SW","SW","SW","W","W"],["SE","E","S","SE","SE","W","W","S","W","E","E","SE","E","SE","S","SE","SE","S","NW","W","E","SW","SW","SW","W","S","SE","S","SW","SE","W","SW","W","W","S","S","SW","S","W","W"],["S","SE","S","S","S","E","W","E","SE","E","E","W","N","SE","SE","E","S","W","W","SW","S","W","E","W","W","S","E","W","E","S","NE","S","SW","N","S","S","SW","S","SW","W"],["E","E","SW","E","E","SE","SE","E","N","SW","E","E","W","E","N","S","E","W","S","S","S","E","SW","S","W","NW","W","SW","W","W","SW","S","SW","W","SW","SW","W","SW","SW","W"],["S","E","E","SE","E","N","S","SE","S","SW","E","NE","NE","SE","SE","E","S","SW","W","N","NE","E","SW","SE","W","SE","W","W","E","S","SE","NE","W","S","SE","NW","SW","S","S","W"],["E","SE","SE","SE","S","SE","NE","E","SW","SE","SE","SW","SW","W","W","NW","SW","E","E","SE","SW","SW","S","W","S","SE","S","E","W","W","N","W","SW","E","S","W","W","W","W","W"],["E","E","NE","E","E","N","SE","SE","E","SE","E","S","E","SE","SE","E","SE","E","SE","SE","W","NE","SW","E","SE","W","W","SW","W","SE","S","SW","SW","S","SW","W","N","W","N","W"],["E","SE","SW","SE","E","SE","S","NE","E","E","E","SE","E","E","SE","NW","SE","SE","SW","E","E","W","SW","W","S","E","E","SE","SW","W","N","SW","S","E","S","S","SW","SW","S","S"],["E","S","E","NE","E","S","SE","N","NW","E","W","N","NW","W","E","E","SE","E","NW","SE","E","E","NW","S","NW","SE","N","W","W","NW","W","S","W","NW","S","SW","S","S","S","S"],["E","S","NE","SE","S","NE","E","S","SW","S","E","NE","E","E","E","NW","N","NW","SW","E","W","SW","S","E","E","S","S","W","S","NE","S","NW","N","W","W","S","S","W","NW","SW"],["E","W","SW","SE","N","E","E","N","SE","S","E","E","NW","N","S","S","S","NW","W","SW","N","NW","NE","SE","SE","SW","SE","SE","SW","W","W","N","W","SW","W","NW","W","SE","S","W"],["E","S","SE","N","NE","E","NE","S","E","SW","SE","SW","SW","NW","S","W","NW","S","SW","E","W","E","NW","N","W","NW","E","S","W","NW","NE","SW","N","W","SW","SW","SW","W","W","SW"],["SE","SE","E","NE","E","SW","S","S","E","N","NW","W","E","NW","W","E","S","NE","SE","S","SW","SW","W","E","S","S","E","W","SW","SE","W","W","N","S","SW","SW","S","W","W","N"],["NE","E","N","N","E","NE","N","S","E","E","SW","SW","NE","N","E","NE","N","SE","W","SW","NW","NE","SW","SW","E","SW","W","S","E","NW","W","NE","S","E","W","W","W","W","NW","S"],["SE","NE","E","N","SW","NE","E","E","W","S","W","E","E","N","W","SW","SE","E","SE","N","W","W","W","S","NW","NE","N","SE","NE","S","W","SE","N","N","SW","W","W","NW","NW","W"],["S","SE","NE","N","E","NE","S","NW","E","SW","SE","W","SW","E","NE","SW","NE","SW","N","W","S","S","E","N","N","E","W","N","NE","S","N","NE","W","W","W","E","N","W","W","W"],["N","E","E","SE","SW","E","N","NE","E","SE","SW","NW","E","SE","NW","NW","NW","S","NE","S","W","NE","E","SE","SW","NW","W","SW","W","E","W","S","NE","SE","S","W","S","NW","W","NW"],["E","E","N","E","W","E","E","SW","SW","N","E","SE","S","SW","NE","W","N","NE","NE","SW","NW","SW","SE","SW","SW","W","W","SE","N","N","NW","E","W","SW","W","W","S","N","W","W"],["E","NE","S","NW","NE","SE","N","NE","S","S","S","S","S","S","E","E","S","N","W","NW","NE","S","N","SW","E","N","W","N","N","E","W","S","W","W","W","W","W","N","N","W"],["N","SE","NE","E","E","E","N","E","SE","S","NE","W","NW","SE","E","E","E","W","SE","N","NW","NE","W","N","N","NE","NW","E","N","NE","W","S","SW","W","W","S","SE","N","N","N"],["NE","E","N","N","E","E","E","NE","N","W","NW","E","N","NE","N","N","N","N","NE","N","NW","NE","N","E","SE","SE","NW","NW","NW","NW","W","W","NW","N","W","N","SE","W","NW","W"],["E","E","NE","NE","N","S","E","NE","E","NE","NW","N","SE","W","S","NW","NE","NW","N","SE","E","NE","N","W","NE","NW","N","E","W","W","W","NW","W","SW","S","E","NW","N","NW","SW"],["N","N","N","NE","NE","N","W","N","E","SE","S","E","SW","NE","E","NE","E","E","W","E","N","E","W","NE","NE","SE","N","SE","W","N","S","S","S","NE","SW","S","NW","S","W","W"],["E","NE","NE","N","SW","E","NW","S","E","NE","NW","N","N","W","E","SW","W","NE","NW","NW","NW","W","E","N","NW","W","NE","NE","NE","W","SW","E","NW","NE","NW","N","N","SW","N","NW"],["N","N","E","S","W","NE","NE","E","E","E","E","S","NE","NE","NE","W","SE","E","NE","N","SW","E","N","E","N","E","NW","NE","E","NW","W","SE","N","W","NW","W","W","W","NW","W"],["E","N","NE","E","SE","N","E","NE","NE","E","N","W","NE","N","NE","W","NE","NW","W","NE","E","N","W","W","NW","NE","NW","S","N","NW","N","N","W","NW","N","N","NW","N","W","N"],["E","NE","N","NE","E","NE","E","SW","NE","W","W","NW","S","E","NE","NE","NE","E","N","NE","W","E","N","NW","N","E","N","NW","E","W","NE","N","NE","W","NW","W","NW","N","E","N"],["NE","E","E","E","NE","N","E","NE","E","N","NW","N","SE","N","NW","NW","N","N","E","W","NW","W","SE","S","E","N","NW","SE","NW","NW","NW","W","NW","W","W","N","NE","W","NW","N"],["E","N","W","E","E","N","NE","N","NE","NE","E","NW","NE","W","NW","E","NE","E","NW","E","N","W","SE","N","NE","N","E","N","N","W","W","N","N","NW","W","W","W","W","N","W"],["E","N","N","E","E","N","N","NE","NE","E","E","NE","E","W","E","W","NE","NE","N","NE","E","W","N","NE","N","N","NW","NW","NW","E","N","NE","W","W","N","W","NW","W","N",""]])
# 13
# signpost([[0,47,0,506,0,408,279,201,0,271,217,0,202,268,581,0,517,596,438,494],[0,0,0,312,0,0,561,280,30,91,214,0,341,0,324,192,0,0,557,0],[0,0,441,0,376,0,28,0,0,375,203,291,0,349,325,453,163,0,440,4],[0,48,0,406,0,1,69,68,32,0,502,0,111,568,403,113,112,0,198,498],[396,409,294,13,281,0,0,365,364,391,0,552,127,410,569,318,178,0,171,0],[0,0,220,106,0,0,16,0,0,0,215,0,17,256,411,0,589,168,0,0],[0,0,0,0,6,15,419,384,308,93,492,51,257,0,224,5,0,393,307,0],[490,0,79,0,186,600,150,564,46,415,0,187,0,24,22,454,0,414,0,253],[327,328,0,339,100,175,0,0,176,119,500,381,340,478,0,0,0,0,56,499],[0,0,387,0,0,0,551,0,538,426,0,598,590,259,148,0,211,434,0,0],[90,43,101,0,0,0,562,200,188,427,0,0,89,315,42,452,160,316,0,196],[0,0,0,0,0,0,0,0,401,0,0,0,394,0,0,330,0,124,0,222],[0,529,80,105,484,174,418,0,0,199,0,0,282,567,0,0,466,229,277,530],[0,351,0,38,180,0,319,385,31,398,154,0,431,566,0,40,578,459,390,0],[0,49,443,405,0,0,417,0,0,0,501,50,0,0,467,190,377,0,460,0],[45,0,334,0,0,599,367,584,26,0,0,0,0,267,0,0,210,0,558,0],[516,404,0,0,0,0,141,36,362,303,0,337,0,238,304,0,177,361,389,0],[576,76,382,0,0,0,0,63,0,116,216,72,208,397,570,586,209,360,0,496],[0,0,295,0,0,145,284,0,309,513,155,380,0,338,504,0,166,535,296,457],[0,532,442,0,533,413,449,0,0,0,579,131,342,0,358,587,241,167,0,497],[370,0,333,511,194,430,0,144,468,133,247,134,0,25,469,0,519,143,0,0],[0,157,102,108,0,0,447,0,446,0,233,248,110,348,109,0,161,0,103,0],[183,509,0,107,66,336,125,265,65,335,503,61,554,261,0,329,471,359,437,244],[372,74,235,115,20,464,448,130,10,120,299,0,263,121,122,0,162,0,298,300],[0,0,0,0,480,0,550,0,58,0,481,60,0,239,555,191,472,228,0,0],[373,159,0,0,136,139,0,288,310,0,152,0,0,0,138,0,518,0,137,0],[527,0,98,0,19,525,0,0,0,0,346,546,0,356,357,0,0,0,306,0],[0,0,293,0,0,593,524,8,0,0,345,0,0,544,227,0,242,230,439,0],[463,0,0,86,354,0,85,583,0,92,0,0,0,0,582,521,0,232,54,301],[0,75,0,0,0,286,0,34,400,425,204,0,344,314,225,0,0,285,574,246]],[["S","S","SE","S","E","SW","SE","E","S","SE","SW","W","SW","SE","S","S","S","S","S","W"],["E","SE","SE","S","S","S","S","SW","S","S","S","S","S","SW","S","W","S","S","S","SW"],["N","E","S","W","SE","SW","NE","S","W","W","S","SW","E","N","S","S","SW","S","W","SW"],["S","S","NW","SE","W","W","SW","W","NW","NW","S","S","E","SE","SW","S","W","SW","SW","S"],["SE","E","S","SW","SE","NE","S","W","W","S","E","S","S","SE","S","SW","SW","W","SW","NW"],["S","S","S","S","E","N","E","NE","E","NE","S","S","S","SW","SW","E","SW","W","E","SW"],["E","E","SE","S","S","NE","SW","S","S","SE","NW","SE","E","S","S","W","SW","SW","W","NW"],["N","E","S","N","E","","E","NW","NW","S","S","SW","W","S","E","S","W","W","S","S"],["E","SE","S","E","SW","E","N","NE","SE","S","S","SW","N","SW","W","N","NW","NE","SW","W"],["N","S","E","N","NE","E","NE","W","NW","S","N","SW","S","N","NW","SE","E","SW","S","W"],["NE","S","S","N","E","S","E","N","SW","E","NW","SW","W","E","W","N","S","NW","NW","N"],["N","S","S","SE","E","NW","NE","S","W","SW","W","W","W","N","NE","W","E","SW","S","NW"],["SE","E","SE","N","S","N","N","SE","N","NW","SE","SE","W","N","S","SW","SW","S","NW","N"],["SE","SE","W","SE","N","N","NW","S","N","SW","S","NE","N","N","N","W","SW","SE","NW","W"],["E","E","N","N","E","S","N","NW","S","NE","N","N","SE","NE","SW","S","NW","W","NW","N"],["NE","W","SE","SE","E","N","E","NE","SW","SW","S","N","NW","N","N","S","N","SW","S","W"],["NE","NE","SE","N","N","E","S","W","N","E","E","SE","N","S","S","SW","N","W","N","NW"],["NE","N","N","SE","S","N","N","E","S","S","N","SE","E","NW","SW","S","N","N","W","S"],["E","E","E","N","NE","N","SE","SW","S","NW","NW","N","SW","NW","NW","W","SE","SW","S","N"],["NE","E","N","SE","NE","NE","SW","N","E","S","NE","W","S","SE","SE","N","S","N","S","N"],["S","E","N","NW","N","NE","E","NW","E","E","SE","S","NE","NW","NW","SW","SW","W","NW","S"],["S","E","E","E","NE","SW","S","NE","W","SW","NW","SW","N","N","W","W","S","N","NW","SW"],["S","SE","NE","N","NE","NE","NE","SE","W","W","NE","W","SE","NE","SE","N","S","N","N","N"],["S","S","NE","NE","NE","NE","N","NE","NW","E","E","NE","S","E","SE","W","N","W","W","S"],["N","E","E","N","E","NW","N","NE","W","N","N","N","NW","NW","E","N","N","N","N","N"],["E","NE","S","N","E","N","NE","N","W","N","S","W","E","SW","W","N","N","W","W","NW"],["E","N","N","SW","N","E","E","E","NW","SE","NE","NE","W","E","N","W","W","N","N","NW"],["NE","E","N","SE","E","E","NW","N","N","N","N","NE","NW","SW","NE","W","NE","N","N","NW"],["NE","N","NE","N","NE","W","W","N","E","N","N","W","S","N","W","SE","N","NW","N","N"],["N","N","E","W","NE","NE","NE","N","N","N","NW","N","NW","N","N","NW","W","W","N","NW"]])
# 12
# signpost([[1,198,0,72,13,102,0,0,0,100,12,190,0,22,0,93,0,0,309,0,0,0,82],[137,0,0,0,69,67,68,0,292,139,98,122,0,0,20,200,124,125,0,212,138,123,0],[221,0,0,73,0,0,203,222,0,227,0,95,0,0,202,0,204,0,251,250,0,0,0],[0,0,0,45,0,238,327,0,78,0,80,0,0,301,191,0,181,0,79,0,0,239,0],[0,0,0,160,0,27,0,0,57,0,0,343,267,0,0,0,58,0,26,0,0,241,297],[0,283,0,75,234,157,0,156,328,0,0,76,339,176,282,0,0,0,0,271,175,340,0],[0,243,248,0,0,314,0,0,62,260,0,206,0,246,149,249,205,0,0,63,0,0,0],[321,264,0,159,331,56,277,36,265,0,0,308,332,164,166,275,276,0,0,256,0,0,0],[2,91,0,189,0,0,3,0,303,162,155,329,59,0,167,318,305,0,252,4,304,182,0],[0,0,0,44,141,0,0,43,0,140,333,142,0,16,31,18,0,112,99,0,0,0,19],[153,33,0,46,84,129,302,337,279,0,65,0,60,70,0,0,341,293,0,128,0,0,0],[0,0,0,0,89,196,29,229,0,226,0,0,7,0,0,0,30,0,0,0,0,0,0],[48,231,0,9,324,0,0,232,0,0,97,0,286,0,109,194,0,0,0,50,0,110,0],[0,0,134,0,0,237,0,217,147,0,117,42,0,15,0,115,216,146,214,0,0,0,0],[0,119,187,0,0,0,0,106,0,0,40,344,185,262,107,0,0,53,307,211,104,295,345]],[["S","S","SE","S","SW","E","E","E","SE","S","W","SE","W","S","SW","SE","W","SW","W","S","S","SW","W"],["E","E","W","NW","SE","E","W","S","SE","S","SE","E","NE","W","W","SW","E","SW","S","W","W","W","SW"],["E","W","SE","SW","S","S","E","E","W","SE","S","W","S","SE","W","W","S","W","S","W","S","SE","SW"],["S","E","SE","S","E","E","SE","E","E","S","NW","E","S","SW","S","W","SE","W","W","N","S","S","W"],["E","S","N","S","E","E","N","SE","E","NW","N","S","SE","SW","W","W","SW","SE","W","SE","N","W","N"],["E","S","E","E","NW","SW","NE","W","SE","E","SW","W","E","S","W","W","SE","E","SW","W","W","SW","N"],["E","E","E","SE","NW","E","NE","NW","E","S","NW","W","SE","W","NE","NE","W","N","S","SW","N","S","SW"],["SE","E","NE","N","E","NE","S","NE","NE","N","NW","NE","SW","E","S","E","W","S","W","N","W","SE","W"],["E","E","NE","NE","N","NE","E","NE","E","E","NW","W","S","N","E","SE","NE","W","SE","S","W","NW","SW"],["N","E","NE","N","E","E","N","W","NE","W","SW","E","S","W","S","E","W","SE","NW","N","SW","N","NW"],["SE","S","SW","W","NE","S","NE","NW","E","NW","N","N","SE","SE","W","W","W","NE","NE","W","NW","N","NW"],["SE","SE","E","SW","SE","NE","E","W","NE","N","NW","SW","SE","E","NW","W","NW","SW","W","W","W","SE","W"],["E","E","NE","E","N","SW","NE","NW","N","E","N","N","NE","W","E","N","N","N","NW","W","NE","S","NW"],["E","E","N","NE","N","N","NW","NE","N","E","N","NW","W","N","N","E","W","W","W","N","W","NW","N"],["NE","NE","N","NE","NE","W","W","E","N","E","NW","E","W","NE","N","N","NW","NW","NW","N","NW","NE",""]])
# signpost([[1,0,0,0,0,0,0],[0,0,0,20,19,0,0],[0,0,0,0,0,0,35],[0,0,0,0,42,0,40],[0,0,0,0,0,0,0],[0,0,0,27,0,0,0],[0,0,22,0,0,0,49]],[["SE","S","S","S","E","W","SW"],["E","E","NE","SE","W","S","SW"],["E","W","NE","SE","NW","E","SW"],["E","S","E","W","NW","SW","SW"],["N","NE","SE","N","N","SW","N"],["SE","N","N","W","N","N","SW"],["N","W","E","E","NE","N",""]])
# signpost([[1,0,0,86,0,66,8,0,26,62],[0,55,0,38,0,64,0,0,0,0],[23,0,0,39,0,0,0,0,32,0],[0,0,0,75,0,0,0,76,0,0],[58,45,0,98,0,0,0,30,0,0],[0,84,0,0,0,0,60,12,85,11],[0,34,0,0,0,0,0,0,0,0],[95,0,71,0,0,0,0,0,0,73],[15,0,0,0,0,42,0,0,0,61],[2,0,0,0,36,0,79,0,0,100]],[["S","S","S","S","SE","W","S","W","S","W"],["E","S","S","S","W","E","NW","NE","SW","S"],["SE","S","W","S","S","E","W","S","S","NW"],["N","SW","SE","E","S","S","W","W","NW","N"],["S","E","S","E","SE","W","NE","NW","W","S"],["E","E","N","SE","NE","SE","SE","NW","NW","W"],["NE","S","S","E","N","E","NE","NW","W","NW"],["NE","NW","E","N","N","E","E","S","W","W"],["E","NW","W","NE","NW","E","W","NE","N","N"],["NE","E","N","NE","N","E","N","N","N",""]])
# signpost([[1,0,0,0,16,0],[0,0,0,0,0,0],[0,3,0,31,0,0],[0,27,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,36]],[["S","SE","E","SW","W","W"],["SE","E","NW","W","W","SW"],["SE","S","SE","SW","N","SW"],["E","NE","S","NW","S","W"],["N","E","NE","SE","W","N"],["NE","W","W","NE","W",""]])
# signpost([[0,0,0,0,12,0,128,129,0,79,0,51],[0,59,17,103,0,140,139,0,60,0,1,0],[107,118,0,82,0,106,90,0,0,0,97,96],[72,0,0,34,0,74,0,91,0,0,0,52],[0,0,100,64,0,141,0,0,25,30,0,0],[0,0,0,0,0,0,0,0,0,0,0,0],[0,10,86,0,0,0,0,0,132,0,0,0],[0,0,142,121,143,45,0,0,0,144,120,93],[49,80,0,33,8,0,0,65,61,28,0,0],[0,0,0,0,0,0,0,44,0,35,113,19],[0,58,70,0,0,22,0,123,0,0,77,0],[2,0,87,54,116,0,27,0,24,0,0,0]],[["E","S","SE","SE","W","S","E","E","S","SW","W","S"],["SE","E","S","S","E","S","W","W","S","W","SW","SW"],["N","S","SE","NE","S","W","SE","W","S","S","S","W"],["E","N","N","SE","N","NW","N","SE","W","W","S","SW"],["S","SW","SE","SE","SE","SW","S","N","W","SE","SE","SW"],["E","NE","W","N","SW","SW","SW","N","S","SE","W","SW"],["N","NE","S","E","NW","N","W","NE","SW","S","W","NW"],["NE","E","E","S","E","SW","SW","SW","W","","W","W"],["N","NE","E","N","S","NE","SE","SE","N","N","SW","NW"],["NE","N","E","NW","NW","NW","SW","NW","NE","N","N","N"],["N","N","W","E","E","E","W","NW","S","N","N","N"],["E","N","NW","NW","W","N","NE","W","N","N","N","W"]])
def checker(func, grid, directions):
result = func([row[:] for row in grid], directions)
nb_rows, nb_cols = len(grid), len(grid[0])
N = nb_rows * nb_cols
# check types
if not (isinstance(result, (list, tuple)) and
all(isinstance(row, (list, tuple)) and
all(isinstance(n, int) for n in row) for row in result)):
print("Result should be a list/tuple of lists/tuples of integers.")
return False
# check sizes and content compatibility
if not (len(result) == nb_rows and
all(len(row) == nb_cols for row in result)):
print("You should not have changed sizes.")
return False
if not all(user_n == n for row, user_row in zip(grid, result)
for n, user_n in zip(row, user_row) if n):
print("You should not have changed non-zero numbers.")
return False
# check if numbers describe range(1, N + 1)
numbers = sorted(n for row in result for n in row)
if 0 in numbers:
print("Still a zero in the grid.")
return False
if numbers != list(range(1, N + 1)):
print(f"Numbers in the grid should be integers between 1 and {N}.")
return False
path = {n: (i, j) for i, row in enumerate(result)
for j, n in enumerate(row)}
vectors = {'NW': (-1, -1), 'N': (-1, 0), 'NE': (-1, 1),
'W' : ( 0, -1), 'E' : ( 0, 1),
'SW': ( 1, -1), 'S': ( 1, 0), 'SE': ( 1, 1)}
same_direction = lambda x1, y1, x2, y2: (x1 * y2 == x2 * y1 and
x1 * x2 >= 0 and y1 * y2 >= 0)
for n in range(1, N):
(i, j), (x, y) = path[n], path[n + 1]
vector, nwse = (x - i, y - j), directions[i][j]
if not same_direction(*vector, *vectors[nwse]):
print(f"Arrow from {n} to {n + 1}: "
f"direction at {(i, j)} is not respected.")
return False
return True
TESTS = (
([[1, 0, 0],
[0, 0, 0],
[0, 0, 9]],
(('S', 'E', 'S'),
('S', 'S', 'NW'),
('NE', 'NE', ''))),
([[16, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]],
(('', 'E', 'SW', 'W'),
('E', 'SE', 'S', 'W'),
('SE', 'SE', 'NW', 'N'),
('NE', 'W', 'NE', 'N'))),
([[1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 24]],
(('SE', 'E', 'SW', 'W', 'S', 'S'),
('E', 'E', 'SE', 'W', 'NW', 'S'),
('E', 'E', 'SW', 'W', 'SW', 'S'),
('E', 'W', 'NE', 'NW', 'NW', ''))),
([[1, 0, 0, 0, 0],
[0, 0, 9, 0, 18],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 25]],
(('SE', 'E', 'SW', 'S', 'S'),
('E', 'W', 'S', 'NE', 'SW'),
('S', 'N', 'N', 'N', 'S'),
('NE', 'N', 'NE', 'SE', 'W'),
('NE', 'NE', 'W', 'W', ''))),
)
for (grid, directions) in TESTS:
assert checker(signpost, grid, directions)
Aug. 30, 2019