JavaScript

よくある力技O(n^3)らしい回文検出 / すべての部分文字列の検出

スクラッチパッドでささっと

var text = document.documentElement.textContent
text = text.replace(/\s|\n/g, '')
//console.log(text)

var kaibun = '' // ローマ字!
for (var i = 0; i < text.length; i++) {
  var before = i - 1
  var after  = i + 1
  if (before == -1 || after == text.length) {
    continue;
  }

  // 真ん中が同じ2文字なタイプの回文の場合は?3文字は1文字の場合で検出できそうだから、1になっても3になってもいいのか?
  if(text[i] == text[before]) {
    --before
  }
  if(text[i] == text[after]) {
    ++before
  }

  while(text[before] == text[after]) {
    kaibun = text.substring(before, after + 1)
    //console.log('回文',kaibun) // 回文の部分回文なので最長になるまでは回文としない
    --before
    ++after
    if (before == -1 || after == text.length) {
      break;
    }
  }

  // 面白いものがほしいので日本語&長さ制限をつける
  if (kaibun != '' && kaibun.length >= 5 && kaibun.match(/[\u30a0-\u30ff\u3040-\u309f\u3005-\u3006\u30e0-\u9fcf]/) /* 日本語を含んでいる */) {
    console.log(kaibun)
    kaibun = ''
  }
}

推敲・検証なし。

作ってから他のコードをちらちら見ると、もっと変数数も少なくて判定もスマートで凹む。

日本語遊びは結局漢字をひらく(やカナもひらがな化)部分がネックになって、回文や575検出などは詰まってしまいます。
英文だけでは面白くないですしね…。


回文 - Wikipedia
で実行すると

ともついにいつもと
五・七・五
わかみかものとかなかとのもかみかわ
んどこどん
いた(たい
たいもくよとんとことんとよくもいた
かな(なか
かしみしか
なかしみしかししかしみしかな
かしみしか
みなくさのなははくとしれくすりなりすくれしとくははなのさくなみ
たのむそのいかにもにかいのそむのた
さかのなはやとりたりとやはなのかさ
の世しばしよしばし世の
よしはしよ
はかなのよしはしよしはしよのなかは
よしはしよ
にわのわに
まさかさかさま
たび浴びた
アニマルマニア
サ・カ・サ
せとちとせ
しぶいぶし
こたつたこ
スキトキメキトキス
12月21
アニマルマニア
んだ(だん
だんしがしんだ

参考