こんにちは、
クロスワードをといて最後に、指定の升目の文字を組み合わせて
ヒントの文字を導き出すといった問題がありますが、それを AWK
と、辞書ファイルから候補を全部探し出すプログラムを考えてみ
ました。
色々と考えたのですが、この方法が一番簡単で自分で理解できる
方法でした。10文字まではこの方法でいける、16進数を考えれば
16文字までいけるのかな。。
組み合わせ、ダブりがなく、全てを探すというのは良くある問題とお
もいますが、どのようなスクリプトをかかれるのか?
皆様の、ご感想、ご意見いただけますでしょうか。
BEGIN {
#下記配列に、使う文字を指定する。
s[1] = "a"
s[2] = "." #いくつかわからない文字は . とし grep で任意の文字
s[3] = "a" #になるようにゴマカス。
s[4] = "h"
s[5] = "v"
s[6] = "i"
s[7] = "y"
s[8] = "."
s[9] = "r"
#今回は9文字なので、次のような式になる
for (i = 123456789; i < 999999999; i++) {
#効率を考えて最初にダブり、無効な数字をはじく
if (match(i , /0/) != 0) {
} else if (match(i , /1.*1/) != 0) {
} else if (match(i , /2.*2/) != 0) {
} else if (match(i , /3.*3/) != 0) {
} else if (match(i , /4.*4/) != 0) {
} else if (match(i , /5.*5/) != 0) {
} else if (match(i , /6.*6/) != 0) {
} else if (match(i , /7.*7/) != 0) {
} else if (match(i , /8.*8/) != 0) {
} else if (match(i , /9.*9/) != 0) {
} else {
#この数字 l[] の数を s[] に置き換える
l[1] = substr(i "", 1, 1) + 0
l[2] = substr(i "", 2, 1) + 0
l[3] = substr(i "", 3, 1) + 0
l[4] = substr(i "", 4, 1) + 0
l[5] = substr(i "", 5, 1) + 0
l[6] = substr(i "", 6, 1) + 0
l[7] = substr(i "", 7, 1) + 0
l[8] = substr(i "", 8, 1) + 0
l[9] = substr(i "", 9, 1) + 0
stringsIs = ""
for ( j = 1; j < 10; j++) {
stringsIs = stringsIs s[l[j]]
}
#EDICT(テキストの英語辞書)
#print stringsIs
#辞書にあるか。。
if (system ("grep '" stringsIs "' edict") == 0)
print stringsIs
}
}
}
----------------
くすのき@まっとう
kusunoki@...-inet.or.jp