Search code examples
pythonpython-2.7puzzlesliding-tile-puzzle

Finding unique solution puzzle python


x = np.array([[0,1,11],[0,2,11],[0,3,10],[0,4,10],[0,5,9],[0,6,9],[1,7,9],
              [1,5,11],[1,6,11],[2,7,11],[2,8,10]])

I'm pretty new to this so i'm gonna call things like this [element1,element2,element3]

i have an array as shown above, and i want to find a solution to this array. It should satisfy the following conditions:

The first element 0:

it should have atleast one solution from [0,1,11],[0,2,11],[0,3,10],[0,4,10],[0,5,9],[0,6,9]

The first element 1:

this : [1,7,9],[1,5,11],[1,6,11]

The first element 2:

and this : [2,7,11],[2,8,10]

Such that the second element and 3rd element is unique for each solution(where 1st element=0,second element=1 and 3rd element=2)

o/p can be : [0,1,11] and [1,7,9] and [2,8,10]

wrong output : [0,1,11], [1,6,11] ,[2,8,10] here parameter 3 of the first and the second are same.


Solution

  • If I understand correctly, you want to produce triplets from the given x array so that the first, second and third element are all unique in one triplet. Code to do that:

    import itertools
    
    x = [[0,1,11],[0,2,11],[0,3,10],[0,4,10],[0,5,9],[0,6,9],[1,7,9],
                  [1,5,11],[1,6,11],[2,7,11],[2,8,10]]
    triplets = itertools.combinations(x,3)
    for t in triplets:
      isGood = True
      for pos in range(3):
        if (t[0][pos] == t[1][pos] or t[0][pos] == t[2][pos] or t[1][pos] == t[2][pos]):
          isGood = False
      if (isGood):
        print(repr(t))
    

    This procudes the following output:

    ([0, 1, 11], [1, 7, 9], [2, 8, 10])
    ([0, 2, 11], [1, 7, 9], [2, 8, 10])
    ([0, 5, 9], [1, 6, 11], [2, 8, 10])
    ([0, 6, 9], [1, 5, 11], [2, 8, 10])
    

    A more pythonic solution which does the same in only 3 lines

    for t in itertools.combinations(x,3):
      if all(len(col) == len(set(col)) for col in zip(*t)):
        print(repr(t))
    

    Insane one-liner:

    print(''.join(repr(t) + '\n' for t in itertools.combinations(x,3) if all(len(col) == len(set(col)) for col in zip(*t))))