2016-09-28 6 views
7

私は、各方向が冗長でない方向の配列を作成しようとしているところに問題があります。配列から反対の値を削除するにはどうすればよいですか?

plan = ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"] 

あなたはこの計画に値のほとんどを見ることができるようには冗長であるとあなたにも簡単に"WEST"を行くために、人に伝えることがあります。

plan = ["NORTH", "WEST", "SOUTH", "EAST"] 

また、上記の計画では空の配列が返されます。方向の配列を指定

+0

あなたは行き​​ましたか?現在の戦略をお手伝いすることができますか? –

+1

@kallax、それは動作しません、彼は余分な値を削除していない、彼は北と南のような値のペアを削除している – davidhu2000

+0

私はかなりここでdelete_ifを使用する必要がありますが、私はそれを使用する方法を正確に把握することはできません。私はまだルビーの新人です。 –

答えて

5

plan = %w[NORTH SOUTH SOUTH EAST WEST NORTH WEST] 
#=> ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"] 

をIはxyに方向を変換するであろう座標:'SOUTH'がをデクリメント

x, y = 0, 0 

plan.each do |direction| 
    case direction 
    when 'NORTH' then y += 1 
    when 'EAST' then x += 1 
    when 'SOUTH' then y -= 1 
    when 'WEST' then x -= 1 
    end 
end 

'NORTH'増分yを、'EAST'/'WEST'およびxと同じ。例えば、アレイと

は、この与える:

x #=> -1 
y #=> 0 

これらは、方向の配列に戻って翻訳する必要があります:これは最短のコードではありませんが

[ 
    *Array.new(y.abs) { y.positive? ? 'NORTH' : 'SOUTH' }, 
    *Array.new(x.abs) { x.positive? ? 'EAST' : 'WEST' } 
] 
#=> ["WEST"] 

、それは把握することは比較的簡単ですIMO。

+0

素晴らしいアプローチ! –

+0

私はそれを意味する - 解決策を愛する、それについて考えることを止めることなく読むだけで本当に簡単です - 私はもっとupvoteできることを望みます。 –

+0

私は理解しました!あなたのコードは美しいです。 –

4
OPPOSITES = { 
    'NORTH' => 'SOUTH', 
    'WEST' => 'EAST', 
    'EAST' => 'WEST', 
    'SOUTH' => 'NORTH', 
} 

frequencies = plan.group_by(&:itself).map do |direction, occurrences| 
    [direction, occurrences.size] 
end.to_h 

OPPOSITES.flat_map do |direction, opposite_direction| 
    uncounteracted_occurances = 
    frequencies[direction] - frequencies[opposite_direction] 

    [direction] * [uncounteracted_occurances, 0].max 
end 
+0

私はこの解決策が私の頭の上に少し行ったように感じる。ありがとうございました! –

+0

@JackKelly私は説明することができます、あなたを混乱させる部分を指してください。あなたはREPLでもそれを一歩一歩試すことができます。 – ndn

2
def simplify(plan) 
    h = { "SOUTH"=>"NORTH", "NORTH"=>"SOUTH", "EAST"=>"WEST", "WEST"=>"EAST" } 
    plan.each_with_object([]) { |direction, arr| 
    (idx = arr.index(h[direction])) ? arr.delete_at(idx) : arr << direction } 
end 

simplify ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"] 
    #=> ["WEST"] 
simplify ["NORTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST", "WEST"] 
    #=> ["NORTH", "WEST", "WEST"] 
simplify ["NORTH", "EAST", "WEST", "NORTH", "WEST"] 
    #=> ["NORTH", "NORTH", "WEST"] 
+0

私は当初は長年の慣習的な答えを持っていました。そして、@ stefanの素敵な答えを読んでください。 –

0

これは、次のような簡単なアプローチです。私の削除されたほぼ答えと同様に、数値の2D平面上の方向を考慮していますが、不要な複雑さ(意図しない点)はありません。結果として、これは概念的には@Stefanによって既に投稿された優れた答えと似ています。

def kanye plan 
    r = plan.count("EAST") - plan.count("WEST") 
    i = plan.count("NORTH") - plan.count("SOUTH") 

    res = [] 
    r.positive? ? r.times { res << "EAST" } : (-r).times { res << "WEST" } 
    i.positive? ? i.times { res << "NORTH" } : (-i).times { res << "SOUTH" } 
    res 
end 

例:

plan = ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"] 
kanye plan #=> ["WEST"] 

plan = ["NORTH", "WEST", "SOUTH", "EAST"] 
kanye plan #=> [] 

plan = ["NORTH"] 
kanye plan #=> ["NORTH"] 

plan = [] 
kanye plan #=> [] 
0

我々はどこ実部が、我々は虚部東西ながら、南北の動きを教えてくれる、地理座標を表すために、アルガン、ガウス平面を使用することができます方向。 このようにして、複素数の単純な和を実行すれば十分です。

plan=["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"] 
dict = {"NORTH"=>1, "SOUTH"=>-1, "EAST"=>(0+1i), "WEST"=>(0-1i)} 

# We substitute for each direction a complex number 
dict.each{|coord,number| plan.map!{|item| item==coord ? number : item}} 
# We run a simple sum 
direction = plan.reduce(&:+) # (0-1i) 
puts dict.key(direction) #=> WEST 

re=direction.real 
im=direction.imag 

if re!=0 and im!=0 
    puts "Direction: #{re.abs} #{dict.key(re/re.abs)} #{im.abs} #{dict.key((im/im.abs) *(1i))}" 
elsif re!=0 and im==0 
    puts "Direction: #{re.abs} #{dict.key(re/re.abs)}" 
elsif re==0 and im!=0 
    puts "Direction: #{im.abs} #{dict.key((im/im.abs) *(1i))}" 
else 
    puts "I did not move" 
end 

#=> Direction: 1 WEST 
関連する問題