Esempio n. 1
0
def test_get_children():
    rule = PushRule()
    s = (
        "#   #",
        "#@. #",
        " $  #",
        "    #",
        "#####",
    )

    used_cells = set()
    children = rule.get_children(s, used_cells)
    assert_equal(3, len(children))
    _assert_contains(children, (
        "#   #",
        "# + #",
        " $  #",
        "    #",
        "#####",
    ))
    _assert_contains(children, (
        "#@  #",
        "# . #",
        " $  #",
        "    #",
        "#####",
    ))
    _assert_contains(children, (
        "#   #",
        "# . #",
        " @  #",
        " $  #",
        "#####",
    ))

    used_s = modeling.mutablize(s)
    for pos in used_cells:
        x, y = pos
        used_s[y][x] = "!"

    assert_equal(
        modeling.immutablize((
            "#!  #",
            "!!! #",
            " !  #",
            " !  #",
            "#####",
        )), modeling.immutablize(used_s))
Esempio n. 2
0
def generalize(pattern, used_cells):
    """Erases the unused positions.
    """
    new_pattern = modeling.mutablize(pattern)
    for y, row in enumerate(pattern):
        for x in xrange(len(row)):
            pos = (x, y)
            if pos not in used_cells:
                new_pattern[y][x] = UNKNOWN_MARK

    return modeling.immutablize(new_pattern)
Esempio n. 3
0
def test_get_children_from_end_state():
    s = modeling.immutablize("""\
#$  #
 @ .#
    #
    #
#####""".splitlines())
    rule = PushRule()
    used_cells = set()
    children = rule.get_children(s, used_cells)
    assert_equal(None, children)
    assert_equal(set(), used_cells)
Esempio n. 4
0
def _identify_move(s, a):
    #TODO: ignore non-struct states and actions
    pattern = []
    effects = a.get_cmd()
    xs = [pos[0] for pos, mark in effects]
    ys = [pos[1] for pos, mark in effects]
    min_x = min(xs)
    max_x = max(xs)
    for y in xrange(min(ys) - MARGIN, max(ys) + MARGIN + 1):
        row = s[y]
        pattern_row = []
        pattern.append(pattern_row)
        for x in xrange(min_x - MARGIN, max_x + MARGIN + 1):
            pattern_row.append(row[x])

    return immutablize(pattern)
Esempio n. 5
0
def _read_patterns(input):
    patterns = []
    separator = input.readline().rstrip()
    pattern_w = len(separator)
    pattern_h = None
    lines = []
    for line in input:
        line = line[:pattern_w]
        if line != separator:
            lines.append(line)

        if len(lines) == pattern_h or (pattern_h is None
                                       and line == separator):
            pattern_h = len(lines)
            patterns.append(modeling.immutablize(lines))
            lines = []

    return patterns
Esempio n. 6
0
def parse_field(input):
    lines = input.splitlines()
    return modeling.immutablize(lines)
Esempio n. 7
0
def _assert_contains(childern, s):
    s = modeling.immutablize(s)
    assert s in childern