Perl(5.8.8)に、配列内の他の単語と共通する文字が最も多い単語を見つけてもらいたいのですが、同じ場所にある文字だけです。(そして、できればライブラリを使用しないでください。)
例として、次の単語のリストを取り上げます。
- ベイカー
- サラー
- ベーラー
- 介護者
- ラフ
彼女の 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 ループと ++ 変数を多用した、いくつかの種類のコードを試しました。これまでのところ、私の試みはどれも私が必要とすることをしていません。
したがって、より適切に説明するには、文字の位置ごとにリストに対して単語ごとにテストし、その文字の位置で、リスト内の他の文字と共通する文字が最も多い単語を見つける必要があります。
考えられる方法の 1 つは、最初にどの単語が文字位置 0 で最も共通しているかを確認し、次に文字位置 1 をテストするというように、合計で共通する文字が最も多い単語が見つかるまで繰り返すことです。リスト内の他の単語。次に、DavidOが提案するものとは異なり、各文字位置のスコアと各単語の合計スコアを含むマトリックスのようにリストを印刷したいと思います。
最終的に得られるのは、各単語のマトリックス、各文字位置のスコア、およびマトリックス内の各単語の合計スコアです。
プログラムの目的
へへへ、私はそれを言うかもしれません: このプログラムは、ゲーム Fallout 3 で端末をハッキングするためのものです. :D 私の考えでは、ゲームを楽しみながら Perl を学ぶのに最適な方法です。
これは、私が調査に使用した Fallout 3 ターミナル ハッキング チュートリアルの 1 つです: 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...
このスクリプトは、ゲームの FAQ と同じように生成され、その結果としてCONSTRUCTION
生成されます。TRANSMISSION
ただし、元の質問の秘訣 (および私が自分で見つけることができなかったもの) は、最初に試すのに最適な単語を見つける方法APPRECIATION
です。
OK、あなたの助けに基づいて私自身の解決策を提供しました。このスレッドは閉じられたと考えてください。すべての貢献者に感謝します。あなたは途方もなく助けになりました、そして途中で私も多くを学びました. :D