» 2010 » 10月のブログ記事

前回のプログラムでは、ずらす数字を変更した場合、テーブルの文字を全部書き換える必要があります。
今回はアルファベットに数字を対応させてみます。

#シーザー暗号

table = [["a",1],["b",2],["c",3],["d",4],["e",5],
["f",6],["g",7],["h",8],["i",9],["j",10],
["k",11],["l",12],["m",13],["n",14],["o",15],
["p",16],["q",17],["r",18],["s",19],["t",20],
["u",21],["v",22],["w",23],["x",24],["y",25],
["z",26],[" ",27]]

key = 3#文字をずらす数

a = "I love Ruby"

a = a.downcase

i = a.length

encryption = '暗号化した文='

for x in 0..(i-1) do
   count = 0
   while  table[count][0] != a[x].chr
        count += 1
   end   
   suzi = table[count][1]#アルファベットに対応する数字を取得
 
   crypt = (suzi + key) % 27#keyの値だけ数字をシフト
   #crypt = (suzi - key) % 27#復号化用
   encryption += table[crypt-1][0]#シフト先アルファベット取得#[crypt-1]で-1してるのは配列が0から始まるため
end
puts encryption

前回と今回のプログラムは以下のページを参考にさせて頂きました。
Tiny Basic for Windows
「Topページ」-「プログラムの背景」-「カエサル暗号」に詳しい説明があります。
「crypt = (suzi + (key)) % 27」の計算部分について説明があるので、お勧めです。

シーザー暗号はアルファベットを一定の数、前後どちらかにずらす単純なものです。3文字後ろにずらす場合、
「ABC」は「DEF」に暗号化されます。まずは、2次元配列を使って、暗号化前の文字と暗号化後の文字を
セットにした、[“A”,”D”],[“B”,”E”],[“C”,”F”]・・・[“Z”,”B”],[” “,”C”]のテーブル
を作ります(最後の組み合わせは半角スペースとC)。これには2次元配列を使います。

a = [[0,1], [2,3], ['a',4]]
print(a[0],"\n")
print(a[1],"\n")
print(a[2],"\n")

print(a[0][0],"\n")
print(a[0][1],"\n")

print(a[2][0],"\n")
print(a[2][1],"\n")

実行結果
01
23
a4
0
1
a
4

配列の中に配列を入れることで 2 次元配列を作る事が出来ます。0番目の要素は配列 [0, 1]です。その配列の
0番目の要素が0、1番目の要素が1になります。 配列の値を取得するには「配列名[][]」で取得できます。
最初の[]に指定する数字(0,1,2)で「[0,1], [2,3], [‘a’,4]」のいずれかの配列を指定します。2番目の[]に指定する
数字(0,1)で指定した配列の値を取得します。
では、暗号化前の文字と暗号化後の文字をセットしたテーブルを作ります。

table = [["a","d"],["b","e"],["c","f"],["d","g"],["e","h"],
["f","i"],["g","j"],["h","k"],["i","l"],["j","m"],
["k","n"],["l","o"],["m","p"],["n","q"],["o","r"],
["p","s"],["q","t"],["r","u"],["s","v"],["t","w"],
["u","x"],["v","y"],
["w","z"],["x"," "],["y","a"],["z","b"],[" ","c"]]

この組み合わせは3文字づらす形で作っています。”a”の3文字後が”d”、”b”の
3文字後が”e”。”y”の3文字後は最初に戻って”a”になっています。
まずは「for」文を使用して平文の各文字を取得してみます。

a = "I love Ruby" #暗号化する文(平文)

a = a.downcase #大文字は不可なので、平文を小文字に変換。

i = a.length #for文で平文の各文字を取得するために平文の文字数を取得

encryption = '暗号化した文=' #暗号化した文字を入れる変数。

for x in 0..(i-1) do
    puts a[x].chr
end

平文の先頭から1文字づつ取得して表示することができました。
「for x in 0..(i-1) do」で(i-1)をしているのは、平文の一番最初にアクセスするには、
0から始まるため、平文の文字数、今回は10から1を引いています。
「puts a[x].chr」のchrはこちらを参照。
「a[x]」のみでは文字のアスキーコードが取得されるため、「chr」で文字に変換してます。

次に「while」文を使用して平文の各文字に対応した暗号化後の文字を取得します。

table = [["a","d"],["b","e"],["c","f"],["d","g"],["e","h"],
["f","i"],["g","j"],["h","k"],["i","l"],["j","m"],
["k","n"],["l","o"],["m","p"],["n","q"],["o","r"],
["p","s"],["q","t"],["r","u"],["s","v"],["t","w"],
["u","x"],["v","y"],["w","z"],["x"," "],["y","a"],
["z","b"],[" ","c"]]

a = "I love Ruby"

a = a.downcase

count = 0
while  table[count][0] != a[0].chr 
    count += 1
end   
mozi = table[count][1]#暗号化した文字を取得
puts mozi

「while table[count][0] != a[0].chr」ではテーブルの先頭から比較していき、平文の文字と一致した段階で
「while」文を抜けて、「mozi = table[count][1]」で暗号化した文字を取得します。
a[0]の部分の数字を変更して取得される文字を確認してください。a[3]の場合は平文の4番目の文字になるので、
「o」です。「o」に対応する暗号化後の文字は「r」になります。

この「while」文と先ほどの「for」文を組み合わせて完成です。

#シーザー暗号

table = [["a","d"],["b","e"],["c","f"],["d","g"],["e","h"],
["f","i"],["g","j"],["h","k"],["i","l"],["j","m"],
["k","n"],["l","o"],["m","p"],["n","q"],["o","r"],
["p","s"],["q","t"],["r","u"],["s","v"],["t","w"],
["u","x"],["v","y"],["w","z"],["x"," "],["y","a"],
["z","b"],[" ","c"]]

a = "I love Ruby"#暗号化する文

a = a.downcase#小文字に変換

i = a.length#文字数取得

encryption = '暗号化した文='#この変数に暗号文追加

for x in 0..(i-1) do
   count = 0
   while  table[count][0] != a[x].chr
        count += 1
   end   
   mozi = table[count][1]#暗号化した文字を取得
   encryption += mozi
end
puts encryption

暗号化した文を元にもどすには以下の変更でできます。

for x in 0..(i-1) do
   count = 0
   while  table[count][1] != a[x].chr#変更
        count += 1
   end   
   mozi = table[count][0]#変更
   encryption += mozi
end

「hello world」で感動できなかった人も、暗号化した文が、
うまく複合化できたときは少し感動できるんではないでしょうか。

2010年10月12日(火)~2010年10月20日(水)までの間、以下の特典があるようです。
■ キャンペーン特典
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 
特典1 初期費用が無料(通常3,150円)です。            
特典2 ご利用期間3ヶ月分を無料でプレゼントします。        
特典3 Yahoo!ショッピングに商品が掲載できます。          
特典4 Yahoo!ショッピング商品掲載サービス販売手数料3.5%
(2011年2月1日以降は8.0%となります。) 

ネットショップの開店に興味のある方は是非キャンペーン中にご覧ください。



for 変数 in 値 do
実行する処理
end

値の部分には配列などを指定できます。
例えば「a = [1,2,3,4,5]」という配列「a」を値にすると、
まず「1」をとりだして変数にいれて、処理を実行します。
次に「2」を取り出して変数にいれ処理を実行。
あとは「5」を取り出すまで繰り返しです。
前回の「while」文を使用したプログラムを「for」文で書き換えます。

a = [1,2,3] #くじを引く回数
for x in a do
   kuzi = rand(10)
    if kuzi == 7 then
      print("7が出ました。当たりです。","\n")
    else
      print("はずれ。もう一度チャレンジして下さい。","\n")
    end    
end

ちなみに配列「a」の部分は「1..3」という書き方もできます。
次回は「while」文と「for」文を使用してシーザー暗号を作ってみます。

条件が成立している間、同じ処理を繰り返し行う場合に使います。

while 条件 do
実行する処理
end

簡単なプログラムを作ります。

num = 3 #くじを引く回数
i = 1
while i <= num do #iがnumに入れた値になるまで繰り返します
    kuzi = rand(10) #数字が小さいと当たりが出やすい 
    if kuzi == 7 then
      print("7が出ました。当たりです。","\n")
    else
      print("はずれ。もう一度チャレンジして下さい。","\n")
    end    
    i += 1
end

「while文」での注意。10行目にある「i += 1」を削除して実行すると、条件部分にある
「i」の値が1のままで条件がずっと成立した状態になります。
試しに「i += 1」を削除して実行してください。あなたのパソコンは暴走すると思います。
これを止めるにはRDEのメニュー「実行(R)」-「停止(W)」を押せば止まります。

2010年10月
    11月 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

カテゴリー

広告

現在の住まい、将来はVPSへ引越します。 ロリポップの上位版です。

広告

広告

最近のコメント

    広告

    Railsを動かす予定のVPS。無料キャンペーン中。

    広告