What a shallow and ignorant article.
844 karma · joined October 6, 2014
green right
orange right
green down
green left
green down
orange left
green up
import numpy as np
from mip import Model, xsum, minimize, BINARY
def solve(tiles):
rotations = [[[] for _ in row] for row in tiles]
rot_vars = [[[] for _ in row] for row in tiles]
model = Model("rotaboxes")
for i, row in enumerate(tiles):
for j, tile in enumerate(row):
for _ in range(3):
tile = tile.transpose((1, 0, 2))[::-1]
rotations[i][j].append(tile)
rot_vars[i][j].append(model.add_var(var_type=BINARY))
model += (xsum(rot_vars[i][j]) == 1)
costs = []
for i, row in enumerate(tiles):
for j, tile in enumerate(row):
for (di, dj) in [(0, 1), (1, 0)]:
if (i + di >= len(tiles)) or (j + dj >= len(tiles[0])):
continue
for r0, t0 in enumerate(rotations[i][j]):
for r1, t1 in enumerate(rotations[i + di][j + dj]):
if di:
a, b = t0[-1], t1[0]
else:
a, b = t0[:,-1], t1[:,0]
n = np.square(a - b).mean()
d = np.square(a[1:] - a[:1]).mean() + np.square(b[1:] - b[:1]).mean()
e = 2. * n / (d + 0.01)
v = model.add_var(var_type=BINARY)
model += (v >= rot_vars[i][j][r0] + rot_vars[i + di][j + dj][r1] - 1)
costs.append(e * v)
model.objective = minimize(xsum(costs))
model.optimize()
solution = [[[r for v, r in zip(vs, rs) if v.x >= 0.99][0] for vs, rs in zip(row0, row1)] for row0, row1 in zip(rot_vars, rotations)]
return solution #include <stdlib.h>
#include <string.h>
int match(char* regex, char* text) {
int n = strlen(regex);
char* active = calloc(n + 1, 1);
char* next_active = calloc(n + 1, 1);
active[0] = 1;
int found = 0;
int anchor = regex[0] == '^';
regex += anchor;
do {
for (int i = 0; i <= n; i++) {
if (!active[i])
continue;
if (regex[i] == '\0') {
found = 1;
goto DONE;
} else if (regex[i + 1] == '*') {
next_active[i + 2] = 1;
if (regex[i] == '.' || regex[i] == *text)
next_active[i] = 1;
} else if (regex[i] == '$' && regex[i + 1] == '\0') {
found = *text == '\0';
goto DONE;
} else {
next_active[i + 1] = regex[i] == *text;
}
}
char* tmp = next_active;
next_active = active;
active = tmp;
active[0] = !anchor;
memset(next_active, 0, n + 1);
} while (*text++ != '\0');
DONE:;
free(active);
free(next_active);
return found;
}