✨ Finishing Moria gates
This commit is contained in:
parent
f5059f11d1
commit
10190b0d23
80
Storage/gate-puzzles.py
Normal file
80
Storage/gate-puzzles.py
Normal file
@ -0,0 +1,80 @@
|
||||
def calculate_simil(word1: str, word2: str):
|
||||
score = 0
|
||||
if word1[0] == word2[0]:
|
||||
score += 10
|
||||
if word1[-1] == word2[-1]:
|
||||
score += 10
|
||||
length_of_word1 = len(word1)
|
||||
length_of_word2 = len(word2)
|
||||
score += (length_of_word1 / length_of_word2) * 30 \
|
||||
if (length_of_word1 <= length_of_word2) \
|
||||
else (length_of_word2 / length_of_word1) * 30
|
||||
uniques = ''.join(set(word1 + word2))
|
||||
commons = ''.join(set(word1).intersection(word2))
|
||||
score += (len(commons) / len(uniques)) * 50
|
||||
|
||||
return score
|
||||
|
||||
|
||||
def get_max_score_in_words_list(lists):
|
||||
current_max = 0
|
||||
for score in lists.values():
|
||||
current_max = max([current_max, score])
|
||||
|
||||
maxes = []
|
||||
for word, score in lists.items():
|
||||
if score == current_max:
|
||||
maxes.append(word)
|
||||
|
||||
return maxes
|
||||
|
||||
|
||||
def calculate_scores(words):
|
||||
scores = {}
|
||||
for word in words:
|
||||
scores[word] = []
|
||||
i = 0
|
||||
for word1 in words:
|
||||
j = 0
|
||||
for word2 in words:
|
||||
if i == j:
|
||||
continue
|
||||
score = calculate_simil(word1, word2)
|
||||
scores[word1].append(score)
|
||||
scores[word2].append(score)
|
||||
j += 1
|
||||
i += 1
|
||||
|
||||
return scores
|
||||
|
||||
|
||||
def calculate_average(scores):
|
||||
avgs = {}
|
||||
for word, score in scores.items():
|
||||
avgs[word] = sum(score) / len(score)
|
||||
return avgs
|
||||
|
||||
|
||||
def find_word(message):
|
||||
words = "".join((char.lower() if char.isalpha() else " ") for char in message).split()
|
||||
scores = calculate_scores(words)
|
||||
avgs = calculate_average(scores)
|
||||
max_words = get_max_score_in_words_list(avgs)
|
||||
|
||||
if len(max_words) == 1:
|
||||
return max_words[0]
|
||||
|
||||
for word in reversed(words):
|
||||
if word in max_words:
|
||||
return word
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# These "asserts" using only for self-checking and not necessary for auto-testing
|
||||
assert find_word("Speak friend and enter.") == "friend", "Friend"
|
||||
assert find_word("Beard and Bread") == "bread", "Bread is Beard"
|
||||
assert find_word("The Doors of Durin, Lord of Moria. Speak friend and enter. "
|
||||
"I Narvi made them. Celebrimbor of Hollin drew these signs") == "durin", "Durin"
|
||||
assert find_word("Aoccdrnig to a rscheearch at Cmabrigde Uinervtisy."
|
||||
" According to a researcher at Cambridge University.") == "according", "Research"
|
||||
assert find_word("One, two, two, three, three, three.") == "three", "Repeating"
|
Loading…
Reference in New Issue
Block a user