tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

大の大人が全力で「こたつたこ」に取り組んでみた

「こたつたこ」って知ってますか?

NHK の「ピタゴラスイッチ」に出てくる歌です。可愛らしい絵と回文で構成された歌詞が特徴的です。僕はこの歌(?)が大好きです。見たこと無い人は、ぐぐってみれば良いと思います。(著作権的に微妙なので、直リンは載せません)

で、
『ピタゴラスイッチ』で「こたつたこ」の歌のフレーズ募集中 - mu-mo エンタメニュース

NHK教育ピタゴラスイッチ』では、好評放送中の「こたつたこ」の歌に使える「前から読んでも後ろから読んでも同じ」5文字のことばを募集しています。

とのことで、歌詞を募集しているのです。

これは取り組まないわけにはいかない。でもオイラは怠惰な Perler なので、いちいち考えるのはめんどいです。なので、Perl さんと ipadic に仕事をしてもらいました。所要時間は30分くらいかな。

#!/usr/bin/perl -w
use strict;
use warnings;
use Encode;

use Data::Dumper;
my %words_2;# 2文字の単語
my %words_3;# 3文字の単語

my @has_brace; #波括弧つきのやつ。あとで再処理する
my @delimiter_word = qw(ト ニ ノ);#他にもあるかも

open(my $DIC, '<', '/tmp/Noun.dic') or die "can't open";
#open(my $DIC, '<', '/tmp/Noun.test.dic') or die "can't open";#先頭行を抜粋(テスト用)
while( my $input = <$DIC> ) {
    chomp ($input);
    my $word = (split(/\s+/, (split(/[()]/, decode('euc-jp', $input)))[10]))[1];

    $words_2{$word} = $word     if( length($word) == 2 ) ;
    $words_3{$word} = $word     if( length($word) == 3 );
    push @has_brace, $word      if ( $word =~ /{/ );
}
close($DIC);

for my $has_brace ( @has_brace ) {
    $has_brace =~ s/{//g;
    $has_brace =~ s/}//g;
    for my $word ( split(qr{/}, $has_brace) ) {
        $words_2{$word} = $word     if( length($word) == 2 );
        $words_3{$word} = $word     if( length($word) == 3 );
    }
}

# 2文字。反転して同じ意味の単語を探し、区切り文字を使って表示
for my $word (sort keys %words_2 ) {
    my $reversed = reverse $word;
    if ( exists $words_2{$reversed} ) {
        for my $d ( @delimiter_word ) {
            printf("%s %s %s\n", encode('utf-8', $word),
                                 $d,
                                 encode('utf-8', $reversed) );
        }
    }
}

# 3文字。前2文字を反転して、2文字の単語辞書とマッチしたら表示
for my $word (sort keys %words_3 ) {
    my $reversed = reverse substr($word, 0, 2);
    if ( exists $words_2{$reversed} ) {
        printf("%s %s\n", encode('utf-8', $word),
                          encode('utf-8', $reversed) );
    }
}

出力にはちゃんと「こたつたこ」も入ってましたよ。

ipadic の辞書は基本的な名詞(Noun.dic)だけを使うのが一番よさそう。(人名辞書も入れた際に出た「マサキ様」が個人的には一番ツボでしたがね。。。)これでも 6000個以上の候補を出してくれちゃってるので、あとは人力でよい言葉を捜さないと。。。です。頻出語のみの辞書とかあるとありがたいんだけどね。。。

アルゴリズムは特に無くて、コメントに書いたとおりなので、説明不要ですよね?2文字の場合がイマイチです。


以下、ちょっとまじめな話。

プログラミング能力を測るのに、「回文」ってのはなかなか悪くない題材かな、とか思いました。FizzBazz より難しく、正解がある程度明確(問題を上手に作らないと答えが一意にならないけどね)だし、与える辞書次第でいろんなことができる。辞書のサイズをメモリに載らないくらい大きくしたり、枝狩りが必要な問題設定をすれば難易度の調整も可能だしね。