- 締切済み
どこが間違いか分かりません。(Ruby)
Rubyを使ったプログラムが巧く行かないのですが、どこでエラーが出ているのか分かりません。どなたか何が原因でエラーが起こったのか教えて頂けないでしょうか。 以下ソースコードです。 class SolitaireCipher $deck = (1..52).to_a+['A','B'] def solitaire(count) key_stream = [] until key_stream.size == count a = $deck.index("A") $deck.delete("A") if a == 53 a = 0 else a += 1 end $deck.insert(a,"A") b = $deck.index("B") $deck.delete("B") if b == 52 b = 1 elsif b == 53 b = 2 else b = b+2 end $deck.insert(b,"B") a1 = $deck[0..b-1] a2 = $deck[b..a] a3 = $deck[a+1..53] $deck = a3+a2+a1 if $deck[53] == 'A' t1 = 27 elsif $deck[53] == 'B' t1 = 27 else t1 = $deck[53] end a4 = $deck[0..t1-1] $deck = ($deck-a4).insert(52,a4).flatten! i = $deck[0].to_i key = $deck[i] key_stream << key end key_stream_s = key_stream.join n = 5 while n < key_stream_s.size key_stream_s[n,0] = " " n += 6 end key_stream = key_stream_s.split(" ") end end s = SolitaireCipher.new p s.solitaire(20) このプログラムを実行したときに、どういう訳かuntil文の中で毎回$deckの値が初期化されるようです。 そのため結果が以下のようになります。 ["44444", "44444", "44444", "44444"] 初心者プログラマーなので何か初歩的な間違いをしているのかもしれません。 どなたかエラーの原因を教えて頂けないでしょうか。 読みにくいプログラムではありますがよろしくおねがいします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- himajin100000
- ベストアンサー率54% (1660/3060)
#私はRuby初心者です。 #多分こんな形じゃないかな。 # 参考資料 # http://www.rubyquiz.com/quiz1.html class SolitaireCipher $deck = (1..52).to_a+['A','B'] def solitaire(count) key_stream = [] until key_stream.size == count a = $deck.index("A") $deck.delete("A") if a == 53 # #a = 0ではない a = 1 else a += 1 end $deck.insert(a,"A") b = $deck.index("B") $deck.delete("B") if b == 52 b = 1 elsif b == 53 b = 2 else b = b+2 end $deck.insert(b,"B") # Bを削除・挿入したことでAの番号は変動していることがあるよ? a = $deck.index("A") # bはやんなくても同じはずだけど、見た目の問題。 b = $deck.index("B") # BがAより左にあるとは限らない #上側にあるジョーカーの上のカード列を下側にあるカードの下のカード列と入れ替えるのであり #どちらがどちらであるということには言及していない #書式がわからなかったら三項演算子で調べてください c = (a < b)?a:b d = (a < b)?b:a a1 = $deck[0..c-1] a2 = $deck[c..d] a3 = $deck[d+1..53] $deck = a3+a2+a1 # この根拠どこ? # if $deck[53] == 'A' # t1 = 27 # この根拠どこ? # elsif $deck[53] == 'B' # t1 = 27 # else t1 = $deck[53] # end a4 = $deck[0..t1-1] # 切り取った配列は52も要素がないよ? # $deck = ($deck-a4).insert(52,a4).flatten! $deck = ($deck-a4).insert(-2,a4).flatten! # 実験してないけど,AやBをto_iすると文字符号位置になってしまうような気がする # 53だということを明示してあげよう! i = (($deck[0] == "A") || ($deck[0] == "B"))?53:$deck[0].to_i #5文字ずつ分解するのは文字単位。 if (($deck[i] != "A") && ($deck[i] != "B")) key = ("A"[0] - 1 + ($deck[i] - 1 + 26) % 26 + 1).chr() key_stream << key end end key_stream_s = key_stream.join n = 5 while n < key_stream_s.size key_stream_s[n,0] = " " n += 6 end p key_stream key_stream = key_stream_s.split(" ") end end s = SolitaireCipher.new p s.solitaire(20) #["DWJXH", "YRFDG", "TMSHP", "UURXJ"]
お礼
回答ありがとうございます。ものすごく参考になりました。もっと勉強します。 参考資料の通り、RubyQuizの第一問を解いていて出てきた問題だったのです。 ありがとうございました。もう一度やり直してみます。