示例#1
0
def n_to_BV(n, size):
    out = [0] * size
    i = 0
    for var in frolic.rvr(bin(n)[2:]):
        if var == '1':
            out[i] = 1
        else:
            out[i] = 0
        i = i + 1
    return frolic.rvr(out)
示例#2
0
    def multiplier(self, X, Y):
        assert len(X) == len(Y)
        out = []
        #initial:
        prev = [self.const_false] * len(X)
        # first adder can be skipped, but I left thing "as is" to make it simpler
        for Y_bit in frolic.rvr(Y):
            s, carry = self.adder(self.mult_by_bit(X, Y_bit), prev)
            out.append(s[-1])
            prev = [carry] + s[:-1]

        return prev + frolic.rvr(out)
示例#3
0
 def adder(self, X, Y):
     assert len(X) == len(Y)
     # first full-adder could be half-adder
     # start with lowest bits:
     inputs = frolic.rvr(list(zip(X, Y)))
     carry = self.const_false
     sums = []
     for pair in inputs:
         # "carry" variable is replaced at each iteration.
         # so it is used in the each FA() call from the previous FA() call.
         s, carry = self.FA(pair[0], pair[1], carry)
         sums.append(s)
     return frolic.rvr(sums), carry
示例#4
0
    def subtractor(self, minuend, subtrahend):
        # same as adder(), buf: 1) subtrahend is inverted; 2) input carry-in bit is 1
        X = minuend
        Y = self.BV_NOT(subtrahend)

        inputs = frolic.rvr(list(zip(X, Y)))
        carry = self.const_true
        sums = []
        for pair in inputs:
            # "carry" variable is replaced at each iteration.
            # so it is used in the each FA() call from the previous FA() call.
            st, carry = self.FA(pair[0], pair[1], carry)
            sums.append(st)

        return frolic.rvr(sums), carry
示例#5
0
def BV_to_number(BV):
    # coeff=1, 2^1, 2^2 ... 2^(len(BV)-1)
    coeff = 1
    rt = 0
    for v in frolic.rvr(BV):
        rt = rt + coeff * v
        coeff = coeff * 2
    return rt
示例#6
0
def do_all(turns):
    global s, TURNS, STATES, facelets, selectors

    TURNS = turns
    STATES = TURNS + 1
    facelets = None
    selectors = None

    s = Xu.Xu(False)

    alloc_facelets_and_selectors(STATES)

    # solved state:
    set_state(
        STATES - 1, {
            "F": "WWWW",
            "U": "GGGG",
            "D": "BBBB",
            "R": "OOOO",
            "L": "RRRR",
            "B": "YYYY"
        })

    # 4: rdur, 2 solutions (picosat)
    set_state(
        0, {
            "F": "RYOG",
            "U": "YRGO",
            "D": "WRBO",
            "R": "GYWB",
            "L": "BYWG",
            "B": "BOWR"
        })

    # other tests:

    # 9 or less
    #set_state(0, {"F":"OROB", "U":"GYGG", "D":"BRWO", "R":"WGYY", "L":"RWRW", "B":"OYBB"})

    # 5
    #set_state(0, {"F":"BROW", "U":"YWOB", "D":"WROY", "R":"YGBG", "L":"BWYG", "B":"RORG"})

    # 5
    #set_state(0, {"F":"RYOG", "U":"YBGO", "D":"WRBW", "R":"GOWB", "L":"RYYG", "B":"WBRO"})

    # 1 (RCW)
    #set_state(0, {"F":"WGWG", "U":"GYGY", "D":"BWBW", "R":"OOOO", "L":"RRRR", "B":"BYBY"})

    # 9 or less
    #set_state(0, {"F":"ROWB", "U":"RYYB", "D":"RYWG", "R":"WGOR", "L":"WBOG", "B":"OBYG"})

    # 6, 2 solutions (picosat)...
    #set_state(0, {"F":"RBGW", "U":"YRGW", "D":"YGWB", "R":"OBRO", "L":"RYOO", "B":"WBYG"})

    # 4, 1 solution (picosat)!
    #set_state(0, {"F":"GGYB", "U":"GRRY", "D":"RWBO", "R":"OGRY", "L":"OWOB", "B":"YWBW"})

    # 6, 6 solutions (picosat)
    #set_state(0, {"F":"GRRB", "U":"YYWY", "D":"WOBW", "R":"GGWR", "L":"BORB", "B":"OOGY"})

    # 6, 3 solutions (picosat)
    #set_state(0, {"F":"RWBG", "U":"BWYR", "D":"WYYO", "R":"GORG", "L":"RBOO", "B":"GWYB"})

    # 3 or less
    #set_state(0, {"F":"RORW", "U":"BRBB", "D":"GOOR", "R":"WYGY", "L":"OWYW", "B":"BYGG"})

    # 4
    #set_state(0, {"F":"RBRO", "U":"WGWY", "D":"YWOB", "R":"RWBO", "L":"BGYG", "B":"ORYG"})

    # 8
    #set_state(0, {"F":"GBOO", "U":"BBRO", "D":"BYGY", "R":"YWGG", "L":"YWWW", "B":"RRRO"})

    # 8
    #set_state(0, {"F":"BGBO", "U":"GWYR", "D":"YGYO", "R":"YRWB", "L":"WOGR", "B":"BRWO"})

    # 3 or less
    #set_state(0, {"F":"GRBG", "U":"BYOG", "D":"WYOY", "R":"WORR", "L":"RYGO", "B":"BWBW"})

    # 7
    #set_state(0, {"F":"BBWY", "U":"OGOR", "D":"ROYY", "R":"WYBO", "L":"WWBG", "B":"RGGR"})

    # 8
    #set_state(0, {"F":"YRRO", "U":"WWBY", "D":"WYWB", "R":"GBGO", "L":"RROB", "B":"OGYG"})

    # 3 or less (stuck)
    # set_state(0, {"F":"OWBB", "U":"RYBG", "D":"RORG", "R":"ORWY", "L":"BYWW", "B":"GYOG"})

    # 9 or less
    # set_state(0, {"F":"GGRW", "U":"BBYO", "D":"GRBO", "R":"WYBG", "L":"WRRW", "B":"OOYY"})

    # 8 or less
    #set_state(0, {"F":"WBRG", "U":"RGBR", "D":"GORB", "R":"WWYO", "L":"YOYW", "B":"OGYB"})

    # 8
    #set_state(0, {"F":"GOWW", "U":"RYRG", "D":"GRBY", "R":"YOBG", "L":"BWOO", "B":"BYRW"})

    # FCW, RCW
    #set_state(0, {"F":"WOWB", "U":"GWRW", "D":"OYBY", "R":"GGOO", "L":"RBRB", "B":"RYGY"})

    # 9
    #set_state(0, {"F":"YOWY", "U":"OGGY", "D":"OBGR", "R":"BRRW", "L":"WOYB", "B":"WGBR"})

    # 1 F
    #set_state(0, {"F":"WWWW", "U":"GGRR", "D":"OOBB", "R":"GOGO", "L":"RBRB", "B":"YYYY"})

    # 2 BCW / FCCW
    #set_state(0, {"F":"WWWW", "U":"RRRR", "D":"OOOO", "R":"GGGG", "L":"BBBB", "B":"YYYY"})

    # 4 RDUR, but backwards: RCCW UCCW DCCW RCCW
    #set_state(0, {"F":"OBRY", "U":"GOWR", "D":"BOYR", "R":"WGBY", "L":"WBGY", "B":"WRGO"})

    # 2, UCCW / DCW
    #set_state(0, {"F":"OOOO", "U":"GGGG", "D":"BBBB", "R":"YYYY", "L":"WWWW", "B":"RRRR"})

    # 2, RCCW / LCW
    #set_state(0, {"F":"BBBB", "U":"WWWW", "D":"YYYY", "R":"OOOO", "L":"RRRR", "B":"GGGG"})

    # 1, UCCW
    #set_state(0, {"F":"OOWW", "U":"GGGG", "D":"BBBB", "R":"YYOO", "L":"WWRR", "B":"RRYY"})

    # 1, UCW
    #set_state(0, {"F":"RRWW", "U":"GGGG", "D":"BBBB", "R":"WWOO", "L":"YYRR", "B":"OOYY"})

    # 1, RCCW
    #set_state(0, {"F":"WBWB", "U":"GWGW", "D":"BYBY", "R":"OOOO", "L":"RRRR", "B":"GYGY"})

    # 1, RCW
    #set_state(0, {"F":"WGWG", "U":"GYGY", "D":"BWBW", "R":"OOOO", "L":"RRRR", "B":"BYBY"})

    # 1, DCCW
    #set_state(0, {"F":"WWRR", "U":"GGGG", "D":"BBBB", "R":"OOWW", "L":"RRYY", "B":"YYOO"})

    # 1. DCW
    #set_state(0, {"F":"WWOO", "U":"GGGG", "D":"BBBB", "R":"OOYY", "L":"RRWW", "B":"YYRR"})

    # 1 LCCW
    #set_state(0, {"F":"GWGW", "U":"YGYG", "D":"WBWB", "R":"OOOO", "L":"RRRR", "B":"YBYB"})

    # 1 LCW
    #set_state(0, {"F":"BWBW", "U":"WGWG", "D":"YBYB", "R":"OOOO", "L":"RRRR", "B":"YGYG"})

    # 1 FCCW
    #set_state(0, {"F":"WWWW", "U":"GGRR", "D":"OOBB", "R":"GOGO", "L":"RBRB", "B":"YYYY"})

    # 1. FCW
    #set_state(0, {"F":"WWWW", "U":"GGOO", "D":"RRBB", "R":"BOBO", "L":"RGRG", "B":"YYYY"})

    # 1 BCCW
    #set_state(0, {"F":"WWWW", "U":"OOGG", "D":"BBRR", "R":"OBOB", "L":"GRGR", "B":"YYYY"})

    # 1. BCW
    #set_state(0, {"F":"WWWW", "U":"RRGG", "D":"BBOO", "R":"OGOG", "L":"BRBR", "B":"YYYY"})

    # 3 or less. right top corner rotated CW, left top rotated CCW
    #set_state(0, {"F":"ROWW", "U":"GGWW", "D":"BBBB", "R":"GOOO", "L":"RGRR", "B":"YYYY"})

    # 8
    #set_state(0, {"F":"RWWY", "U":"YOWB", "D":"OOOR", "R":"RYBY", "L":"RGGB", "B":"GBGW"})

    #      dst,  FCW  FH   FCCW UCW  UH   UCCW DCW  DH   DCCW RCW  RH   RCCW LCW  LH   LCCW BCW  BH   BCCW
    add_r("F1", [
        "F3", "F4", "F2", "R1", "B1", "L1", "F1", "F1", "F1", "F1", "F1", "F1",
        "U1", "B4", "D1", "F1", "F1", "F1"
    ])
    add_r("F2", [
        "F1", "F3", "F4", "R2", "B2", "L2", "F2", "F2", "F2", "D2", "B3", "U2",
        "F2", "F2", "F2", "F2", "F2", "F2"
    ])
    add_r("F3", [
        "F4", "F2", "F1", "F3", "F3", "F3", "L3", "B3", "R3", "F3", "F3", "F3",
        "U3", "B2", "D3", "F3", "F3", "F3"
    ])
    add_r("F4", [
        "F2", "F1", "F3", "F4", "F4", "F4", "L4", "B4", "R4", "D4", "B1", "U4",
        "F4", "F4", "F4", "F4", "F4", "F4"
    ])
    add_r("U1", [
        "U1", "U1", "U1", "U3", "U4", "U2", "U1", "U1", "U1", "U1", "U1", "U1",
        "B4", "D1", "F1", "R2", "D4", "L3"
    ])
    add_r("U2", [
        "U2", "U2", "U2", "U1", "U3", "U4", "U2", "U2", "U2", "F2", "D2", "B3",
        "U2", "U2", "U2", "R4", "D3", "L1"
    ])
    add_r("U3", [
        "L4", "D2", "R1", "U4", "U2", "U1", "U3", "U3", "U3", "U3", "U3", "U3",
        "B2", "D3", "F3", "U3", "U3", "U3"
    ])
    add_r("U4", [
        "L2", "D1", "R3", "U2", "U1", "U3", "U4", "U4", "U4", "F4", "D4", "B1",
        "U4", "U4", "U4", "U4", "U4", "U4"
    ])
    add_r("D1", [
        "R3", "U4", "L2", "D1", "D1", "D1", "D3", "D4", "D2", "D1", "D1", "D1",
        "F1", "U1", "B4", "D1", "D1", "D1"
    ])
    add_r("D2", [
        "R1", "U3", "L4", "D2", "D2", "D2", "D1", "D3", "D4", "B3", "U2", "F2",
        "D2", "D2", "D2", "D2", "D2", "D2"
    ])
    add_r("D3", [
        "D3", "D3", "D3", "D3", "D3", "D3", "D4", "D2", "D1", "D3", "D3", "D3",
        "F3", "U3", "B2", "L1", "U2", "R4"
    ])
    add_r("D4", [
        "D4", "D4", "D4", "D4", "D4", "D4", "D2", "D1", "D3", "B1", "U4", "F4",
        "D4", "D4", "D4", "L3", "U1", "R2"
    ])
    add_r("R1", [
        "U3", "L4", "D2", "B1", "L1", "F1", "R1", "R1", "R1", "R3", "R4", "R2",
        "R1", "R1", "R1", "R1", "R1", "R1"
    ])
    add_r("R2", [
        "R2", "R2", "R2", "B2", "L2", "F2", "R2", "R2", "R2", "R1", "R3", "R4",
        "R2", "R2", "R2", "D4", "L3", "U1"
    ])
    add_r("R3", [
        "U4", "L2", "D1", "R3", "R3", "R3", "F3", "L3", "B3", "R4", "R2", "R1",
        "R3", "R3", "R3", "R3", "R3", "R3"
    ])
    add_r("R4", [
        "R4", "R4", "R4", "R4", "R4", "R4", "F4", "L4", "B4", "R2", "R1", "R3",
        "R4", "R4", "R4", "D3", "L1", "U2"
    ])
    add_r("L1", [
        "L1", "L1", "L1", "F1", "R1", "B1", "L1", "L1", "L1", "L1", "L1", "L1",
        "L3", "L4", "L2", "U2", "R4", "D3"
    ])
    add_r("L2", [
        "D1", "R3", "U4", "F2", "R2", "B2", "L2", "L2", "L2", "L2", "L2", "L2",
        "L1", "L3", "L4", "L2", "L2", "L2"
    ])
    add_r("L3", [
        "L3", "L3", "L3", "L3", "L3", "L3", "B3", "R3", "F3", "L3", "L3", "L3",
        "L4", "L2", "L1", "U1", "R2", "D4"
    ])
    add_r("L4", [
        "D2", "R1", "U3", "L4", "L4", "L4", "B4", "R4", "F4", "L4", "L4", "L4",
        "L2", "L1", "L3", "L4", "L4", "L4"
    ])
    add_r("B1", [
        "B1", "B1", "B1", "L1", "F1", "R1", "B1", "B1", "B1", "U4", "F4", "D4",
        "B1", "B1", "B1", "B3", "B4", "B2"
    ])
    add_r("B2", [
        "B2", "B2", "B2", "L2", "F2", "R2", "B2", "B2", "B2", "B2", "B2", "B2",
        "D3", "F3", "U3", "B1", "B3", "B4"
    ])
    add_r("B3", [
        "B3", "B3", "B3", "B3", "B3", "B3", "R3", "F3", "L3", "U2", "F2", "D2",
        "B3", "B3", "B3", "B4", "B2", "B1"
    ])
    add_r("B4", [
        "B4", "B4", "B4", "B4", "B4", "B4", "R4", "F4", "L4", "B4", "B4", "B4",
        "D1", "F1", "U1", "B2", "B1", "B3"
    ])

    if s.solve() == False:
        print "unsat!"
        exit(0)

    turn_name = [
        "FCW", "FH", "FCCW", "UCW", "UH", "UCCW", "DCW", "DH", "DCCW", "RCW",
        "RH", "RCCW", "LCW", "LH", "LCCW", "BCW", "BH", "BCCW"
    ]

    print "sat!"
    for turn in selectors:
        # 'turn' is array of 5 variables
        # convert each variable to "1" or "0" string and create 5-digit string:
        rt = "".join([str(s.get_var_from_solution(bit)) for bit in turn])
        # reverse string, convert it to integer and use it as index for array to get a move name:
        print turn_name[int(frolic.rvr(rt), 2)]

    print ""