2015-10-19 58 views
2

我有一個看起來像這樣所有可能的秩的參考散列:確定鄰居是否存在?

hash = { 
    bronze: 0, 
    silver: 1, 
    gold: 2, 
    platinum: 3, 
    diamond: 4 
} 

我得到一個給定的等級,以及其他現有隊伍的數組,我需要確定「鄰居」爲給定的存在秩。我會盡力的例子:

given_rank = 'gold' 
existing_ranks = ['silver', 'platinum'] 

這應返回true - 銀直接下黃金和鉑金是直接在上面 - 這兩個鄰國都存在。

given_rank = 'gold' 
existing_ranks = ['silver', 'diamond'] 

這應返回false - 上側

這裏鉑缺少這就是我現在有:

​​

有沒有更有效的/高效/紅寶石的方式來解決這個問題?

回答

2

使用連續索引之間的瑣碎數學關係的鄰居,你可以寫:

n1, n2 = hash.values_at(*existing_ranks) 
are_neighbors = (n1 - n2).abs == 2 && hash[given_rank] == (n1 + n2)/2 
+1

你是指'(n2 - n1).abs == 2'? – nsave

+0

@nsave:好點,更新。 – tokland

0

一些建議,:爲您的隊伍使用符號而不是字符串。

hash = { 
    bronze: 0, 
    silver: 1, 
    gold: 2, 
    platinum: 3, 
    diamond: 4 
} 
given_rank = :gold 
existing_ranks = [:silver, :platinum] 

is_neighbor = existing_ranks.map{ |rank| (hash[rank] - hash[given_rank]).abs }.uniq == [1] 

現在你shoulod有is_neighbor == true如果兩個你existing_ranks是你定列

0
def correct_ordering?(hash, existing_ranks, given_rank) 
    hash.values_at(*existing_ranks).sort == [hash[given_rank]-1, hash[given_rank]+1] 
end 

existing_ranks = [:silver, :platinum] 

correct_ordering?(hash, existing_ranks, :gold) #=> true 
correct_ordering?(hash, existing_ranks, :diamond) #=> false 
0

當在密鑰中找不到密鑰時,結果爲nil。只需刪除nil即可得到有效的鄰居

hash = { 
    bronze: 0, 
    silver: 1, 
    gold: 2, 
    platinum: 3, 
    diamond: 4 
} 

given_rank = 'gold' 
existing_ranks = ['silver', 'platinum'] 

ranks = hash.invert 
r = hash[given_rank.to_sym] 
# compact method deletes nil values: 
p existing_ranks.map(&:to_sym) == [ranks[r-1], ranks[r+1]].compact # => true