| There's an easy but expensive way to do this. I'll start with that | There's an easy but expensive way to do this. I'll start with that | ||||
| and see if I can refine it later. | and see if I can refine it later. | ||||
| """ | """ | ||||
| for i, line in enumerate(lines): | |||||
| if i + 1 != len(lines): | |||||
| for word in lines[(i+1):]: | |||||
| diffs = 0 | |||||
| idx = 0 | |||||
| for j in range(len(line)): | |||||
| if line[j] != word[j]: | |||||
| diffs += 1 | |||||
| idx = j | |||||
| if diffs == 1: | |||||
| print("Found a match: {} and {}".format(line, word)) | |||||
| print("Matched value: {}".format("".join([word[:idx],word[(idx+1):]]))) | |||||
| # Testing a new implementation (should be O(n log n)) | |||||
| # | |||||
| # lines.sort() | |||||
| # for i, line in enumerate(lines): | |||||
| # if i + 1 != len(lines): | |||||
| # word = lines[i+1] | |||||
| # diffs = 0 | |||||
| # idx = 0 | |||||
| # for j in range(len(line)): | |||||
| # if line[j] != word[j]: | |||||
| # diffs += 1 | |||||
| # idx = j | |||||
| # if diffs == 1: | |||||
| # print("Found a match: {} and {}".format(line, word)) | |||||
| # print("Matched value: {}".format("".join([word[:idx],word[(idx+1):]]))) | |||||
| # return | |||||
| # Original implementation kept for reference (O(n^2)) | |||||
| # | |||||
| for i, line in enumerate(lines): # enumerate gives us an index and the value at that index | |||||
| if i + 1 != len(lines): # don't overflow the list | |||||
| for word in lines[(i+1):]: # only check lines further down the list | |||||
| diffs = 0 # track the number of differences between lines | |||||
| idx = 0 # track the index of the most recent difference | |||||
| for j in range(len(line)): # iterate over the length of a word (they're all the same length) | |||||
| if line[j] != word[j]: # if this character in the first word is different from the same character in the second | |||||
| diffs += 1 # increment the number of differences by 1 | |||||
| idx = j # set the difference index equal to the current iteration index | |||||
| if diffs == 1: # if we only found one difference | |||||
| print("Found a match: {} and {}".format(line, word)) # print the matched words | |||||
| print("Matched value: {}".format("".join([word[:idx],word[(idx+1):]]))) # print the matching (NOT non-matching) letters | |||||
| return | return | ||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||
| lines = [] | |||||
| with open("02in.txt","r") as f: | |||||
| for line in f: | |||||
| lines.append(line.strip()) | |||||
| main(lines) | |||||
| lines = [] # an empty list for the lines in the input file | |||||
| with open("02in.txt","r") as f: # open the file. "with" means we don't have to close it | |||||
| for line in f: # iterate over the lines in the input file | |||||
| lines.append(line.strip()) # strip the newline character, then add it to the list | |||||
| main(lines) # and pass the list to our main function. |