Rail fence

RailfenceもColumnarも、暗号化の手順は何がしたいか分かるのですが、復号化はそれを逆からたどるだけなのでどうも分かりにくい上に処理しにくいなあと思います。

Railfence transpositionのプログラムです。斜めに書いていくというのをプログラムでどう表現すればいいかなと思いましたが、よく考えると横向きには単調に進行していき高さが周期的に変わっていくだけなので、元の文字列のリストに高さを付与した2次元配列をつくって高さごとに読み直す、というコードにしました。

Encode : railfence_e

def railfence_e(text, rails, offset=0):
    place=[["",0] for j in range(len(text) + offset)] 
    line_cycle = list(range(rails)) + list(range(rails-1)[:0:-1])
    for i in range(len(text)):
        place[i + offset] = [text[i], line_cycle[(i + offset) %(rails*2 -2)]]
    
    result =""
    for i in range(rails):
        for s in place:
            if s[1] == i:
                result+=s[0]
    return result

Decodeでは先にEncodeと同様の2次元配列を作成して、高さごとに文字を割り当てた後単調に横向きに読むようにしました。

Decode : railfence_d

def railfence_d(text, rails, offset=0):
    place=[["",0] for j in range(len(text) + offset)]
    line_cycle = list(range(rails)) + list(range(rails-1)[:0:-1])
    for i in range(len(text)):
        place[i + offset] = ["", line_cycle[(i + offset) %(rails*2 -2)]]

    t = 0
    for i in range(rails):
        for j in range(len(text)):
            if place[j + offset][1] == i:
                place[j + offset][0]=text[t]
                t+=1

    result = ""
    for s in place:
        result += s[0]
    return result
広告

コメントを残す

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

WordPress.com ロゴ

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

Google+ フォト

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

Twitter 画像

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

Facebook の写真

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

%s と連携中