pythonとuniqで英単語のアナグラムを見つける

6-2.並び替え

ドラマ『フランケンシュタインの恋』(2017)
120年生きている人造人間と理系女子大生のドラマです。
『綾野剛』が人造人間を演じてますが、なんだか綺麗なフランケンです。でも、逆にそれが作り物に見えてしまう。入浴シーンなんかは筋肉が綺麗過ぎでマネキンに思えました。
フランケンシュタインは死体が材料なので、基本人間と同じ物質のような気がしますが、このドラマのフランケンは、材料にキノコが入ってそうです。美味しそうです。

ドラマ中のフランケンの名前は、津軽継実によって「深志研」と名付けられましたが、この「深志研」なんか違和感。。。
と思ったら、フランケンのアナグラムのようです。

フカシケン
  ↓
フランケン

カの縦棒を横にして上に移動、シから一本取ると、フランケンです。

さて、アナグラムということで、辞書から並び替えたら別の単語になるような英単語を探してみましょう。
英単語の一覧は、Linuxを使っていれば、/usr/share/dict/wordsに格納されていますので、これを使います。

takk~$ head /usr/share/dict/words | head
A
A's
AMD
AMD's
AOL
AOL's
AWS
AWS's
Aachen
Aachen's
takk~$ 

アナグラムを見つけるために全単語を並び替えておきます。

例) 「word」→「dorw」

並び替えのスクリプトはpython担当。

takk@deb8:~$ cat -n sortstring.py
     1	import sys
     2	
     3	for line in sys.stdin:
     4		lis=list(line.rstrip("\x0a"))
     5		s="".join(sorted(lis))
     6		print s
takk@deb8:~$ 

では辞書の各単語をすべて並び替えてresultファイルに保存しましょう。

takk@deb8:~$ python sortstring.py < /usr/share/dict/words > result

さらにsortとuniqで重複単語を抽出。

takk@deb8:~$ sort result | uniq -d > result2

result2に残っている文字列がアナグラムが成立する文字列となります。

一番長い単語がいいので、wc -Lで最大文字数を調べます。

takk@deb8:~$ wc -L result2
16 result2

16文字となる行の内容を表示します。

takk@deb8:~$ perl -ne 'print if /^.{16}/' result2
'eeeiimnprsssssv
takk@deb8:~$ 


並び替え前の発見行を確認します。

takk@deb8:~$ grep -n .eeeiimnprsssssv result
52844:'eeeiimnprsssssv
69125:'eeeiimnprsssssv
takk@deb8:~$ 

元ファイルからインデックスを指定して単語を表示します。

takk@deb8:~$ sed -ne '52844p' /usr/share/dict/words
impressiveness's
takk@deb8:~$ ^52844^69125^
sed -ne '69125p' /usr/share/dict/words
permissiveness's
takk@deb8:~$ 

それぞれ意味は、

imporesiveness 印象的なこと
permissiveness 大目に見ること

です。

構成している文字は同じなのに、つなぎ合わせ方ですごく意味が違うもんですね。

コメント

タイトルとURLをコピーしました