| { | |
| "247ef758": "def solve(grid):\n from collections import Counter\n grid = [row[:] for row in grid]\n H = len(grid)\n W = len(grid[0])\n div_col = None\n for c in range(W):\n vals = set(grid[r][c] for r in range(H))\n if len(vals) == 1 and 0 not in vals:\n div_col = c\n break\n left_cols = list(range(0, div_col))\n right_start = div_col + 1\n right_end = W - 1\n border_vals = []\n for c in range(right_start, W):\n border_vals.extend([grid[0][c], grid[H-1][c]])\n for r in range(H):\n border_vals.extend([grid[r][right_start], grid[r][right_end]])\n border_default = Counter(border_vals).most_common(1)[0][0]\n col_markers = {}\n for c in range(right_start, W):\n v = grid[0][c]\n if v != border_default and v != 0:\n col_markers.setdefault(v, []).append(c)\n row_markers = {}\n for r in range(H):\n v = grid[r][right_start]\n if v != border_default and v != 0:\n row_markers.setdefault(v, []).append(r)\n v2 = grid[r][right_end]\n if v2 != border_default and v2 != 0 and v2 not in [grid[r][right_start]]:\n row_markers.setdefault(v2, []).append(r)\n shapes = {}\n for r in range(H):\n for c in left_cols:\n v = grid[r][c]\n if v != 0:\n shapes.setdefault(v, []).append((r, c))\n shape_data = {}\n for color, cells in shapes.items():\n rs = [r for r, c in cells]\n cs = [c for r, c in cells]\n cr = (min(rs) + max(rs)) / 2.0\n cc = (min(cs) + max(cs)) / 2.0\n offsets = [(r - cr, c - cc) for r, c in cells]\n shape_data[color] = (offsets, cr, cc)\n out = [row[:] for row in grid]\n for r in range(H):\n for c in left_cols:\n out[r][c] = 0\n for color, cells in shapes.items():\n if color not in col_markers or color not in row_markers:\n for r, c in cells:\n out[r][c] = color\n ordered_colors = sorted(shape_data.keys(), key=lambda c: shape_data[c][1], reverse=True)\n for color in ordered_colors:\n if color in col_markers and color in row_markers:\n offsets, cr, cc = shape_data[color]\n for target_r in row_markers[color]:\n for target_c in col_markers[color]:\n for dr, dc in offsets:\n nr = int(round(target_r + dr))\n nc = int(round(target_c + dc))\n if 0 <= nr < H and 0 <= nc < W:\n out[nr][nc] = color\n return out", | |
| "332f06d7": "def solve(grid):\n from collections import deque\n grid = [row[:] for row in grid]\n H = len(grid)\n W = len(grid[0])\n zero_cells = set((r,c) for r in range(H) for c in range(W) if grid[r][c] == 0)\n min_r0 = min(r for r,c in zero_cells)\n max_r0 = max(r for r,c in zero_cells)\n min_c0 = min(c for r,c in zero_cells)\n max_c0 = max(c for r,c in zero_cells)\n bh = max_r0 - min_r0 + 1\n bw = max_c0 - min_c0 + 1\n def is_path(r, c):\n return 0 <= r < H and 0 <= c < W and grid[r][c] in (0, 1, 2)\n def can_be_at(pr, pc):\n return all(is_path(r, c) for r in range(pr, pr+bh) for c in range(pc, pc+bw))\n pos = (min_r0, min_c0)\n q = deque([pos])\n block_dist = {pos: 0}\n farthest = (0, pos)\n while q:\n cr, cc = q.popleft()\n d = block_dist[(cr,cc)]\n for dr, dc in [(-1,0),(1,0),(0,-1),(0,1)]:\n nr, nc = cr+dr, cc+dc\n if (nr, nc) not in block_dist and can_be_at(nr, nc):\n block_dist[(nr, nc)] = d + 1\n q.append((nr, nc))\n if d + 1 > farthest[0]:\n farthest = (d + 1, (nr, nc))\n target = farthest[1]\n for r, c in zero_cells:\n grid[r][c] = 1\n for r in range(target[0], target[0]+bh):\n for c in range(target[1], target[1]+bw):\n grid[r][c] = 0\n return grid", | |
| "28a6681f": "def solve(grid):\n grid = [row[:] for row in grid]\n H = len(grid)\n W = len(grid[0])\n one_positions = [(r,c) for r in range(H) for c in range(W) if grid[r][c] == 1]\n one_count = len(one_positions)\n if not one_positions:\n return grid\n border_positions = [(r,c) for r in range(H) for c in range(W) if grid[r][c] not in (0, 1)]\n avg_1_c = sum(c for r,c in one_positions) / len(one_positions)\n avg_b_c = sum(c for r,c in border_positions) / len(border_positions)\n dc = avg_1_c - avg_b_c\n for r, c in one_positions:\n grid[r][c] = 0\n pocket = set()\n for r in range(H):\n borders = [c for c in range(W) if grid[r][c] != 0]\n if not borders:\n continue\n border_colors = {}\n for c in borders:\n border_colors.setdefault(grid[r][c], []).append(c)\n for color, cols in border_colors.items():\n if len(cols) >= 2:\n for c in range(min(cols)+1, max(cols)):\n if grid[r][c] == 0:\n pocket.add((r, c))\n if dc > 0:\n rightmost = max(borders)\n for c in range(rightmost+1, W):\n if grid[r][c] == 0:\n pocket.add((r, c))\n elif dc < 0:\n leftmost = min(borders)\n for c in range(0, leftmost):\n if grid[r][c] == 0:\n pocket.add((r, c))\n for c in range(W):\n borders = [r for r in range(H) if grid[r][c] != 0]\n if not borders:\n continue\n border_colors = {}\n for r in borders:\n border_colors.setdefault(grid[r][c], []).append(r)\n for color, rows in border_colors.items():\n if len(rows) >= 2:\n for r in range(min(rows)+1, max(rows)):\n if grid[r][c] == 0:\n pocket.add((r, c))\n pocket_sorted = sorted(pocket, key=lambda rc: (-rc[0], -rc[1]))\n filled = 0\n for r, c in pocket_sorted:\n if filled >= one_count:\n break\n grid[r][c] = 1\n filled += 1\n return grid", | |
| "2c181942": "def solve(grid):\n from collections import deque\n from itertools import combinations\n grid = [row[:] for row in grid]\n H = len(grid)\n W = len(grid[0])\n bg = 8\n\n visited = [[False]*W for _ in range(H)]\n components = []\n\n def bfs(sr, sc):\n q = deque([(sr, sc)])\n visited[sr][sc] = True\n cells = []\n while q:\n r, c = q.popleft()\n cells.append((r, c, grid[r][c]))\n for dr, dc in [(-1,0),(1,0),(0,-1),(0,1)]:\n nr, nc = r+dr, c+dc\n if 0 <= nr < H and 0 <= nc < W and not visited[nr][nc] and grid[nr][nc] != bg:\n visited[nr][nc] = True\n q.append((nr, nc))\n return cells\n\n for r in range(H):\n for c in range(W):\n if not visited[r][c] and grid[r][c] != bg:\n components.append(bfs(r, c))\n\n by_color = {}\n for comp in components:\n color = comp[0][2]\n by_color.setdefault(color, []).append(comp)\n\n size2_comps = [c for c in components if len(c) == 2]\n\n def comp_center(comp):\n return (sum(r for r,c,v in comp)/len(comp), sum(c for r,c,v in comp)/len(comp))\n\n # Find the 4 size-2 components forming the tightest cross (minimum max pairwise distance)\n comp_centers = [(comp, comp_center(comp)) for comp in size2_comps]\n\n best_group = None\n best_score = float('inf')\n for group in combinations(range(len(comp_centers)), 4):\n # Must have 4 different colors\n colors = set(comp_centers[i][0][0][2] for i in group)\n if len(colors) < 4:\n continue\n pts = [comp_centers[i][1] for i in group]\n max_dist = 0\n for i in range(4):\n for j in range(i+1, 4):\n d = abs(pts[i][0]-pts[j][0]) + abs(pts[i][1]-pts[j][1])\n max_dist = max(max_dist, d)\n if max_dist < best_score:\n best_score = max_dist\n best_group = group\n\n if best_group is None:\n return grid\n\n arm_list = [comp_centers[i] for i in best_group]\n avg_r = sum(c[1][0] for c in arm_list) / 4\n avg_c = sum(c[1][1] for c in arm_list) / 4\n\n arm_comps = {}\n arm_info = {}\n for comp, (cr, cc) in arm_list:\n color = comp[0][2]\n arm_comps[color] = comp\n dr = cr - avg_r\n dc = cc - avg_c\n if abs(dr) > abs(dc):\n direction = 'DOWN' if dr > 0 else 'UP'\n else:\n direction = 'RIGHT' if dc > 0 else 'LEFT'\n arm_info[color] = (direction, comp)\n\n external_shapes = {}\n for color, comps in by_color.items():\n ext_cells = []\n for comp in comps:\n if comp is not arm_comps.get(color):\n ext_cells.extend(comp)\n if ext_cells:\n external_shapes[color] = ext_cells\n\n def normalize(shape):\n mr = min(dr for dr,dc in shape)\n mc = min(dc for dr,dc in shape)\n return [(dr-mr, dc-mc) for dr,dc in shape]\n\n def rotate_cw(shape):\n return normalize([(dc, -dr) for dr, dc in shape])\n\n def hflip(shape):\n mx = max(dc for dr,dc in shape)\n return normalize([(dr, mx-dc) for dr,dc in shape])\n\n def all_orientations(shape):\n results = []\n cur = list(shape)\n for _ in range(4):\n results.append(tuple(sorted(cur)))\n results.append(tuple(sorted(hflip(cur))))\n cur = rotate_cw(cur)\n seen = set()\n unique = []\n for r in results:\n if r not in seen:\n seen.add(r)\n unique.append(list(r))\n return unique\n\n for color, ext_cells in external_shapes.items():\n if color not in arm_info:\n for r, c, v in ext_cells:\n grid[r][c] = bg\n continue\n\n direction, arm_comp = arm_info[color]\n arm_cells = [(r, c) for r, c, v in arm_comp]\n arm_rs = sorted(set(r for r,c in arm_cells))\n arm_cs = sorted(set(c for r,c in arm_cells))\n arm_h = len(arm_rs)\n arm_w = len(arm_cs)\n\n ext_min_r = min(r for r,c,v in ext_cells)\n ext_min_c = min(c for r,c,v in ext_cells)\n shape = [(r - ext_min_r, c - ext_min_c) for r,c,v in ext_cells]\n\n candidates = []\n for rotated in all_orientations(shape):\n sh = max(dr for dr,dc in rotated) + 1\n sw = max(dc for dr,dc in rotated) + 1\n\n if direction in ('LEFT', 'RIGHT'):\n aspect_ok = sh >= sw\n else:\n aspect_ok = sw >= sh\n\n place_r = place_c = None\n\n if direction == 'LEFT':\n edge_col = sw - 1\n edge_rows = sorted(dr for dr,dc in rotated if dc == edge_col)\n if len(edge_rows) == arm_h and all(edge_rows[i+1]==edge_rows[i]+1 for i in range(len(edge_rows)-1)):\n place_r = arm_rs[0] - edge_rows[0]\n place_c = arm_cs[0] - sw\n elif direction == 'RIGHT':\n edge_col = 0\n edge_rows = sorted(dr for dr,dc in rotated if dc == edge_col)\n if len(edge_rows) == arm_h and all(edge_rows[i+1]==edge_rows[i]+1 for i in range(len(edge_rows)-1)):\n place_r = arm_rs[0] - edge_rows[0]\n place_c = arm_cs[-1] + 1\n elif direction == 'UP':\n edge_row = sh - 1\n edge_cols = sorted(dc for dr,dc in rotated if dr == edge_row)\n if len(edge_cols) == arm_w and all(edge_cols[i+1]==edge_cols[i]+1 for i in range(len(edge_cols)-1)):\n place_r = arm_rs[0] - sh\n place_c = arm_cs[0] - edge_cols[0]\n elif direction == 'DOWN':\n edge_row = 0\n edge_cols = sorted(dc for dr,dc in rotated if dr == edge_row)\n if len(edge_cols) == arm_w and all(edge_cols[i+1]==edge_cols[i]+1 for i in range(len(edge_cols)-1)):\n place_r = arm_rs[-1] + 1\n place_c = arm_cs[0] - edge_cols[0]\n\n if place_r is not None:\n candidates.append((aspect_ok, rotated, place_r, place_c))\n\n candidates.sort(key=lambda x: (not x[0],))\n if candidates:\n _, rotated, place_r, place_c = candidates[0]\n for r, c, v in ext_cells:\n grid[r][c] = bg\n for dr, dc in rotated:\n nr, nc = place_r + dr, place_c + dc\n if 0 <= nr < H and 0 <= nc < W:\n grid[nr][nc] = color\n else:\n for r, c, v in ext_cells:\n grid[r][c] = bg\n\n return grid" | |
| } |