これは見た目よりも難しい問題です。次のテストを定義しました。
describe Array do
describe '.promote' do
subject(:array) { [1, 2, 3] }
it { expect(array.promote(2)).to eq [2, 1, 3] }
it { expect(array.promote(3)).to eq [3, 1, 2] }
it { expect(array.promote(4)).to eq [1, 2, 3] }
it { expect((array + array).promote(2)).to eq [2, 1, 3, 1, 2, 3] }
end
end
sort_by
@Duopixel によって提案されたものはエレガントですが[3, 2, 1]
、2 番目のテスト用に生成されます。
class Array
def promote(promoted_element)
sort_by { |element| element == promoted_element ? 0 : 1 }
end
end
@tadman は を使用しますdelete
が、これは一致するすべての要素を削除するため、4 番目のテストの出力は[2, 1, 3, 1, 3]
.
class Array
def promote(promoted_element)
if (found = delete(promoted_element))
unshift(found)
end
self
end
end
私は使用してみました:
class Array
def promote(promoted_element)
return self unless (found = delete_at(find_index(promoted_element)))
unshift(found)
end
end
しかし、delete_at
nil を処理できないため、3 番目のテストに失敗しました。最後に、私は落ち着きました:
class Array
def promote(promoted_element)
return self unless (found_index = find_index(promoted_element))
unshift(delete_at(found_index))
end
end
promote
単純なアイデアが非常にトリッキーになる可能性があることを誰が知っていましたか?