嗨,我剛開始學習編碼,而ruby是我的第一語言。我正在嘗試制作一個名為“Game of Set”的游戲,可以在此處或維基百科中查看規則
我能夠獲取用戶卡并將它們輸入到不同的陣列中。但是,我一直在花費大量時間試圖弄清楚如何驗證該集合。我試圖按索引比較陣列索引,但結果不是我想要的。例子:
first = ['two', 'purple', 'stripe', 'diamond']
second = ['one', 'purple', 'solid', 'diamond']
third = ['three', 'purple', 'empty', 'diamond']
這應該是正確的,因為所有都是紫色的,都是菱形的,不同的數字和不同的過濾器。
first = ['one', 'green', 'stripe', 'squiggle']
second = ['one', 'purple', 'solid', 'diamond']
third = ['two', 'green', 'empty', 'oval']
這是錯誤的,因為兩個有相同的數字而一個沒有,顏色也一樣。
這是我想在這里實作的設定游戲
請幫忙謝謝!
uj5u.com熱心網友回復:
在這個游戲中,__set 定義為:
這些牌可以玩好幾場比賽,都涉及到一套的概念。一套由滿足所有這些條件的三張牌組成:
- 它們都具有相同的編號或具有三個不同的編號。
- 它們都具有相同的形狀或具有三種不同的形狀。
- 它們都具有相同的陰影或具有三種不同的陰影。
- 它們都具有相同的顏色或具有三種不同的顏色。
——維基百科
可以用單線檢查:
first = ['two', 'purple', 'stripe', 'diamond']
second = ['one', 'purple', 'solid', 'diamond']
third = ['three', 'purple', 'empty', 'diamond']
first.zip(second, third).all? { |array| [1,3].include?(array.uniq.length) }
#=> true
first = ['one', 'green', 'stripe', 'squiggle']
second = ['one', 'purple', 'solid', 'diamond']
third = ['two', 'green', 'empty', 'oval']
first.zip(second, third).all? { |array| [1,3].include?(array.uniq.length) }
#=> false
這具體是如何作業的?
first
.zip(second, third) #=> [["two", "one", "three"], ["purple", "purple", "purple"], ["stripe", "solid", "empty"], ["diamond", "diamond", "diamond"]]
.all? { |array|
# do all nested arrays comply with the set conditions and
# contain only the same element or three different ones?
[1,3].include?(array.uniq.length)
}
uj5u.com熱心網友回復:
我們被給予
first = ['two', 'purple', 'stripe', 'diamond']
second = ['one', 'purple', 'solid', 'diamond']
third = ['three', 'purple', 'empty', 'diamond']
讓
arr = [first, second, third]
#=> [["two", "purple", "stripe", "diamond"],
# ["one", "purple", "solid", "diamond"],
# ["three", "purple", "empty", "diamond"]]
我們希望檢查每個“列”是否arr包含每個“行”的相同字串或每行中的不同字串。
Ruby 沒有陣列“列”和“行”的概念,只有元素。具有三個元素,arr即陣列first和。但是,我們可以將方法Array#transpose 1發送到物件以獲得我們可以使用的東西:secondthirdarr
a = arr.transpose
#=> [["two", "one", "three"],
# ["purple", "purple", "purple"],
# ["stripe", "solid", "empty"],
# ["diamond", "diamond", "diamond"]]
我們現在只需要看看是否所有四個元素都a通過了測驗。
一方面,我們想知道是否
b = a[1]
#=> ["purple", "purple", "purple"]
滿足要求的屬性。一種方便的方法是使用Array#uniqb方法計算陣列的唯一元素:
c = b.uniq
#=> ["purple"]
bc如果 中的元素數等于1或 中的元素數,則滿足要求b,即b.size #=> 3. 如c.size #=> 1,c滿足要求。
請注意,b.size與 相同arr.size。
我們可以把它放在一個方法中:
def valid?(arr)
nbr_elements = arr.size
a = arr.transpose
a.all? do |b|
sz = b.uniq.size
sz == 1 || sz == nbr_elements
end
end
請參閱Enumerable#all? 2
讓我們試試看。
valid?(arr)
#=> true
為了說明由我執行的計算,我將在使用陳述句valid?對方法進行加鹽后再次運行它。puts
def valid?(arr)
nbr_elements = arr.size
puts "nbr_elements = #{nbr_elements}"
a = arr.transpose
a.all? do |b|
sz = b.uniq.size
puts "b = #{b}"
puts " sz = #{sz}"
puts " #{sz == 1} || #{sz == nbr_elements} => #{sz == 1 || sz == nbr_elements}"
sz == 1 || sz == nbr_elements
end
end
valid?(arr)
#=> true
nbr_elements = 3
b = ["two", "one", "three"]
sz = 3
false || true => true
b = ["purple", "purple", "purple"]
sz = 1
true || false => true
b = ["stripe", "solid", "empty"]
sz = 3
false || true => true
b = ["diamond", "diamond", "diamond"]
sz = 1
true || false => true
讓我們也試試第二個例子。
arr = [["one", "green", "stripe", "squiggle"],
["one", "purple", "solid", "diamond" ],
["two", "green", "empty", "oval" ]]
valid?(arr)
#=> false
nbr_elements = 3
b = ["one", "one", "two"]
sz = 2
false || false => false
在實踐中,我們可能不會有該陳述句a = arr.transpose,而是會鏈接 arr.transpose到all?:
def valid?(arr)
nbr_elements = arr.size
arr.transpose.all? do |b|
sz = b.uniq.size
sz.zero? || sz == nbr_elements
end
end
1 當陣列的所有元素都是具有相同數量元素的陣列時,方法transpose和Array#zip可以或多或少地互換使用。@spickermanzip在他的回答中使用了。
2 Enumerable is a module containing instance methods. Any class that includes that module (don't worry about the details now) has use of all of Enumerable's methods, more or less as though they had been defined in the including class.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/425397.html
上一篇:Elementui的表單驗證不適用于vue2組合API
下一篇:選擇驗證串列VBA中的下一項
