From: Patrick Deuster Date: 2006-02-05T22:27:12+09:00 Subject: Re: Quiz #65, Principle of Great Surprise, and Array.delete sledgehammer --------------000301040205060500080400 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit William James wrote: > Dave Howell wrote: > >> I thought I was actually going to enter my first RubyQuiz, but I've >> spent three times as much time trying to get Ruby to stop surprising me >> as I have trying to implement my algorithm, and I've had to abandon my >> effort since I don't have the time to spend. Sigh. >> >> Can somebody explain to me how I'm supposed to delete a *single* >> element from an array based on equivalence with an object? and get back >> said array with said element deleted? >> >> In other words.... >> >> ar = [1, 2, 3, 8, 15, 15, 8] >> >> ar.delete_one_element!(15) >> => [1, 2, 3, 8, 15, 8] >> >> ar.delete_one_element!(14) >> => [1, 2, 3, 8, 15, 15, 8] >> >> ar.delete_one_element!(nil) >> => [1, 2, 3, 8, 15, 15, 8] >> >> I did find so many different ways of not doing this.... >> >> Too enthusiastic.... >> ar.delete(15) >> => 15 >> ar >> => [1, 2, 3, 8, 8] >> >> Right results, wrong output... >> ar.slice!(ar.index(15)) >> => 15 >> ar >> => [1, 2, 3, 8, 15, 8] >> >> and also surprised me by not handling 'nil' as I wanted... >> ar.slice!(ar.index(13)) >> TypeError: no implicit conversion from nil to integer >> from (irb):8:in `slice!' >> from (irb):8 >> >> >> I mean, this seems so, er, obvious! "Please find one instance of this >> object in the array, and return to me the array without that object. If >> the array doesn't have that object, then just give the array back to >> me." >> > > This may not be of any use to you, but here's a way to delete all > elements but the first: > > class Array > def no_dup!( x ) > (i = index(x)) && delete( x ) && insert(i,x) > self > end > end > > And here's another version of delete_one_element!. > > class Array > def delete_one_element!( x ) > (i = index(x)) && delete_at( i ) > self > end > end > > > > And here's yet another version, similar to the ones already posted though: class Array def delete_one! n (i = index(n)) ? delete_at(i) : nil end end --------------000301040205060500080400--