シーザー暗号を使った暗号の解読コードを書こうとしています。
一番多い文字をeと対応していると考えて以下のように書きました。
ずらすのは英小文字だけです。
ruby
1 2def dec(angobun) 3 code_a = 'a'.ord # 文字 a の文字コード(=97) 4 kosu = 26 # 英字アルファベットの数 5 len = angobun.length # 文字列の長さ 6 ango = angobun.unpack("C*") # 文字列から文字コードの配列へ変換 7 hira = Array.new(len) # ひら文(のコード)格納用配列 8 time = Array.new(kosu,0) #文字が何個ずつあるか用配列 9 for i in 0..len-1 10 code = ango[i] # i 文字目のコードを得る 11 sa = code-code_a # 文字 a からの差分 12 if 0<=sa && sa<kosu #英小文字を数える 13 time[sa]+=1 14 end 15 end 16 max=time.max 17 key=max-4 #一番多いのとeとのズレが鍵とする 18 19 for i in 0..len-1 #復号してく 20 code = ango[i] 21 sa = code-code_a 22 if 0<=sa && sa<kosu #英小文字ならsaを0〜25の間にする 23 sa-=key 24 while sa>=kosu 25 sa-=kosu 26 end 27 while sa<0 28 sa+=kosu 29 end 30 hira[i] = sa + code_a # 暗号文用のコードの格納 31 end 32 end 33 hirabun = hira.pack("C*") # コードの配列を文字列に直す (<- 35行め) 34 return(hirabun) 35end 36 37 38angobun = gets.chomp # 平文を入力 39hirabun = dec(angobun) # 暗号文に変換 (<- 41行め) 40puts(hirabun) # 暗号文を出力 41
エラー
kaidoku.rb:35:in pack': no implicit conversion of nil into Integer (TypeError) from kaidoku.rb:35:in
dec'
from kaidoku.rb:41:in `<main>'
どうすれば良いのでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/02 15:37
2017/11/02 15:37