這是我在 StackOverFlow 上的第一個問題!如果我的問題不清楚,請告訴我。
這是我到目前為止所擁有的:
code = ["4", "4", "1", "1"]
guess = ["4", "4", "4", "1"]
@A = 0
@B = 0
code.each_with_index do |item, index|
if item == guess[index]
@A = 1
elsif code.include?(guess[index])
@B = 1
end
print "\nA:#{@A} B:#{@B}"
end
如果一個數字在兩個陣列中并且在相同的位置(索引),我想將 @A 增加 1。如果數字在兩個陣列中但在不同的位置(索引),則將 @B 增加 1。
我應該得到 A:3 B:0 但我得到 A:3 B:1。在代碼陣列中,沒有第三個“4”,所以 B 不應該增加 1。
是因為 .include 嗎?不適用于陣列中的重復項?我怎樣才能解決這個問題?
uj5u.com熱心網友回復:
在代碼和猜測之間每次成功(單個)匹配之后,我們必須從等式中洗掉匹配的元素。
例如,code = ['1', 2']和guess = ['1', '1']。我們在索引 0 處得到完全匹配。如果我們洗掉匹配的元素: code = ['2']和guess = ['1'],我們可以清楚地看到沒有進一步的匹配。
如果我們沒有洗掉元素,那么(除了完全匹配之外)索引 0 ofcode將與guess... 的索引 1 匹配,這將錯誤地導致@A = 1and @B = 1。我們不想使用已經匹配的代碼元素來匹配不同的猜測元素。
code = ["4", "4", "1", "1"]
guess = ["4", "4", "4", "1"]
unmatched_code = []
unmatched_guess = []
@A = 0
@B = 0
code.size.times do |i|
if code[i] == guess[i]
@A = 1
else
unmatched_code << code[i]
unmatched_guess << guess[i]
end
end
unmatched_guess.each do |g|
matched_at_index = unmatched_code.index(g)
if matched_at_index
@B = 1
unmatched_code.delete_at(matched_at_index)
end
end
uj5u.com熱心網友回復:
這應該有效:
code = ["4", "4", "1", "1"]
guess = ["4", "4", "4", "1"]
visited = Array.new(guess.length) { false }
@A = 0
@B = 0
code.each_with_index do |item, index|
if item == guess[index]
@A = 1
@B -= 1 if visited[index]
visited[index] = true
elsif guess.each_index.any? { |idx| guess[idx] == item && !visited[idx] && visited[idx] = true }
@B = 1
end
end
print "\nA:#{@A} B:#{@B}"
在這里,我正在跟蹤guess陣列中已經訪問過的索引,這樣我就不會在 @A 和 @B 計數中計算相同的元素。
uj5u.com熱心網友回復:
您可以通過以下方式組合代碼和猜測對開始zip:
code = ["4", "3", "1", "1"]
guess = ["2", "3", "1", "4"]
pairs = code.zip(guess)
#=> [["4", "2"], ["3", "3"], ["1", "1"], ["1", "4"]]
要分離完全匹配,您可以使用partition:
exact_matches, remaining = pairs.partition { |a, b| a == b }
exact_matches
#=> [["3", "3"], ["1", "1"]]
remaining
#=> [["4", "2"], ["1", "4"]]
您的 A 值是完全匹配的數量:
a = exact_matches.size
#=> 2
如果remaining是empty?,你已經在這里完成了。但它不是:
remaining.empty?
#=> false
因此,我們必須確定部分匹配的數量。為此,我將首先通過以下方式將這些remaining對轉換回各自的陣列transpose:
code_remaining, guess_remaining = remaining.transpose
code_remaining
#=> ["4", "1"]
guess_remaining
#=> ["2", "4"]
基于該陣列,您可以通過以下方式計算其條目數tally:
code_hash = code_remaining.tally
#=> {"4"=>1, "1"=>1}
guess_hash = guess_remaining.tally
#=> {"2"=>1, "4"=>1}
有 1"4"和1 "2"。guess_hash對于其中的每一個,我們可以檢查有多少實際可用code_hash:
code_hash["4"] #=> 1
code_hash["2"] #=> nil
因為這里的nil意思是0,我會fetch改用它,它允許傳遞一個默認值:
code_hash.fetch("4", 0) #=> 1
code_hash.fetch("2", 0) #=> 0
并且因為可能比猜測的更多(反之亦然),實際值將是min它們的最大值:
[guess_hash["4"], code_hash.fetch("4", 0)].min #=> 1
[guess_hash["2"], code_hash.fetch("2", 0)].min #=> 0
要從中獲得 B 值,我們必須sum執行上述操作:
b = guess_hash.sum { |k, v| [v, code_hash.fetch(k, 0)].min }
#=> 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/510037.html
標籤:红宝石
