Columnar transposition

Columnar transposition cipher.

Pencil cipherとしては平面的な配列に文字を埋めて操作するのですが、2次元配列をうまく扱えないという私のプログラムスキル上の問題で、1次元シーケンスを使ってindexの商を列、余りを行と見立て、数論的に2次元的なものを考えてコーディングしました。自分としてはわかりやすいのですが、多分意図が分かりにくいコードだなと思いつつ・・。

columnar_eがencode、columnar_dがdecodeの変換です。引数の1つ目(c)が平文もしくは暗号化テキスト、2つ目(col)にカラムのオーダーをリストで渡す想定です。カラムのオーダーはキーワードを使って定義されることも多いですが、そこはキーワードをオーダーのリストに変換する別の関数を作成しました。キーワードでもオーダーのリストでも、適切に判断して動作してくれるようにするともっと便利なんだろうけれど、今後の課題ということで。。

def columnar_e(c,col):
    p=[0]*len(c)
    left_col_cnt =len(c) % len(col)
    row_cnt1 = int(len(c)/len(col))+1
    row_cnt2 = int(len(c)/len(col))
    
    i=0
    for j in range(len(col)):
        ind=col.index(j+1)
        if ind<left_col_cnt:
            row_cnt=row_cnt1
        else:
            row_cnt=row_cnt2
        for k in range(row_cnt):
            p[i]=c[k*len(col)+ind]
            i+=1
            
    return p
def columnar_d(c,col):
    p=[0]*len(c)
    left_col_cnt =len(c) % len(col)
    row_cnt1 = int(len(c)/len(col))+1
    row_cnt2 = int(len(c)/len(col))

    i=0
    for j in range(len(col)):
        ind=col.index(j+1)
        if ind<left_col_cnt:
            row_cnt=row_cnt1
        else:
            row_cnt=row_cnt2
        for k in range(row_cnt):
            p[k*len(col)+ind]=c[i]
            i+=1
        
    return p
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中