【发布时间】:2011-10-02 03:07:33
【问题描述】:
我希望 Perl (5.8.8) 找出与数组中的其他单词有最多共同字母的单词 - 但只有在同一位置的字母。 (最好不使用库。)
以这个单词列表为例:
- 贝克
- 销售员
- 打包机
- 照顾者
- RUFFR
她的 BALER 是与其他单词有最多共同字母的单词。它与 BAKER 中的 BAxER、SALER 中的 xALER、CARER 中的 xAxER 和 RUFFR 中的 xxxxR 匹配。
我希望 Perl 在具有相同长度和大小写的任意单词列表中为我找到这个单词。看来我在这里碰壁了,非常感谢您的帮助!
我到现在为止的尝试
目前并没有太多的脚本:
use strict;
use warnings;
my @wordlist = qw(BAKER SALER MALER BARER RUFFR);
foreach my $word (@wordlist) {
my @letters = split(//, $word);
# now trip trough each iteration and work magic...
}
注释在哪里,我尝试了几种代码,其中包含大量的 for 循环和 ++ 变量。到目前为止,我的任何尝试都没有完成我需要它做的事情。
所以,为了更好地解释:我需要的是逐字逐句地测试列表中的每个字母位置,以找到与列表中其他字母最多的单词,在该字母的位置。
一种可能的方法是首先检查哪些单词在字母位置 0 处最常见,然后测试字母位置 1,依此类推,直到找到总和具有最多字母的单词与列表中的其他词相同。然后我想像一个矩阵一样打印列表,每个字母位置的分数加上每个单词的总分,与 DavidO 的建议不同。
你最终得到的是每个单词的矩阵,每个字母位置的分数,以及矩阵中每个单词的总分。
计划的目的
嘿嘿,我还是这么说吧:这个程序是用来破解《辐射 3》游戏中的终端的。:D 我的想法是,这是学习 Perl 的好方法,同时还能玩得开心。
这是我用于研究的辐射 3 终端黑客教程之一:FALLOUT 3: Hacking FAQ v1.2,我已经制作了一个程序来缩短单词列表,如下所示:
#!/usr/bin/perl
# See if one word has equal letters as the other, and how many of them are equal
use strict;
use warnings;
my $checkword = "APPRECIATION"; # the word to be checked
my $match = 4; # equal to the match you got from testing your checkword
my @checkletters = split(//, $checkword); #/
my @wordlist = qw(
PARTNERSHIPS
REPRIMANDING
CIVILIZATION
APPRECIATION
CONVERSATION
CIRCUMSTANCE
PURIFICATION
SECLUSIONIST
CONSTRUCTION
DISAPPEARING
TRANSMISSION
APPREHENSIVE
ENCOUNTERING
);
print "$checkword has $match letters in common with:\n";
foreach my $word (@wordlist) {
next if $word eq $checkword;
my @letters = split(//, $word);
my $length = @letters; # determine length of array (how many letters to check)
my $eq_letters = 0; # reset to 0 for every new word to be tested
for (my $i = 0; $i < $length; $i++) {
if ($letters[$i] eq $checkletters[$i]) {
$eq_letters++;
}
}
if ($eq_letters == $match) {
print "$word\n";
}
}
# Now to make a script on to find the best word to check in the first place...
该脚本将产生CONSTRUCTION 和TRANSMISSION 作为其结果,就像在游戏常见问题解答中一样。不过,原始问题的诀窍(以及我自己没能找到的东西)是如何找到最好的词来尝试,即APPRECIATION。
好的,我现在已经根据您的帮助提供了自己的解决方案,并认为此线程已关闭。非常感谢所有的贡献者。你帮了很大的忙,在这个过程中我也学到了很多东西。 :D
【问题讨论】:
-
你能把你的剧本给我们看一下吗,我们还有事要忙吗?
-
可能,解决这个问题的最简单方法是计算单词之间的Hamming Distance。但是我想知道它是否只能比较两个和两个单词...
-
我查看了黑客常见问题解答,这对我来说似乎是一个
prolog任务,适用于 perl thoug。