Skip to main content
deleted 163 characters in body
Source Link
Emanuele Paolini
  • 2.2k
  • 1
  • 14
  • 14

This seems a shorter solution:

def findMove(original,result):
    n =if len(original)
    if n != len(result):
        return # different length                                               

    # find common head
    i=0
    while i<n and original[i] == result[i]:
  diff = [x for x,(c,d) in ienumerate(zip(original,result)) +=if 1c!=d]
    if i==nnot diff:
        return # equal strings                                                  

    # find common tail
    j=n-1
    while original[j] == result[j]:
        i,j -= 1

    # two possibilities: i->j or jdiff[0],diff[->i1]

    if original[i+1:j+1] == result[i:j] and original[i] == result[j]:
        return (i,j)
    if original[i:j] == result[i+1:j+1] and original[j] == result[i]:
        return (j,i)

PS: this works also if the items are non unique.

This seems a shorter solution:

def findMove(original,result):
    n = len(original)
    if n != len(result):
        return # different length                                               

    # find common head
    i=0
    while i<n and original[i] == result[i]:
        i += 1
    if i==n:
        return # equal strings                                                  

    # find common tail
    j=n-1
    while original[j] == result[j]:
        j -= 1

    # two possibilities: i->j or j->i
    if original[i+1:j+1] == result[i:j] and original[i] == result[j]:
        return (i,j)
    if original[i:j] == result[i+1:j+1] and original[j] == result[i]:
        return (j,i)

This seems a shorter solution:

def findMove(original,result):
    if len(original) != len(result):
        return # different length                                               

    diff = [x for x,(c,d) in enumerate(zip(original,result)) if c!=d]
    if not diff:
        return # equal strings                                                  
    i,j = diff[0],diff[-1]

    if original[i+1:j+1] == result[i:j] and original[i] == result[j]:
        return (i,j)
    if original[i:j] == result[i+1:j+1] and original[j] == result[i]:
        return (j,i)

PS: this works also if the items are non unique.

Post Undeleted by Emanuele Paolini
Post Undeleted by Emanuele Paolini
Post Deleted by Emanuele Paolini
Post Deleted by Emanuele Paolini
Source Link
Emanuele Paolini
  • 2.2k
  • 1
  • 14
  • 14

This seems a shorter solution:

def findMove(original,result):
    n = len(original)
    if n != len(result):
        return # different length                                               

    # find common head
    i=0
    while i<n and original[i] == result[i]:
        i += 1
    if i==n:
        return # equal strings                                                  

    # find common tail
    j=n-1
    while original[j] == result[j]:
        j -= 1

    # two possibilities: i->j or j->i
    if original[i+1:j+1] == result[i:j] and original[i] == result[j]:
        return (i,j)
    if original[i:j] == result[i+1:j+1] and original[j] == result[i]:
        return (j,i)