-1

array119ビット長の配列()が初期化され、0別の配列(clave)が64ビット長です。チェックarray1しながら64回以上繰り返したい。claveこれは私がしました:

def fase2
    j=0
    for i in 0..63
        @array1[j]=@array1[18].to_i^@array1[17].to_i^@array1[16].to_i^@array1[13].to_i^@clave[i].to_i
    j=j+1
    if j>19  
        j=0  
    end  
    end
    print @array1
    gets
end

これを行うためのよりクリーンな方法はありますか...?

4

2 に答える 2

1

いくつかの改善点が考えられます。

  1. すべての変数名をもっと意味のあるものと呼んでください。何が入ってい@array1ますか?整数?それを呼び出すことを検討して@intsください。配列を複数形と呼ぶのは良いことです。同じことが当てはまりji可能であれば。

  2. (0..63).each do |i|の代わりに使用してくださいfor i in 0..63。もっとルビーのよう

  3. 演算子間の間隔を使用します。特に等しいです。j = 0いいえj=0

  4. 小さな条件文は1行にまとめることができます。j = 0 if j > 19

  5. なぜ魔法の数字?18、17、16、13が特別なのはなぜですか?それらを適切な名前の配列に入れて開始し、次にそのようにArray#reduceを使用します

    special_indeces = [18, 17, 16, 13]
    
    ... and then in loop ...
    
    xor = special_indeces.reduce do |val, index|
      val ^ @array1[index].to_i
    end
    
  6. 最後に何がありgetsますか?そのポイントは何ですか?

幸運を祈ります。そのコードには深刻な作業が必要です。

于 2013-03-03T18:22:44.723 に答える
0

これはテストされていませんが、それは私が内部ループを書く方法です:

def fase2
  @clave.each do |clave|
    (0..19).each do |j|
      @array1[j] = @array1[18].to_i ^ @array1[17].to_i ^ @array1[16].to_i ^ @array1[13].to_i ^ clave.to_i
    end
  end
  print @array1
  gets
end
于 2013-03-03T18:30:17.530 に答える