File size: 19,261 Bytes
820efbe
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
{
  "272f95fa": "def solve(grid):\n    rows = len(grid)\n    cols = len(grid[0])\n    output = [row[:] for row in grid]\n    h_lines = []\n    v_lines = []\n    for r in range(rows):\n        if all(grid[r][c] == 8 for c in range(cols)):\n            h_lines.append(r)\n    for c in range(cols):\n        if all(grid[r][c] == 8 for r in range(rows)):\n            v_lines.append(c)\n    row_bands = [(0, h_lines[0]-1), (h_lines[0]+1, h_lines[1]-1), (h_lines[1]+1, rows-1)]\n    col_bands = [(0, v_lines[0]-1), (v_lines[0]+1, v_lines[1]-1), (v_lines[1]+1, cols-1)]\n    color_map = {\n        (0,0): 0, (0,1): 2, (0,2): 0,\n        (1,0): 4, (1,1): 6, (1,2): 3,\n        (2,0): 0, (2,1): 1, (2,2): 0,\n    }\n    for ri, (r1, r2) in enumerate(row_bands):\n        for ci, (c1, c2) in enumerate(col_bands):\n            color = color_map[(ri, ci)]\n            for r in range(r1, r2+1):\n                for c in range(c1, c2+1):\n                    if grid[r][c] == 0:\n                        output[r][c] = color\n    return output",
  "29ec7d0e": "def solve(grid):\n    rows = len(grid)\n    cols = len(grid[0])\n    output = [row[:] for row in grid]\n    for rp in range(1, rows+1):\n        for cp in range(1, cols+1):\n            valid = True\n            for r in range(rows):\n                for c in range(cols):\n                    if grid[r][c] != 0:\n                        for r2 in range(rows):\n                            for c2 in range(cols):\n                                if grid[r2][c2] != 0 and r % rp == r2 % rp and c % cp == c2 % cp:\n                                    if grid[r][c] != grid[r2][c2]:\n                                        valid = False\n                                        break\n                            if not valid:\n                                break\n                    if not valid:\n                        break\n                if not valid:\n                    break\n            if valid:\n                tile = {}\n                for r in range(rows):\n                    for c in range(cols):\n                        if grid[r][c] != 0:\n                            tile[(r % rp, c % cp)] = grid[r][c]\n                if len(tile) == rp * cp:\n                    for r in range(rows):\n                        for c in range(cols):\n                            key = (r % rp, c % cp)\n                            if key in tile:\n                                output[r][c] = tile[key]\n                    return output\n    return output",
  "32597951": "def solve(grid):\n    rows = len(grid)\n    cols = len(grid[0])\n    output = [row[:] for row in grid]\n    eight_cells = set()\n    for r in range(rows):\n        for c in range(cols):\n            if grid[r][c] == 8:\n                eight_cells.add((r, c))\n    if not eight_cells:\n        return output\n    rs = [c[0] for c in eight_cells]\n    cs = [c[1] for c in eight_cells]\n    rmin, rmax = min(rs), max(rs)\n    cmin, cmax = min(cs), max(cs)\n    for r in range(rmin, rmax + 1):\n        for c in range(cmin, cmax + 1):\n            if grid[r][c] not in (0, 8):\n                output[r][c] = 3\n    return output",
  "3345333e": "def solve(grid):\n    rows = len(grid)\n    cols = len(grid[0])\n    output = [row[:] for row in grid]\n    color_cells = {}\n    for r in range(rows):\n        for c in range(cols):\n            v = grid[r][c]\n            if v != 0:\n                if v not in color_cells:\n                    color_cells[v] = []\n                color_cells[v].append((r, c))\n    if len(color_cells) < 2:\n        return output\n    def is_rectangle(cells):\n        if not cells:\n            return False\n        rs = [c[0] for c in cells]\n        cs = [c[1] for c in cells]\n        rmin, rmax = min(rs), max(rs)\n        cmin, cmax = min(cs), max(cs)\n        return len(cells) == (rmax - rmin + 1) * (cmax - cmin + 1)\n    overlay_color = None\n    shape_color = None\n    for color, cells in color_cells.items():\n        if is_rectangle(cells):\n            overlay_color = color\n        else:\n            shape_color = color\n    if overlay_color is None or shape_color is None:\n        return output\n    overlay_cells = set(color_cells[overlay_color])\n    shape_cells = set(color_cells[shape_color])\n    for r, c in overlay_cells:\n        output[r][c] = 0\n    shape_cs = [c[1] for c in shape_cells]\n    shape_rs = [c[0] for c in shape_cells]\n    c_center = (min(shape_cs) + max(shape_cs)) / 2.0\n    r_center = (min(shape_rs) + max(shape_rs)) / 2.0\n    lr_valid = True\n    for r, c in shape_cells:\n        mirror_c = round(2 * c_center - c)\n        if 0 <= mirror_c < cols:\n            if (r, mirror_c) not in shape_cells and (r, mirror_c) not in overlay_cells:\n                lr_valid = False\n                break\n    tb_valid = True\n    for r, c in shape_cells:\n        mirror_r = round(2 * r_center - r)\n        if 0 <= mirror_r < rows:\n            if (mirror_r, c) not in shape_cells and (mirror_r, c) not in overlay_cells:\n                tb_valid = False\n                break\n    if lr_valid:\n        for r, c in shape_cells:\n            mirror_c = round(2 * c_center - c)\n            if 0 <= mirror_c < cols and (r, mirror_c) in overlay_cells:\n                output[r][mirror_c] = shape_color\n    if tb_valid:\n        for r, c in shape_cells:\n            mirror_r = round(2 * r_center - r)\n            if 0 <= mirror_r < rows and (mirror_r, c) in overlay_cells:\n                output[mirror_r][c] = shape_color\n    if lr_valid and tb_valid:\n        for r, c in shape_cells:\n            mirror_r = round(2 * r_center - r)\n            mirror_c = round(2 * c_center - c)\n            if 0 <= mirror_r < rows and 0 <= mirror_c < cols and (mirror_r, mirror_c) in overlay_cells:\n                output[mirror_r][mirror_c] = shape_color\n    return output",
  "36fdfd69": "def solve(grid):\n    rows = len(grid)\n    cols = len(grid[0])\n    output = [row[:] for row in grid]\n    two_cells = set()\n    for r in range(rows):\n        for c in range(cols):\n            if grid[r][c] == 2:\n                two_cells.add((r, c))\n    parent = {}\n    for cell in two_cells:\n        parent[cell] = cell\n    def find(x):\n        while parent[x] != x:\n            parent[x] = parent[parent[x]]\n            x = parent[x]\n        return x\n    def union(a, b):\n        a, b = find(a), find(b)\n        if a != b:\n            parent[a] = b\n    two_list = list(two_cells)\n    for i in range(len(two_list)):\n        for j in range(i+1, len(two_list)):\n            r1, c1 = two_list[i]\n            r2, c2 = two_list[j]\n            dr = abs(r1 - r2)\n            dc = abs(c1 - c2)\n            if max(dr, dc) <= 2:\n                rmin, rmax = min(r1, r2), max(r1, r2)\n                cmin, cmax = min(c1, c2), max(c1, c2)\n                all_nonzero = True\n                for r in range(rmin, rmax + 1):\n                    for c in range(cmin, cmax + 1):\n                        if grid[r][c] == 0:\n                            all_nonzero = False\n                            break\n                    if not all_nonzero:\n                        break\n                if all_nonzero:\n                    union(two_list[i], two_list[j])\n            elif max(dr, dc) <= 3 and min(dr, dc) <= 1:\n                rmin, rmax = min(r1, r2), max(r1, r2)\n                cmin, cmax = min(c1, c2), max(c1, c2)\n                all_nonzero = True\n                for r in range(rmin, rmax + 1):\n                    for c in range(cmin, cmax + 1):\n                        if grid[r][c] == 0:\n                            all_nonzero = False\n                            break\n                    if not all_nonzero:\n                        break\n                if all_nonzero:\n                    union(two_list[i], two_list[j])\n    from collections import defaultdict\n    groups = defaultdict(set)\n    for cell in two_cells:\n        groups[find(cell)].add(cell)\n    for cluster in groups.values():\n        rs = [c[0] for c in cluster]\n        cs = [c[1] for c in cluster]\n        rmin, rmax = min(rs), max(rs)\n        cmin, cmax = min(cs), max(cs)\n        for r in range(rmin, rmax + 1):\n            for c in range(cmin, cmax + 1):\n                if grid[r][c] != 2:\n                    output[r][c] = 4\n    return output",
  "39e1d7f9": "def solve(grid):\n    rows, cols = len(grid), len(grid[0])\n    output = [row[:] for row in grid]\n    sep_color = None\n    for test_color in range(10):\n        h_count = sum(1 for r in range(rows) if all(grid[r][c] == test_color for c in range(cols)))\n        v_count = sum(1 for c in range(cols) if all(grid[r][c] == test_color for r in range(rows)))\n        if h_count >= 2 and v_count >= 2:\n            sep_color = test_color\n            break\n    if sep_color is None:\n        return output\n    h_lines = [r for r in range(rows) if all(grid[r][c] == sep_color for c in range(cols))]\n    v_lines = [c for c in range(cols) if all(grid[r][c] == sep_color for r in range(rows))]\n    row_bands = []\n    prev = 0\n    for hl in h_lines:\n        if hl > prev:\n            row_bands.append((prev, hl - 1))\n        prev = hl + 1\n    if prev < rows:\n        row_bands.append((prev, rows - 1))\n    col_bands = []\n    prev = 0\n    for vl in v_lines:\n        if vl > prev:\n            col_bands.append((prev, vl - 1))\n        prev = vl + 1\n    if prev < cols:\n        col_bands.append((prev, cols - 1))\n    n_rows = len(row_bands)\n    n_cols = len(col_bands)\n    cell_colors = {}\n    for ri in range(n_rows):\n        for ci in range(n_cols):\n            r1, r2 = row_bands[ri]\n            c1, c2 = col_bands[ci]\n            colors = set()\n            for r in range(r1, r2 + 1):\n                for c in range(c1, c2 + 1):\n                    if grid[r][c] not in (0, sep_color):\n                        colors.add(grid[r][c])\n            if colors:\n                cell_colors[(ri, ci)] = list(colors)[0]\n            else:\n                cell_colors[(ri, ci)] = 0\n    nonzero_cells = {k: v for k, v in cell_colors.items() if v != 0}\n    visited = set()\n    components = []\n    for cell in nonzero_cells:\n        if cell in visited:\n            continue\n        comp = {}\n        queue = [cell]\n        while queue:\n            cr, cc = queue.pop(0)\n            if (cr, cc) in visited:\n                continue\n            visited.add((cr, cc))\n            comp[(cr, cc)] = nonzero_cells[(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 nonzero_cells and (nr, nc) not in visited:\n                    queue.append((nr, nc))\n        components.append(comp)\n    stamp_comp = max(components, key=len)\n    dots = [list(comp.keys())[0] for comp in components if len(comp) == 1]\n    if not dots:\n        return output\n    dot_color = cell_colors[dots[0]]\n    stamp_center = None\n    for pos, color in stamp_comp.items():\n        if color == dot_color:\n            stamp_center = pos\n            break\n    if stamp_center is None:\n        return output\n    stamp_pattern = {}\n    for pos, color in stamp_comp.items():\n        dr = pos[0] - stamp_center[0]\n        dc = pos[1] - stamp_center[1]\n        stamp_pattern[(dr, dc)] = color\n    for dot in dots:\n        for (dr, dc), color in stamp_pattern.items():\n            nr, nc = dot[0] + dr, dot[1] + dc\n            if 0 <= nr < n_rows and 0 <= nc < n_cols:\n                r1, r2 = row_bands[nr]\n                c1, c2 = col_bands[nc]\n                for r in range(r1, r2 + 1):\n                    for c in range(c1, c2 + 1):\n                        if grid[r][c] == 0:\n                            output[r][c] = color\n    return output",
  "2dd70a9a": "def solve(grid):\n    rows = len(grid)\n    cols = len(grid[0])\n    output = [row[:] for row in grid]\n    markers = {}\n    for r in range(rows):\n        for c in range(cols):\n            if grid[r][c] not in (0, 8):\n                color = grid[r][c]\n                if color not in markers:\n                    markers[color] = []\n                markers[color].append((r, c))\n    colors = list(markers.keys())\n    cells_a = set(markers[colors[0]])\n    cells_b = set(markers[colors[1]])\n    def get_max_ext(start_r, start_c, dr, dc):\n        ext = []\n        nr, nc = start_r + dr, start_c + dc\n        while 0 <= nr < rows and 0 <= nc < cols and grid[nr][nc] == 0:\n            ext.append((nr, nc))\n            nr += dr\n            nc += dc\n        return ext\n    best_path = None\n    best_score = None\n    for d_a in [(-1,0),(1,0),(0,-1),(0,1)]:\n        d_b = (-d_a[0], -d_a[1])\n        for ra, ca in cells_a:\n            a_full = get_max_ext(ra, ca, d_a[0], d_a[1])\n            if not a_full:\n                continue\n            for rb, cb in cells_b:\n                b_full = get_max_ext(rb, cb, d_b[0], d_b[1])\n                if not b_full:\n                    continue\n                for ai in range(len(a_full)):\n                    ap = a_full[ai]\n                    for bi in range(len(b_full)):\n                        bp = b_full[bi]\n                        if d_a[0] == 0:\n                            if ap[1] != bp[1]:\n                                continue\n                            rmin, rmax = min(ap[0], bp[0]), max(ap[0], bp[0])\n                            connector = []\n                            valid = True\n                            for rr in range(rmin + 1, rmax):\n                                if grid[rr][ap[1]] == 0:\n                                    connector.append((rr, ap[1]))\n                                else:\n                                    valid = False\n                                    break\n                        else:\n                            if ap[0] != bp[0]:\n                                continue\n                            cmin, cmax = min(ap[1], bp[1]), max(ap[1], bp[1])\n                            connector = []\n                            valid = True\n                            for cc in range(cmin + 1, cmax):\n                                if grid[ap[0]][cc] == 0:\n                                    connector.append((ap[0], cc))\n                                else:\n                                    valid = False\n                                    break\n                        if not valid:\n                            continue\n                        connector_len = len(connector)\n                        a_len = ai + 1\n                        path = set(a_full[:ai+1] + b_full[:bi+1] + connector)\n                        total_len = len(path)\n                        score = (connector_len, total_len, a_len)\n                        if best_score is None or score < best_score:\n                            best_path = path\n                            best_score = score\n    if best_path:\n        for r, c in best_path:\n            output[r][c] = 3\n        return output\n    best_score = None\n    for d in [(-1,0),(1,0),(0,-1),(0,1)]:\n        for ra, ca in cells_a:\n            a_full = get_max_ext(ra, ca, d[0], d[1])\n            if not a_full:\n                continue\n            for rb, cb in cells_b:\n                b_full = get_max_ext(rb, cb, d[0], d[1])\n                if not b_full:\n                    continue\n                if len(a_full) <= len(b_full):\n                    pivot = a_full[-1]\n                else:\n                    pivot = b_full[-1]\n                if d[0] == 0:\n                    target_col = pivot[1]\n                    if len(a_full) <= len(b_full):\n                        a_used = a_full\n                        b_used = None\n                        for bi, bpt in enumerate(b_full):\n                            if bpt[1] == target_col:\n                                b_used = b_full[:bi+1]\n                                bp = bpt\n                                break\n                        if b_used is None:\n                            continue\n                        ap = pivot\n                    else:\n                        b_used = b_full\n                        a_used = None\n                        for ai, apt in enumerate(a_full):\n                            if apt[1] == target_col:\n                                a_used = a_full[:ai+1]\n                                ap = apt\n                                break\n                        if a_used is None:\n                            continue\n                        bp = pivot\n                else:\n                    target_row = pivot[0]\n                    if len(a_full) <= len(b_full):\n                        a_used = a_full\n                        b_used = None\n                        for bi, bpt in enumerate(b_full):\n                            if bpt[0] == target_row:\n                                b_used = b_full[:bi+1]\n                                bp = bpt\n                                break\n                        if b_used is None:\n                            continue\n                        ap = pivot\n                    else:\n                        b_used = b_full\n                        a_used = None\n                        for ai, apt in enumerate(a_full):\n                            if apt[0] == target_row:\n                                a_used = a_full[:ai+1]\n                                ap = apt\n                                break\n                        if a_used is None:\n                            continue\n                        bp = pivot\n                if d[0] == 0:\n                    if ap[1] != bp[1]:\n                        continue\n                    rmin, rmax = min(ap[0], bp[0]), max(ap[0], bp[0])\n                    connector = []\n                    valid = True\n                    for rr in range(rmin + 1, rmax):\n                        if grid[rr][ap[1]] == 0:\n                            connector.append((rr, ap[1]))\n                        else:\n                            valid = False\n                            break\n                else:\n                    if ap[0] != bp[0]:\n                        continue\n                    cmin, cmax = min(ap[1], bp[1]), max(ap[1], bp[1])\n                    connector = []\n                    valid = True\n                    for cc in range(cmin + 1, cmax):\n                        if grid[ap[0]][cc] == 0:\n                            connector.append((ap[0], cc))\n                        else:\n                            valid = False\n                            break\n                if not valid:\n                    continue\n                connector_len = len(connector)\n                path = set(list(a_used) + list(b_used) + connector)\n                total_len = len(path)\n                score = (connector_len, total_len)\n                if best_score is None or score < best_score:\n                    best_path = path\n                    best_score = score\n    if best_path:\n        for r, c in best_path:\n            output[r][c] = 3\n    return output"
}