每周挑战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