ひと目でわかる概要
回文は、前から読んでも後ろから読んでも同じになる言葉や文のことです。言葉遊び、プログラミングの練習問題、名前やブランド名の案出し、数字パズルなど、「前後が同じか」をすぐ確かめたいときに使います。この判定機は、空白・記号・大文字小文字を取り除き、残った文字を逆順にして元と比べます。整えた文字列、逆順の結果、最初に食い違う位置まで表示するので、「回文です/ではありません」だけでなく理由も確認できます。
判定の手順
- 入力をUnicodeのNFC形式にそろえます。濃点や半濁点が別の文字として入力されていても、ひとつの文字として扱われます。
- 英字をすべて小文字にします。
- 文字(ひらがな・カタカナ・漢字・英字など、あらゆる文字体系)と数字だけを残し、空白・句読点・記号・絵文字を削除します。
- 残った文字列を逆順にし、元の並びと同じなら回文と判定します。
n文字なら、1文字目とn文字目、2文字目とn-1文字目というように向かい合う組を比べれば十分で、奇数文字の真ん中の1文字には相手が要りません。「しんぶんし」は、し-し、ん-ん の2組で確定し、真ん中の「ぶ」は比べません。結果欄の「最初の不一致」は、この比較を外側から順にたどった結果です。
例の判定表
下の表は、上のツールと同じ規則でページ生成時に計算した結果です。
| 入力 | 整えた文字列 | 文字数 | 逆順 | 判定 |
|---|---|---|---|---|
| トマト | トマト | 3 | トマト | 回文 |
| しんぶんし | しんぶんし | 5 | しんぶんし | 回文 |
| たけやぶやけた | たけやぶやけた | 7 | たけやぶやけた | 回文 |
| ダンスガスンダ | ダンスガスンダ | 7 | ダンスガスンダ | 回文 |
| ダンスがすんだ | ダンスがすんだ | 7 | だんすがスンダ | 回文ではない |
| ローマ | ローマ | 3 | マーロ | 回文ではない |
| A man, a plan, a canal: Panama | amanaplanacanalpanama | 21 | amanaplanacanalpanama | 回文 |
| level | level | 5 | level | 回文 |
| 12321 | 12321 | 5 | 12321 | 回文 |
| こんにちは | こんにちは | 5 | はちにんこ | 回文ではない |
「ダンスガスンダ」と「ダンスがすんだ」は読みは同じですが、後者はカタカナとひらがなが混ざっているため、文字としては向かい合う「ダ」と「だ」が別の文字になり、このツールでは回文になりません。音ではなく書かれた文字そのものを比べる、という点が大事です。
数字の回文はいくつあるか
d桁の数は、前半(切り上げた桁数)を決めれば後半は鏡のように決まります。先頭は1〜9の9通り、前半の残りの桁は各10通りなので、個数は 9×10⌈d/2⌉-1 です。公式の値と、すべての数を1つずつ調べた値が一致することを表で確認できます。
| 桁数 | 公式 9×10^(⌈d/2⌉-1) | 全数調査 |
|---|---|---|
| 1桁 | 9個 | 9個 |
| 2桁 | 9個 | 9個 |
| 3桁 | 90個 | 90個 |
| 4桁 | 90個 | 90個 |
| 5桁 | 900個 | 900個 |
検算した例:逆順を足していく
ある数にその逆順の数を足す操作を繰り返すと、回文になることがよくあります。56は 56 → 121 と1回で回文になります。89は24回もかかり、8813200023188 でようやく回文になります。10進法でこの操作を繰り返してもいつまでも回文にならない数があるかどうかは証明されておらず、196がよく候補として挙げられます。途中の値をこのツールに入れて確かめることもできます。
自分で実装するときのポイント
回文判定のプログラムで間違えやすいのは、アルゴリズムではなく前処理です。大文字小文字をそろえないと「Level」が失敗し、空白や記号を消さないと文章形の回文はすべて失敗します。また、1つの文字が内部的に複数の単位を占めることがあるため、文字列を単純に逆順にすると文字が壊れる場合があります。このツールは1文字ずつの配列にして比べるので、その問題を避けています。計算量は文字数に比例し、向かい合う組だけを比べれば比較回数はn/2回です。
よくある間違いと限界
- ひらがなとカタカナは別の文字として扱います。「ダンスがすんだ」のように混ざると、読みが回文でも判定は回文になりません。
- 濁点・半濁点の有無も別の文字です。「か」と「が」は一致しません。
- 長音記号「ー」や繰り返し記号「々」は文字として残るので、「ローマ」のように末尾と先頭が違えば回文ではありません。
- 全角数字と半角数字は別の文字です。「123」と「123」は混ぜられません。
- 絵文字や記号は文字でも数字でもないので削除され、何も残らなければ判定せず案内だけを表示します。
- 読み(音)の回文は判定できません。漢字を含む言葉は、書かれた漢字の並びで比べます。
結果の活かし方
回文ではないと出たら、「最初の不一致」の行を見て、どの文字の組が合わないのかを確認してください。回文を作るときは、真ん中から外側へ、左右に同じ文字を足して伸ばす方法が作りやすいです。プログラムの練習なら、両端から中央に向かって比べる二つのポインタ方式が、文字列を丸ごと逆順にする方法よりメモリを節約できます。文字数を数えたいときは文字数・単語数カウント、大文字小文字をそろえたいときはテキスト大文字/小文字・ケース変換機を併用してください。
あわせて使いたいツール
- 文字数・単語数カウント - 文字・単語の数を確認
- テキスト大文字/小文字・ケース変換機 - 英字の大文字小文字を整える
- 素数判定機 - 数字の性質を調べる
使い方の具体例
たとえば合言葉やペンネームを考えているとき、「しんぶんし」のような短い言葉を入れて文字数と逆順を確認すれば、左右対称になっているかを一目で確かめられます。長い文章を試す場合は、読点や空白を含めたまま貼り付けて構いません。数字なら、日付や番号を並べた「20211202」のような8桁の並びも、数字だけにして入力すれば判定できます。入力欄でEnterキーを押しても判定され、日本語入力の変換確定中のEnterでは判定されないので、変換を確定してからもう一度Enterを押してください。結果は「結果をコピー」ボタンで一行の文にまとめて取り出せます。
よくある質問
数字も回文として判定できますか?
はい。12321のように数字だけの入力も同じ方法で判定します。英字と数字が混ざった入力も判定できます。
空白や句読点があると回文になりませんか?
いいえ。空白・句読点・大文字小文字を取り除いた文字と数字だけを比べるので、「A man a plan a canal Panama」のように空白のある文も回文と判定されます。日本語の文でも、読点や句点は無視されます。
1文字だけ入力するとどうなりますか?
1文字は前後が同じなので回文と判定されます。ただし言葉遊びとしては意味のある結果ではありません。
ひらがなとカタカナを同じ文字として比べられますか?
このツールではできません。書かれた文字そのものを比べるため、必要なら先にどちらかの表記にそろえてから入力してください。
英語や中国語の文も判定できますか?
できます。英字、漢字、かななど、文字として認識されるものはすべて1文字ずつ比べます。発音ではなく、文字の並びが基準です。