作者: kusunoki
日時: 2003/8/01(14:26)
こんにちは、

クロスワードをといて最後に、指定の升目の文字を組み合わせて
ヒントの文字を導き出すといった問題がありますが、それを 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