alfabe = 'abcdefghijklmnopqrstuvwxyz'

def edits1_meta(word):
    split = [(word[:i], word[i:]) for i in range(len(word) + 1)]
    
    deletes = [(a + b[1:], ('delete', a[-1] if len(a)>0 else '@', b[0])) 
               for a, b in split if b]

    transposes = [(a + b[1] + b[0] + b[2:], ('transpose', b[0], b[1])) 
                  for a, b in split if len(b) > 1]
   

    yeridegisenler = [(a + c + b[1:], ('replace', b[0], c)) 
                for a, b in split for c in alfabe if b]
    

    inserts = [ (a + c + b, ('insert', a[-1] if len(a)>0 else '@', c)) 
               for a, b in split for c in alfabe] 

    return set(deletes + transposes + yeridegisenler + inserts)




def edits2_meta(word):
	raise NotImplementedError#tum olasi keleiemelri icericek mesafe 2



def permut(q):
	if len(q)<=1:
		yield q
	else:
		for perm in permut(q[1:]):
			for y in range(len(perm)+1):
				yield perm[:y] + q[0:1] + perm[y:]


list(permut(["beraber", "kazandi", "hep"]))



"""[['beraber', 'kazandi', 'hep'],
 ['kazandi', 'beraber', 'hep'],
 ['kazandi', 'hep', 'beraber'],
 ['beraber', 'hep', 'kazandi'],
 ['hep', 'beraber', 'kazandi'],
 ['hep', 'kazandi', 'beraber']]

"""




def edits1(word):
    split = [(word[:i], word[i:]) for i in range(len(word) + 1)]
    
    deletes = [a + b[1:] for a, b in split if b]
    
    transposes = [a + b[1] + b[0] + b[2:] for a, b in split if len(b) > 1]
    
    yeridegisenler = [a + c + b[1:] for a, b in split for c in alfabe]
    
    inserts = [a + c + b for a, b in split for c in alfabe]
    
    return set(deletes + transposes + yeridegisenler + inserts)

def edits2(word):

    return set(e2 for e1 in edits1(word) for e2 in edits1(e1))

def edits_meta(n, word):

    if n < 1:
        raise AttributeError('n >= 1')
    if n == 1:
        return edits1_meta(word)
    else:
        return set(e2 for e1 in edits_meta(n-1, word) for e2 in edits_meta(n-1, e1[0]))













def edits(n, word):

    if n < 1:
        raise AttributeError('n >= 1')
    if n == 1:
        return edits1(word)
    else:
        return set(e2 for e1 in edits(n-1, word) for e2 in edits(n-1, e1))