字母频率
#python #perl #theweeklychallenge

每周挑战216

abaoqian1,My solutions

任务1:注册号

任务

您有一个单词列表和一个随机注册号。

写一个脚本以查找给定注册号中每个字母的给定列表中的所有单词。

我的解决方案

本周的两项任务都涉及字母的频率。我有一个函数get_frequency,它可以单词,并返回每个字母频率的dict(hash)。例如,使用apple的输入,它将返回{'a': 1, 'p': 2, 'l': 1, 'e': 1}

我要做的第一件事是从输入(是车牌)中删除最后一项,然后将其存储为plate。每个字母的频率存储为plate_freq。我还定义了一个名为solution的空列表(perl中的数组),该列表将存储任何符合条件的单词。

i循环遍历每个单词,将频率存储在dict word_freq中。然后,我有一个内部循环,可以检查板中字母的频率是否包含在word_freq中。如果那是通过的,那么我添加到solution列表中。

最后,我在solution list中打印项目。

例子

$ ./ch-1.py abc abcd bcd 'AB1 2CD'
abcd

$ ./ch-1.py job james bjorg '007 JB'
job, bjorg

$ ./ch-1.py crack road rac 'C7 RA2'
crack, rac

任务2:单词贴纸

任务

您有一个单词贴纸和目标单词的列表。

编写一个脚本以找出构成给定目标词需要多少个单词贴纸。

我的解决方案

此任务与前一个任务非常相似,除了我不知道我们需要从哪个贴纸开始。我提出的解决方案可能不是最有效的,但确实有效。

我通过从输入(是目标单词)中删除最后一项并将其存储为target_word来开始此任务。每个字母的频率存储为target_freq

接下来的事情是我检查target_freq dict中的每个字母至少是其他单词之一。如果是这样,则无法解决,我打印“ 0”并返回。

我找到了看上去最多的字母。这是通过从target_freq dict中找到最高值并将其存储为highest来完成的。这意味着在最坏的情况下,我们需要使用每个贴纸来找到解决方案。

我采取的下一步是循环浏览每个单词的所有组合到highest。值得庆幸的是,Python的Itertools具有product函数,而Perl的算法:: Combinatorics具有variations_with_repetition函数,可以轻松执行此操作。

对于每次迭代,我首先检查单词频率的总和不等于或高于当前的min_stickers值。在可能的解决方案上花费CPU循环的情况没有任何意义。

然后,迭代计算我们要使用的贴纸中所有字母的频率。它检查了target_freq中字母的频率是否在当前选择的贴纸中多次出现。如果是的话,我将min_stickers设置为使用的贴纸数量。

最后,我显示了使用的贴纸数量。

例子

$ ./ch-2.py perl raku python peon
2

$ ./ch-2.py love hate angry goat
3

$ ./ch-2.py come nation delta accommodation
4

$ ./ch-2.py come country delta accommodation
0