| { | |
| "53fb4810": "import copy\n\ndef solve(grid):\n rows = len(grid)\n cols = len(grid[0])\n bg = grid[0][0]\n result = copy.deepcopy(grid)\n ones = set()\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] == 1:\n ones.add((r, c))\n visited = set()\n crosses = []\n for r, c in ones:\n if (r,c) in visited:\n continue\n comp = []\n queue = [(r,c)]\n visited.add((r,c))\n while queue:\n cr, cc = queue.pop(0)\n comp.append((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) in ones and (nr, nc) not in visited:\n visited.add((nr, nc))\n queue.append((nr, nc))\n crosses.append(comp)\n for cross in crosses:\n cross_set = set(cross)\n min_r = min(r for r,c in cross)\n max_r = max(r for r,c in cross)\n min_c = min(c for r,c in cross)\n max_c = max(c for r,c in cross)\n tail_pixels = []\n for r, c in cross:\n for dr, dc in [(-1,0),(1,0),(0,-1),(0,1)]:\n nr, nc = r+dr, c+dc\n if 0 <= nr < rows and 0 <= nc < cols and (nr,nc) not in cross_set and grid[nr][nc] != bg and grid[nr][nc] != 1:\n tail_pixels.append((nr, nc, grid[nr][nc]))\n if not tail_pixels:\n continue\n if all(r > max_r for r,c,v in tail_pixels):\n direction = (1, 0)\n elif all(r < min_r for r,c,v in tail_pixels):\n direction = (-1, 0)\n elif all(c > max_c for r,c,v in tail_pixels):\n direction = (0, 1)\n elif all(c < min_c for r,c,v in tail_pixels):\n direction = (0, -1)\n else:\n continue\n dr, dc = direction\n if dr != 0:\n tail_col_set = sorted(set(c for r,c,v in tail_pixels))\n pattern = []\n start_row = max_r + 1 if dr == 1 else min_r - 1\n r = start_row\n while 0 <= r < rows:\n row_vals = {}\n all_bg = True\n for c in tail_col_set:\n if grid[r][c] != bg:\n row_vals[c] = grid[r][c]\n all_bg = False\n if all_bg:\n break\n pattern.append(row_vals)\n r += dr\n if not pattern:\n continue\n period = len(pattern)\n for p in range(1, len(pattern)):\n valid = True\n for i in range(len(pattern)):\n if pattern[i] != pattern[i % p]:\n valid = False\n break\n if valid:\n period = p\n break\n base_pattern = pattern[:period]\n tail_end = start_row + (len(pattern) - 1) * dr\n r = tail_end + dr\n idx = len(pattern) % period\n while 0 <= r < rows:\n row_pattern = base_pattern[idx % period]\n for c, v in row_pattern.items():\n result[r][c] = v\n r += dr\n idx += 1\n else:\n tail_row_set = sorted(set(r for r,c,v in tail_pixels))\n pattern = []\n start_col = max_c + 1 if dc == 1 else min_c - 1\n c = start_col\n while 0 <= c < cols:\n col_vals = {}\n all_bg = True\n for r in tail_row_set:\n if grid[r][c] != bg:\n col_vals[r] = grid[r][c]\n all_bg = False\n if all_bg:\n break\n pattern.append(col_vals)\n c += dc\n if not pattern:\n continue\n period = len(pattern)\n for p in range(1, len(pattern)):\n valid = True\n for i in range(len(pattern)):\n if pattern[i] != pattern[i % p]:\n valid = False\n break\n if valid:\n period = p\n break\n base_pattern = pattern[:period]\n tail_end = start_col + (len(pattern) - 1) * dc\n c = tail_end + dc\n idx = len(pattern) % period\n while 0 <= c < cols:\n col_pattern = base_pattern[idx % period]\n for r, v in col_pattern.items():\n result[r][c] = v\n c += dc\n idx += 1\n return result\n", | |
| "58f5dbd5": "from collections import Counter\n\ndef solve(grid):\n rows = len(grid)\n cols = len(grid[0])\n flat = [v for row in grid for v in row]\n bg = Counter(flat).most_common(1)[0][0]\n rects = []\n found_rect_cells = set()\n for r in range(rows):\n for c in range(cols):\n if (r,c) in found_rect_cells:\n continue\n if grid[r][c] != bg:\n color = grid[r][c]\n if r > 0 and grid[r-1][c] == color:\n continue\n if c > 0 and grid[r][c-1] == color:\n continue\n w = 0\n while c + w < cols and grid[r][c+w] == color:\n w += 1\n h = 0\n valid = True\n while r + h < rows and valid:\n for dc in range(w):\n if grid[r+h][c+dc] != color:\n valid = False\n break\n if valid:\n h += 1\n if w >= 5 and h >= 5:\n rects.append((r, r+h, c, c+w, color))\n for rr in range(r, r+h):\n for cc in range(c, c+w):\n found_rect_cells.add((rr, cc))\n if not rects:\n return grid\n min_r = min(r1 for r1,r2,c1,c2,_ in rects) - 1\n max_r = max(r2 for r1,r2,c1,c2,_ in rects) + 1\n min_c = min(c1 for r1,r2,c1,c2,_ in rects) - 1\n max_c = max(c2 for r1,r2,c1,c2,_ in rects) + 1\n min_r = max(0, min_r)\n max_r = min(rows, max_r)\n min_c = max(0, min_c)\n max_c = min(cols, max_c)\n rect_area = set()\n for r in range(min_r, max_r):\n for c in range(min_c, max_c):\n rect_area.add((r, c))\n color_pixels = {}\n for r in range(rows):\n for c in range(cols):\n if (r,c) not in rect_area and grid[r][c] != bg:\n color = grid[r][c]\n if color not in color_pixels:\n color_pixels[color] = []\n color_pixels[color].append((r, c))\n patterns = {}\n for color, pixels in color_pixels.items():\n if not pixels:\n continue\n pixel_set = set(pixels)\n visited = set()\n for pr, pc in pixels:\n if (pr, pc) in visited:\n continue\n comp = []\n queue = [(pr, pc)]\n visited.add((pr, pc))\n while queue:\n cr, cc = queue.pop(0)\n comp.append((cr, cc))\n for dr in range(-2, 3):\n for dc in range(-2, 3):\n if dr == 0 and dc == 0:\n continue\n nr, nc = cr+dr, cc+dc\n if (nr, nc) in pixel_set and (nr, nc) not in visited:\n visited.add((nr, nc))\n queue.append((nr, nc))\n min_pr = min(r for r,c in comp)\n min_pc = min(c for r,c in comp)\n max_pr = max(r for r,c in comp)\n max_pc = max(c for r,c in comp)\n h = max_pr - min_pr + 1\n w = max_pc - min_pc + 1\n if h <= 3 and w <= 3:\n pat = [[bg]*3 for _ in range(3)]\n for pr2, pc2 in comp:\n pat[pr2-min_pr][pc2-min_pc] = color\n patterns[color] = pat\n out_h = max_r - min_r\n out_w = max_c - min_c\n result = [[bg]*out_w for _ in range(out_h)]\n for r in range(min_r, max_r):\n for c in range(min_c, max_c):\n result[r-min_r][c-min_c] = grid[r][c]\n for r1, r2, c1, c2, color in rects:\n if color not in patterns:\n continue\n pat = patterns[color]\n ir1 = r1 + 1\n ic1 = c1 + 1\n for pr in range(3):\n for pc in range(3):\n r = ir1 + pr - min_r\n c = ic1 + pc - min_c\n if 0 <= r < out_h and 0 <= c < out_w:\n if pat[pr][pc] == color:\n result[r][c] = bg\n else:\n result[r][c] = color\n return result\n", | |
| "5961cc34": "def solve(grid):\n rows = len(grid)\n cols = len(grid[0])\n bg = 8\n result = [[bg]*cols for _ in range(rows)]\n pos_4 = None\n pos_2s = []\n for r in range(rows):\n for c in range(cols):\n v = grid[r][c]\n if v == 4: pos_4 = (r, c)\n elif v == 2: pos_2s.append((r, c))\n if pos_4 is None:\n return grid\n fr, fc = pos_4\n trail_dir = None\n for dr, dc in [(-1,0),(1,0),(0,-1),(0,1)]:\n nr, nc = fr+dr, fc+dc\n if any(r==nr and c==nc for r,c in pos_2s):\n trail_dir = (-dr, -dc)\n break\n if trail_dir is None:\n return grid\n cross_cells = set()\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] in (1, 3):\n cross_cells.add((r, c))\n visited = set()\n crosses = []\n cross_idx_map = {}\n for r, c in cross_cells:\n if (r,c) in visited:\n continue\n comp = []\n queue = [(r,c)]\n visited.add((r,c))\n while queue:\n cr, cc = queue.pop(0)\n comp.append((cr, cc, grid[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) in cross_cells and (nr, nc) not in visited:\n visited.add((nr, nc))\n queue.append((nr, nc))\n ci = len(crosses)\n crosses.append(comp)\n for cr, cc, cv in comp:\n cross_idx_map[(cr, cc)] = ci\n cross_info = []\n for comp in crosses:\n cells = set((r,c) for r,c,v in comp)\n markers = [(r,c) for r,c,v in comp if v == 3]\n min_r = min(r for r,c,v in comp)\n max_r = max(r for r,c,v in comp)\n min_c = min(c for r,c,v in comp)\n max_c = max(c for r,c,v in comp)\n exit_info = []\n if markers:\n if all(r == min_r for r,c in markers):\n exit_info.append(((-1, 0), markers))\n elif all(r == max_r for r,c in markers):\n exit_info.append(((1, 0), markers))\n elif all(c == min_c for r,c in markers):\n exit_info.append(((0, -1), markers))\n elif all(c == max_c for r,c in markers):\n exit_info.append(((0, 1), markers))\n cross_info.append({'cells': cells, 'exit_info': exit_info})\n cells_to_fill = set()\n cells_to_fill.add(pos_4)\n for r, c in pos_2s:\n cells_to_fill.add((r, c))\n activated = set()\n def trace_line(start_r, start_c, dr, dc):\n r, c = start_r + dr, start_c + dc\n while 0 <= r < rows and 0 <= c < cols:\n if (r, c) in cross_idx_map:\n ci = cross_idx_map[(r, c)]\n if ci not in activated:\n activate_cross(ci)\n return\n cells_to_fill.add((r, c))\n r += dr\n c += dc\n def activate_cross(ci):\n activated.add(ci)\n info = cross_info[ci]\n for cr, cc in info['cells']:\n cells_to_fill.add((cr, cc))\n for exit_dir, marker_pos in info['exit_info']:\n for mr, mc in marker_pos:\n trace_line(mr, mc, exit_dir[0], exit_dir[1])\n trace_line(pos_4[0], pos_4[1], trail_dir[0], trail_dir[1])\n for r, c in cells_to_fill:\n if 0 <= r < rows and 0 <= c < cols:\n result[r][c] = 2\n return result\n", | |
| "67e490f4": "from collections import Counter, defaultdict\n\ndef normalize_shape(cells):\n cells = [(r, c) for r, c in cells]\n transforms = []\n for flip in [False, True]:\n pts = cells[:]\n if flip:\n pts = [(-r, c) for r, c in pts]\n for rot in range(4):\n mr = min(r for r, c in pts)\n mc = min(c for r, c in pts)\n normalized = tuple(sorted((r - mr, c - mc) for r, c in pts))\n transforms.append(normalized)\n pts = [(c, -r) for r, c in pts]\n return min(transforms)\n\ndef find_components(pixel_set):\n visited = set()\n components = []\n for r, c in pixel_set:\n if (r,c) in visited:\n continue\n comp = []\n queue = [(r,c)]\n visited.add((r,c))\n while queue:\n cr, cc = queue.pop(0)\n comp.append((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) in pixel_set and (nr, nc) not in visited:\n visited.add((nr, nc))\n queue.append((nr, nc))\n components.append(comp)\n return components\n\ndef solve(grid):\n rows = len(grid)\n cols = len(grid[0])\n flat = [v for row in grid for v in row]\n bg = Counter(flat).most_common(1)[0][0]\n rect_color = None\n rect_area = None\n for color, count in Counter(flat).most_common():\n if color == bg:\n continue\n positions = [(r,c) for r in range(rows) for c in range(cols) if grid[r][c] == color]\n if len(positions) < 20:\n continue\n min_r = min(r for r,c in positions)\n max_r = max(r for r,c in positions)\n min_c = min(c for r,c in positions)\n max_c = max(c for r,c in positions)\n is_border = True\n for c2 in range(min_c, max_c+1):\n if grid[min_r][c2] != color or grid[max_r][c2] != color:\n is_border = False\n break\n if is_border:\n for r2 in range(min_r, max_r+1):\n if grid[r2][min_c] != color or grid[r2][max_c] != color:\n is_border = False\n break\n if is_border:\n rect_color = color\n rect_area = (min_r, max_r, min_c, max_c)\n break\n if rect_color is None:\n return grid\n min_r, max_r, min_c, max_c = rect_area\n rect_bg = set()\n for r in range(min_r, max_r+1):\n for c in range(min_c, max_c+1):\n if grid[r][c] == bg:\n rect_bg.add((r, c))\n inside_clusters = find_components(rect_bg)\n inside_norms = [normalize_shape(comp) for comp in inside_clusters]\n rect_cells = set()\n for r in range(min_r, max_r+1):\n for c in range(min_c, max_c+1):\n rect_cells.add((r, c))\n outside_by_color = defaultdict(list)\n for r in range(rows):\n for c in range(cols):\n if (r,c) not in rect_cells and grid[r][c] not in (bg, rect_color):\n outside_by_color[grid[r][c]].append((r, c))\n shape_color_counts = defaultdict(lambda: defaultdict(int))\n for color, pixels in outside_by_color.items():\n comps = find_components(set(pixels))\n for comp in comps:\n norm = normalize_shape(comp)\n shape_color_counts[norm][color] += 1\n shape_to_color = {}\n for shape, colors in shape_color_counts.items():\n best_color = max(colors, key=colors.get)\n shape_to_color[shape] = best_color\n result = []\n for r in range(min_r, max_r+1):\n row = []\n for c in range(min_c, max_c+1):\n row.append(grid[r][c])\n result.append(row)\n for ci, comp in enumerate(inside_clusters):\n norm = inside_norms[ci]\n if norm in shape_to_color:\n color = shape_to_color[norm]\n for r, c in comp:\n result[r-min_r][c-min_c] = color\n return result\n", | |
| "581f7754": "from collections import Counter\n\ndef solve(grid):\n rows = len(grid)\n cols = len(grid[0])\n bg = grid[0][0]\n visited = set()\n components = []\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] != bg and (r,c) not in visited:\n comp = []\n queue = [(r,c)]\n visited.add((r,c))\n while queue:\n cr, cc = queue.pop(0)\n comp.append((cr, cc, grid[cr][cc]))\n for dr, dc in [(-1,0),(1,0),(0,-1),(0,1)]:\n nr, nc = cr+dr, cc+dc\n if 0 <= nr < rows and 0 <= nc < cols and (nr,nc) not in visited and grid[nr][nc] != bg:\n visited.add((nr,nc))\n queue.append((nr,nc))\n components.append(comp)\n singles = [c for c in components if len(c) == 1]\n shapes = [c for c in components if len(c) > 1]\n target_map = {}\n for s in singles:\n r, c, v = s[0]\n target_map[v] = (r, c)\n result = [[bg]*cols for _ in range(rows)]\n for s in singles:\n r, c, v = s[0]\n result[r][c] = v\n for shape in shapes:\n color_counts = Counter(v for r,c,v in shape)\n special = min(color_counts, key=color_counts.get)\n special_pos = [(r,c) for r,c,v in shape if v == special]\n sr, sc = special_pos[0]\n target = target_map.get(special)\n if not target:\n for r,c,v in shape:\n result[r][c] = v\n continue\n tr, tc = target\n if tr == 0 or tr == rows - 1:\n dr = 0\n dc = tc - sc\n elif tc == 0 or tc == cols - 1:\n dr = tr - sr\n dc = 0\n else:\n dr = tr - sr\n dc = tc - sc\n for r, c, v in shape:\n nr, nc = r + dr, c + dc\n if 0 <= nr < rows and 0 <= nc < cols:\n result[nr][nc] = v\n return result\n" | |
| } |