Я хочу, чтобы Perl (5.8.8) определял, какое слово имеет больше всего общих букв с другими словами в массиве, но только те буквы, которые находятся в одном и том же месте. (И желательно без использования libs.)
Возьмите этот список слов в качестве примера:
- ПЕКАРЬ
- ПРОДАВЕЦ
- БАЛЕР
- СПЕЦИАЛИСТ
- РУФФР
Ее БАЛЕР — это слово, которое имеет больше всего общих букв с другими. Он соответствует BAxER в BAKER, xALER в SALER, xAxER в CARER и xxxxR в RUFFR.
Я хочу, чтобы 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.
На самом деле вы получите матрицу для каждого слова с оценкой для каждой позиции буквы и суммой общей оценки для каждого слова в матрице.
Цель программы
Хе-хе, я мог бы также сказать: программа предназначена для взлома терминалов в игре Fallout 3. :D Я думаю, что это отличный способ выучить Perl, одновременно получая удовольствие от игры.
Вот одно из руководств по взлому терминала Fallout 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
, как и в FAQ по игре. Однако трюк с исходным вопросом (и то, что мне не удалось выяснить самостоятельно) заключается в том, как найти лучшее слово, чтобы попробовать в первую очередь, то есть APPRECIATION
.
Хорошо, теперь я предложил собственное решение, основанное на вашей помощи, и считаю эту тему закрытой. Большое-большое спасибо всем участникам. Вы очень помогли, и по пути я многому научился. :D
prolog
задача, применимая к perl. - person Patrick J. S.   schedule 05.10.2014