大の大人が全力で「こたつたこ」に取り組んでみた
「こたつたこ」って知ってますか?
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 より難しく、正解がある程度明確(問題を上手に作らないと答えが一意にならないけどね)だし、与える辞書次第でいろんなことができる。辞書のサイズをメモリに載らないくらい大きくしたり、枝狩りが必要な問題設定をすれば難易度の調整も可能だしね。