import sys
from collections import deque
from random import choice

identity = (1,2,3,4,5,6,7,8,9,10,11,12)

def left(e):
    return (e[10], e[8], e[6], e[4], e[2], e[0],
            e[1],  e[3], e[5], e[7], e[9], e[11])

def right(e):
    return (e[1],  e[3], e[5], e[7], e[9], e[11],
            e[10], e[8], e[6], e[4], e[2], e[0])

def generate():
    # Wrap identity in a list so the set constructor doesn't pick it apart.
    unvisited = set([identity])
    visited = set()

    while len(unvisited) != 0:
        cur = unvisited.pop()
        visited.add(cur)

        l = left(cur)
        if l not in visited:
            unvisited.add(l)

        r = right(cur)
        if r not in visited:
            unvisited.add(r)

    print('Generated %d elements' % len(visited))
    return visited

class path:
    def __init__(self, state, moves):
        self.state = state
        self.moves = moves

def solve(orig):
    unvisited = deque()
    unvisited.append(path(orig, []))
    visited = set()

    while len(unvisited) != 0:
        cur = unvisited.popleft()
        if cur.state == identity:
            return cur.moves

        visited.add(cur.state)

        l = left(cur.state)
        if l not in visited:
            unvisited.append(path(l, cur.moves + ['L']))

        r = right(cur.state)
        if r not in visited:
            unvisited.append(path(r, cur.moves + ['R']))

def step_through(state, moves):
    print(' 0  : %s' % str(state))
    for i in range(0, len(moves)):
        if moves[i] == 'L':
            state = left(state)
        else:
            state = right(state)
        print('%2d %s: %s' % (i+1, moves[i], state))

if __name__ == '__main__':
    elems = generate()

    if len(sys.argv) == 1:
        orig = choice(list(elems))
    elif len(sys.argv) == 13:
        orig = tuple([int(x) for x in sys.argv[1:]])
    else:
        print('Enter a sequence of 12 numbers or enter no sequence at all.')
        sys.exit(1)

    if orig in elems:
        moves = solve(orig)
        print('Path of length %d from %s to identity:\n [%s]\n' %
              (len(moves), orig, ''.join(moves)))
        step_through(orig, moves)
    else:
        print('Your sequence is unsolvable.')
