古典的な秘密メッセージの作成方法であるスクエアコードを実装します。
英語のテキストが与えられたら、そのテキストをエンコードした結果を出力します。
まず、入力が正規化されます。英語のテキストからスペースと句読点が取り除かれ、メッセージは小文字に変換されます。
次に、正規化された文字が行に分割されます。 これらの行は、間に改行を入れて出力すると、長方形を形作っていると見なすことができます。
たとえば、次の文は
"If man was meant to stay on the ground, god would have given us roots."
次のように正規化されます。
"ifmanwasmeanttostayonthegroundgodwouldhavegivenusroots"
平文は、できるだけ正方形に近い長方形に整理します。 長方形の大きさは、メッセージの長さによって決まります。
cを列の数、rを行の数とすると、r×cの長方形について、次の条件を満たす最小の整数cを求めます。
r * c >= length of message、c >= r、c - r <= 1。正規化されたテキストは54文字なので、c = 8、r = 7の長方形になります。
"ifmanwas"
"meanttos"
"tayonthe"
"groundgo"
"dwouldha"
"vegivenu"
"sroots "
暗号化されたメッセージは、列を左から右へと下に読んでいって得られます。
上のメッセージは次のようにエンコードされます。
"imtgdvsfearwermayoogoanouuiontnnlvtwttddesaohghnsseoau"
エンコードされたテキストは、完全な長方形(r X c)を埋めるかたまりとして出力します。つまり、長さrのかたまりをc個、スペースで区切って出力します。
完全な長方形にn文字足りないフレーズでは、最後のn個のかたまりをそれぞれ1つの末尾スペースで埋めます。
"imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau "
これらの行を積み重ねると、暗号文を元のメッセージに視覚的にデコードできることに注目してください。
"imtgdvs"
"fearwer"
"mayoogo"
"anouuio"
"ntnnlvt"
"wttddes"
"aohghn "
"sseoau "