@@ -0,0 +1,1815 @@
+%0Aold_passkey = 'hxbxwxba'%0A%0Adef increment_char(char):%0A    if char == 'z':%0A        return 'a'%0A    else:%0A        return chr(ord(char)+1)%0A%0Adef increment_passkey(passkey):%0A    code_points = list(passkey)%0A    new_code_points = code_points%0A    first_char_ix = -len(code_points)-1%0A    for i in xrange(-1, first_char_ix, -1):%0A        if code_points%5Bi%5D != 'z':%0A            new_code_points%5Bi%5D = increment_char(code_points%5Bi%5D)%0A            break%0A        else:%0A            new_code_points%5Bi%5D = increment_char(code_points%5Bi%5D)%0A    return new_code_points%0A%0Adef has_alpha_straight(s):%0A    for i in xrange(len(s)):%0A        actual = s%5Bi:i+3%5D%0A        expected = s%5Bi%5D+increment_char(s%5Bi%5D)+increment_char(increment_char(s%5Bi%5D))%0A        if actual == expected:%0A            return True%0A    return False%0A%0Adef contains_invalid_chars(s):%0A    if s.count('o') %3E 0 or s.count('i') %3E 0 or s.count('l') %3E 0:%0A        return True%0A    return False%0A%0A%0Adef contains_overlapping_sets(s):%0A    used_chars = %5B%5D%0A    for i,c in enumerate(s):%0A        if i+1 %3C len(s):%0A            if (s%5Bi+1%5D not in used_chars and c == s%5Bi+1%5D):%0A                used_chars.append(c)%0A    if len(used_chars) %3E 1:%0A        return True%0A    else:%0A        return False%0A%0A%0A%0Adef find_new_passkey(passkey):%0A    %22%22%22%0A    Keep incrementing the passkey until:%0A        * There's at least 3+ letters in an alphabetic sequence (e.g. 'abc')%0A        * Does not contain the letters 'i', 'o', or 'l'%0A        * Must contain two non-overlapping pairs of letters (e.g. 'aa' and 'bb', but not 'aa' and 'aa')%0A    %22%22%22%0A    conds = has_alpha_straight(passkey) and %5C%0A            not contains_invalid_chars(passkey) and %5C%0A            contains_overlapping_sets(passkey)%0A    while not conds:%0A        passkey = increment_passkey(passkey)%0A        print(passkey)%0A    return passkey%0A%0Aprint(find_new_passkey(old_passkey))%0A

Add laptop soln for #11