テキスト逆順に "Hello World! How are you today?" を入力すると、モードによって 3 つの異なる答えが返る。文字モードは 31 文字の一行を "?yadot uoy era woH !dlroW olleH" へ返し、単語モードは 6 つの単語の中身を変えず順だけを入れ替えて "today? you are How World! Hello" を返し、行モードは行の中身は触れず行の順だけを入れ替える。3 つの結果はすべてブラウザ内で計算され、サーバーへの要求は無い。
文字モードはコードポイントを反転し、バイトではない
文字モードは最後のコードポイントから最初のコードポイントへ読み、書き直すので、単語の中の文字も動く。"Hello World! How are you today?" は "?yadot uoy era woH !dlroW olleH" として戻り、疑問符が最初へ、Hello の大文字 H が最後へ。切り分けはバイトではなくコードポイントで行われるので、絵文字は 1 単位のまま残る。"ab🚀cd" は "dc🚀ba" を返し、ロケットは 2 組の文字の間にそのまま残る。同じ入力を文字カウントに入力すると 6 文字と報じられる。カウントは内部の 16 ビット単位を数えるため、ロケットは 2 を占め、見える記号は 5 つだからだ。
単語モードは単語を入れ替え、空白を正規化する
単語を保持するのは単語モードだ。空白の連続で入力を書き分け、空の片を捨て、単語の列を逆順にして 1 つの空白で貼り直すので、6 語の一行は "today? you are How World! Hello" を返す。貼り直しの過程で空白も整う。"hello" の後に空白 3 つ、続いて "world" なら、戻るのは "world hello" で空白 1 つ、前後の余白は無い。空白が不規則な塊がある場合、空白クリーナーは同じ「1 つの空白に圧縮」ルールを一度で文書全体へ適用するが、こちらの単語モードは順を入れ替える過程でのみ正規化する。
行モードは行の順だけを入れ替える
行モードは各行の中身は保持し、順序だけを変える。"apple"、"banana"、"cherry" の 3 行の塊は "cherry"、"banana"、"apple" として戻り、ログ行の塊は最新が最初へ、内部の 1 文字も触れない。比較の使い道が文字列類似度の位置だ。元の塊と行逆順の双子の塊を渡すと、2 つの読みがどれだけ近いかの点数を出し、これが回文チェックの数値形、1 行を反転して答えが問いと等しいかを問うのと同じ手だ。
2 回反転すれば元に戻る
文字モードは自分自身の取り消しだ。"?yadot uoy era woH !dlroW olleH" をもう一度ツールに送ると "Hello World! How are you today?" が戻り、31 文字が元の順序で 1 つのズレも無い。列を 2 回反転するのは恒等だからだ。単語モードも往復するが、1 回目の正規化までだ。往きの過程で 3 つの空白が 1 つに圧縮されたら、帰りの過程では 1 つのままだ。変えては元に戻すという対の性質が、エンコーダも同じに感じられる理由だ。URLエンコーダ/デコーダも対で働き、先にエンコードしてデコードし、デコード出力は入力と等しくなければその対は破れる。
テキストのパイプラインにおける反転の位置
反転は組める中で最も安い符号化、ビットを 1 つも使わない純粋な入れ替えで、実際にビットを使う符号化器と同じパイプラインに挟まる。テキスト⇄バイナリ変換のガイドは隣接の方向、各文字を 8 ビットコードへ変換し "Hi" が 01001000 01101001 と読めることを扱い、同じ往復の論理が適用される。コードを解けばそれを生んだ文字列へ帰らなければならない。反転はこの仲間の中でコストゼロのメンバー、逆操作が操作そのもの、パイプラインが内容を保持するかをテストする時にスクリプトを書く人が最初に手を伸ばす理由がまさにそこだ。
反転から分析へ
反転の目的は、ほぼ決して反転後のテキストそのものではなく、比較が示すものだ。回文、順序チェック、目を逃らせたものを見つけるために塊を逆から読む習慣、どれも比較の仕事で、テキストカウントのガイドはその比較の反対側にある数字の出どころ、そのまま書かれた塊の単語数、文字の分解、上位 10 文字だ。入れ替えはどれも変えない。単語出現頻度が一目で示す。反転文と原文はどちらも同じ 6 単語、hello、world、how、are、you、today に正規化され、各 1 回出現、入れ替えは単語もカウントも変えないためだ。