aboutsummaryrefslogtreecommitdiff
path: root/challenge-216/sgreen/python/ch-2.py
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-216/sgreen/python/ch-2.py')
-rwxr-xr-xchallenge-216/sgreen/python/ch-2.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/challenge-216/sgreen/python/ch-2.py b/challenge-216/sgreen/python/ch-2.py
new file mode 100755
index 0000000000..62544df0a8
--- /dev/null
+++ b/challenge-216/sgreen/python/ch-2.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+
+import itertools
+import math
+import sys
+
+
+def get_frequency(word):
+ freq = {}
+ for letter in word:
+ if 'a' <= letter <= 'z':
+ freq[letter] = freq.get(letter, 0) + 1
+
+ return freq
+
+
+def main(words):
+ # The last value is the word we are matching
+ target_word = words.pop()
+ target_freq = get_frequency(target_word)
+
+ # Lets check that a solution is possible
+ combined = ''.join(words)
+ for letter in target_freq:
+ if letter not in combined:
+ # The letter doesn't exist in the words, so no solution is possible
+ print(0)
+ return
+
+ # What is the highest frequency
+ highest = max(target_freq.values())
+ word_count = len(words)
+ min_stickers = math.inf
+
+ for freq in itertools.product(range(highest+1), repeat=word_count):
+ if sum(freq) >= min_stickers:
+ # This solution won't be better, so skip it
+ continue
+
+ # Combine all the words with the defined frequency
+ sticker_letters = ''.join([words[x] * freq[x]
+ for x in range(word_count)])
+ sticker_freq = get_frequency(sticker_letters)
+
+ for letter in target_freq:
+ if letter not in sticker_freq or sticker_freq[letter] < target_freq[letter]:
+ # Either a letter is missing, or doesn't occur enough times
+ break
+ else:
+ # We have a new solution with fewer letters
+ min_stickers = sum(freq)
+
+ print(min_stickers)
+
+
+if __name__ == '__main__':
+ main(sys.argv[1:])