Last active
June 16, 2018 09:57
-
-
Save LiquidFenrir/7683c6d1061b1b9494de74ff505b4d24 to your computer and use it in GitHub Desktop.
https://www.reddit.com/r/dailyprogrammer/comments/8rcjx0/20180615_challenge_363_hard_anagram_slices/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# https://www.reddit.com/r/dailyprogrammer/comments/8rcjx0/20180615_challenge_363_hard_anagram_slices/ | |
words_length = 4 | |
def get_letter_count(word): | |
letters = {chr(letter): 0 for letter in range(ord('a'), ord('z')+1)} | |
for letter in word: | |
letters[letter] += 1 | |
out = [] | |
for letter in range(ord('a'), ord('z')+1): | |
out.append(f"{chr(letter)}{letters[chr(letter)]},") | |
return "".join(out)[:-1] | |
def get_letters_from_count(letters): | |
inputs = {split[0]: int(split[1:]) for split in letters.split(",")} | |
out = [] | |
for charcode in range(ord('a'), ord('z')+1): | |
letter = chr(charcode) | |
for i in range(inputs[letter]): | |
out.append(letter) | |
return out | |
def swap(list, index): | |
tmp = list[index] | |
list[index] = list[index+1] | |
list[index+1] = tmp | |
def do_pass(word_list): | |
superposed = [] | |
for i in range(0, len(word_list)-1, 2): | |
wordA = "".join(get_letters_from_count(word_list[i])) | |
wordB = "".join(get_letters_from_count(word_list[i+1])) | |
cnt = 0 | |
for j in range(words_length): | |
if wordA[j] == wordB[j]: | |
cnt += 1 | |
else: | |
break | |
catword = wordA[cnt:] + wordB | |
print(i, cnt, catword) | |
superposed.append(catword) | |
superposed.append("".join(get_letters_from_count(word_list[-1]))) # append the last word since the "clean" input list is 899 long, the last word wouldn't get handled in the loop above | |
return superposed | |
def anagram_slices(inputs): | |
word_set = set() # To not get words that are already anagrams in the inputs list | |
for word in inputs: | |
count = get_letter_count(word) | |
word_set.add(count) | |
word_list = list(word_set) # So it's ordered -> output is consistent | |
word_list.sort(reverse=True) # Get words starting with A first | |
superposed = do_pass(word_list) | |
print(len(superposed)) | |
out = "".join(superposed) | |
return out | |
def verify_result(result, inputs): | |
# TODO | |
return True | |
def main(): | |
with open("anagram_slices_in.txt", "rt") as input_file: | |
inputs = [line.strip("\n") for line in input_file] | |
result = anagram_slices(inputs) | |
if verify_result(result, inputs): | |
with open("anagram_slices_out.txt", "wt") as output_file: | |
output_file.write(result) | |
if __name__=="__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment