Skip to content

Instantly share code, notes, and snippets.

@LiquidFenrir
Last active June 16, 2018 09:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LiquidFenrir/7683c6d1061b1b9494de74ff505b4d24 to your computer and use it in GitHub Desktop.
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/
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