« 東京にはインド料理店が500ある | メイン | 蔵書家にサイコーのソフト »
▼気になるニュース:「iPod リナックスを標的とする初めてのウィルスが出現」(FujiSankei Business i、2007年4月7日)。「iPodへの感染を目的に設計された初めてのウィルスが登場したそうだ。「ポッドソロ」というウィルスだが、iPodにLinuxがインストールされている場合のみ感染するという。かなり、絞ったというか、濃い話。「概念実証型ウィルス」だそうで、要するに悪意のあるプログラムを作れる可能性があることを示すだけの目的のウィルスらしい。なんだか「概念実証型」という言葉を流行らせたい気分になる。
▼ASCII.JPの「ご提案」という連載で、アナグラムを作る話を書きました(http://www.ascii.jp/elem/000/ 000/026/26381/index.html)。ひさしぶりに走らせてみたんだけど、ここでソースを公開しておくことにします。
1.単語辞書を作る
^^^^^^^^^^^^^^^^^^
手頃なものがない場合、名古屋大学の外池俊幸さんのページにある5000語
(http://www.lang.nagoya-u.ac.jp/~tonoike/linda5000.html)とか、アルクの標準語彙水準1200
(http://www.alc.co.jp/goi/PW_top_all.htm)を借りてやってみるという手もあるかもしれません。ただし、語尾変化も含めたい場合はスペルチェッカー用の辞書が望ましいです。ちょっと大きいですが、文献自動検索ソフトのPubmediaに付属のEnglish.dicなど。ただし、難しい単語が入り過ぎの傾向あり
(http://www6.ocn.ne.jp/~vmel/software/pubmedia/pubguide.htm)。いずれにしろ、English.dicというファイル名で、以下のようなテキストファイルを用意しましょう。
a
a.m.
abandon
ability
able
aboard
about
above
abroad
abrupt
absence
absent
:
:
てな内容のファイルを用意するわけです。
2.ソースコード
^^^^^^^^^^^^^^^^
私のアナグラムソフトは、2本のソフトから構成されます。なんと動作環境はDOS。いまどきawkで恐縮です(なにぶん、1991年に『月刊アスキー』の「ことば遊びコンピュータ」という連載で書いたものだと思うのです)。
●1本目 anagram0.awk
BEGIN {
print "\33[2J" > "/dev/stderr";
# print " A N A P R I P R O C" > "/dev/stderr";
print " /^[ANAPRIPROC \\-]+$/" > "/dev/stderr";
print " Ver.0.1" > "/dev/stderr";
print " [穴蔵マー]のプリプロセッサ" > "/dev/stderr";
print " (c) Hortense S. Endoh 17/Jun/1991" > "/dev/stderr";
print "" > "/dev/stderr";
p = ARGV[1];
delete ARGV[1];
}
$0 ~ ("^[" p " \-]+$") {
pp = p;
for (wi = 1; wi <= length($0); wi++) {
match (pp, substr($0, wi, 1));
if (RSTART != 0) {
pp = substr(pp, 1, RSTART - 1) " " substr(pp, RSTART + 1);
} else next;
}
print $0;
}
●2本目 anagram2.awk
BEGIN {
print "ANAGRAMMER2 Ver.0.6 (c) hortense S.endoh 1991" > "/dev/stderr";
print "ANAGRAMMER2 Ver.0.6 (c) hortense S.endoh 1991";
f_data = ARGV[1];
delete ARGV[1];
p = ARGV[2];
print "*** original data *** :" p;
delete ARGV[2];
while (getline < f_data > 0) a = a " " $0;
a = a " ";
j = 1;
tree_walk();
}
function tree_walk() {
j = getdata(j);
while (j > 0 ) {
fixdata[lvl+1] = fixdata[lvl] " " substr(a, j, j_l);
lvl++;
fix[lvl] = j;
fixp[lvl] = p;
p = pp;
if (p == "") {
print fixdata[lvl];
print fixdata[lvl] > "/dev/stderr";
}
else {
tree_walk();
}
j = fix[lvl];
p = fixp[lvl];
lvl--;
j = getdata(j);
}
return;
}
function getdata(j_j, wi) {
flag = 0;
match(substr(a, j_j), " [" p "\-]+ ");
while (flag == 0 && RSTART > 0) {
pp = p;
j_j += RSTART;
j_l = RLENGTH - 2;
flag = 1;
for (wi = 1; wi <= j_l; wi++) {
match (pp, substr(a, j_j + wi - 1, 1));
if (RSTART != 0) {
pp = substr(pp, 1, RSTART - 1) " " substr(pp, RSTART + 1);
} else {
flag = 0;
match(substr(a, j_j), " [" p "\-]+ ");
break;
}
}
gsub(" ", "", pp);
# if (flag == 0) match(substr(a, j_j), " [" p "\-]+ ");
}
if (RSTART == 0) return 0
else return j_j;
}
3.実行
^^^^^^^^
jgawk.exe(gawk)が必要です(http://www.vector.co.jp/soft/dos/util/se000208.html)。これで、DOS窓から、以下のように実行します。
それで、以下のようなバッチファイルを作って実行です。「anag.bat」とかいう名前で作るとよいでしょう。
jgawk -f anagram0.awk %1 English.dic > $temp
jgawk -fanagram2.awk $temp %1 > %1.lst
それで、
C:\_wk1\anag secondlife
などのように実行します(「Secondlife」のアナグラムを求める場合)。結果は、secondlife.lstというファイルに書き出されます。
4.結果
^^^^^^^^
たとえば、以下のような結果が求まります(SecondLifeのアナグラム)。
close end if
code in self
coed in self
cold fee sin
cold if seen
cone fled is
cone if sled
do nice self
end of slice
fee in scold
fence is old
fence lid so
fence solid
file second
fled ice son
fled is once
fled nice so
ice nod self
if old scene
if once sled
led of since
lid of scene
life second
nice of sled
5.小細工
ところが、これでは普通のアナグラムで、自分でわざわざやる意味はあまりありません。ネット上には、アナグラム生成サイトなんてのもありますから(http://www.wordsmith.org/anagram/index.html)。例のセカンドライフのラストネームを入れる場合どうするか? ラストネームの一覧をもってきて、これをさっきのEnglish.dicに追加する。ただし、追加するときに“@”の文字を追加しておきましょう。以下のように……。
@aabye
@allen
@amat
@anatine
@asbrink
@auer
@babenco
@babii
@bade
@bailey
@balczo
@ballinger
@balogh
@balut
@bamaisin
@barbosa
@barthelmess
@barzane
@basevi
@beattie
@beaumont
@bechir
@beck
@beerbaum
@bekkers
@benelli
@beresford
@biedermann
@bikcin
@binder
@bing
@bingyi
@blachere
@bleac
@boa
@bonetto
@boucher
@bracken
@broek
@broome
@burt
@bury
@canning
@capalini
@carfagno
@carlberg
@carnell
@carter
@catteneo
@cazalet
@ceawlin
@chaffe
@choche
@cioc
@clary
@coage
@coakes
@collas
@congrejo
@cortes
@dagger
@dagostino
@daviau
@debevec
@decosta
@decuir
@demina
@dench
@despres
@dinzeo
@docherty
@dollinger
@dovgal
@dryke
@ducatillon
@dyrssen
@ebbage
@edman
@eilde
@emmons
@enoch
@etchegaray
@etzel
@ewing
@falta
@fargis
@faulds
@fegte
@ferraris
@fimicoloud
@flanagan
@foden
@forcella
@forder
@forwzy
@fredriksson
@fride
@furse
@garrigus
@gausman
@gazov
@giha
@graves
@greggan
@grut
@gufler
@gustafson
@guyot
@gynoid
@habercom
@halasy
@halderman
@hammerer
@handrick
@hapmouche
@harrop
@hax
@heberle
@heckroth
@helgerud
@heron
@hienrichs
@hifeng
@hird
@hirons
@hirvi
@holmer
@homewood
@hoorenbeek
@hotaling
@huet
@huldschinsky
@hultcrantz
@humby
@humphreys
@hykova
@hynes
@hyun
@igaly
@ihnen
@ireton
@iuga
@jacobus
@jansma
@janus
@jewell
@jie
@johin
@jun
@juran
@kamachi
@kappler
@karas
@katscher
@kidd
@klaar
@klees
@koba
@koenkamp
@kohime
@kohnke
@korhonen
@korobase
@kuhn
@kungler
@kurka
@lane
@larsson
@laryukov
@laval
@lednev
@lilliehook
@ling
@lisle
@loon
@lowey
@lubitsch
@lundquist
@lusch
@lykin
@lytton
@maertens
@maktoum
@mannonen
@martinek
@martynov
@masala
@mathy
@matova
@mayo
@mcmahon
@mcmillan
@meili
@melnik
@menges
@meriman
@merlin
@mertel
@messmer
@mielziner
@miles
@milev
@mills
@mizser
@mokeev
@morigi
@munro
@nagy
@negulesco
@nemeth
@nikolaidis
@nishi
@noel
@oh
@oppewall
@oyen
@paine
@palen
@panacek
@papp
@peccable
@pennell
@pera
@perfferle
@pessoa
@petrov
@pfeffer
@philbin
@piek
@pinion
@pintens
@planer
@platthy
@qinan
@qunhua
@rang
@rasmuson
@rau
@raymaker
@recreant
@rehula
@reifsnider
@repine
@rhode
@riederer
@robbiani
@rodenberger
@roelofs
@roffo
@ronmark
@rosca
@rossini
@rotaru
@runo
@saenz
@sands
@sautereau
@schnyder
@schridde
@schumann
@seiling
@sewell
@shan
@shepherd
@shilova
@sicling
@singh
@sirbu
@slade
@snook
@soderstrom
@sperber
@spitteler
@staheli
@starostin
@stenvaag
@straaf
@streeter
@swindlehurst
@szondi
@takacs
@tammas
@tatham
@taurog
@tenk
@theas
@tomsen
@torok
@tripsa
@uggla
@ultsch
@umarov
@upshaw
@uriza
@vella
@villota
@vollmar
@voom
@vuckovic
@watanabe
@waydelich
@whitfield
@wiefel
@winkler
@woodget
@writer
@wuyts
@yalin
@yifu
@yiyuan
@yoshikawa
@zabelin
@zapedzki
@zehetbauer
@zenovka
それで、さっきのバッチファイルを使って、
C:\_wk1\anag @secondlife
てな具合で実行すればよいでしょう。
すると、なんと結果は、
@foden slice
の1個しか出てきませんでした(英単語5000の場合)。つまり、まともな単語で、SecondLifeのアナグラムが作れるラストネームは「Foden」だけということになるのでした。
東京カレーニュース
個人サイト(http://www.8-p.net)個人Twitter(http://twitter.com