Techioz Blog

Rubyで2つの配列に同じ要素が任意の順序で含まれているかどうかを確認し、同じインデックスで同じ要素が取得されるかどうかを確認する方法はありますか?

概要

arr = [1,4,6,3]
arr2 = [3,4,3,6]

arr.each do |item|
 p "X" if arr2.include?(item)
end

しかし、上記は要素が見つかった場合にのみ X を返しますが、両方の配列に同じインデックスに同じ要素が含まれている場合に「O」を返し、複数の要素が見つかった場合に X を繰り返したくないのです。

eachwithindexを使用してみましたが、結果が得られませんでした

解決策

いくつかのヘルパー メソッドを備えたクラスにロジックをラップします。

class CodeBreaker
  def initialize(guess, code)
    @guess = guess
    @code = code
    @numbers = Set.new(code)

    return if guess.size == code.size

    raise ArgumentError, 'guess and code need to share the same size'
  end

  def hint 
    guess.map.with_index do |number, index|
      mark_when_equal_at_index(index) || mark_when_number_in_code(number) || '-'
    end
  end

  private

  attr_reader :guess, :code, :numbers

  def mark_when_equal_at_index(index)
    'O' if guess[index] == code[index]
  end

  def mark_when_number_in_code(number)
    'X' if code.include?(number)
  end
end

code_breaker = CodeBreaker.new([1, 4, 6, 3], [3, 4, 3, 6])
code_breaker.hint
#=> ["-", "O", "X", "X"]