From: "Ball, Donald A Jr (Library)" Date: 2007-01-30T07:16:44+09:00 Subject: Re: [QUIZ] Counting Toothpicks (#111) ------_=_NextPart_001_01C743F3.21809F30 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable I have a fairly verbose submission for this quiz. It's probably quite slow compared to others, but at least I can follow my own code :) One question for the more advanced rubyists - I use sets in one place, and tried to unit test the results, but Set.=3D=3D didn't perform as I would have expected... for instance: require 'set' s1 =3D Set.new s1 << {1=3D>2} s1 << {2=3D>3} s2 =3D Set.new s2 << {1=3D>2} s2 << {2=3D>3} s1 =3D=3D s2 is false. Presumably this is due to reference v.s. values equality, but I thought that since Hash defines values-based =3D=3D, Set.=3D=3D would = use it, but it appears not. This is somewhat surprising, I'll warrant. Oh, and what's the preferred submission method - attachment, inclusion, or pastie? - donald ------_=_NextPart_001_01C743F3.21809F30 Content-Type: application/octet-stream; name="toothpicks.rb" Content-Transfer-Encoding: base64 Content-Description: toothpicks.rb Content-Disposition: attachment; filename="toothpicks.rb" IyFjOlxydWJ5XGJpblxydWJ5LmV4ZQ0KIw0KIyBJbXBsZW1lbnRzIHRvb3RocGljayBleHByZXNz aW9ucyBmb3IgaW50ZWdlcnMNCiMNCiMgUnVieSBRdWl6IDExMQ0KIw0KIyBEb25hbGQgQmFsbCAy MDA3LTAxLTI5DQoNCnJlcXVpcmUgJ3NldCcNCg0KbW9kdWxlIFRvb3RocGlja3MNCg0KICAjIFBS SU1FUyBhcmUgbW9zdCBzdWNjaW5jdGx5IGV4cHJlc3NlZCBpbiB0b290aHBpY2tzIGFzIHRoZW1z ZWx2ZXMNCiAgUFJJTUVTID0gWyAyLCAzLCA1LCA3LCAxMSBdDQogICMgRVhQQU5TSU9OUyBhcmUg bW9zdCBzdWNjaW5jdGx5IGV4cHJlc3NlZCBpbiB0b290aHBpY2tzIGFzIGNvZGVkIGhlcmUNCiAg RVhQQU5TSU9OUyA9IHt7Mj0+M30gPT4gOCwgezI9PjEsIDM9PjF9ID0+IDYsIHsyPT4yfSA9PiA0 fQ0KDQogIG1vZHVsZSBDbGFzc01ldGhvZHMNCg0KICAgICMgRXhwYW5kcyB0aGUgZ2l2ZW4gcHJp bWUgZmFjdG9yaXphdGlvbiBpbnRvIHRoZSBzZXQgb2YgYWxsIHBvc3NpYmxlIA0KICAgICMgZXhw YW5kZWQgZmFjdG9yaXphdGlvbnMNCiAgICBkZWYgZXhwYW5zaW9ucyhmYWN0b3JpemF0aW9uKQ0K ICAgICAgZXhwYW5zaW9ucyA9IFNldC5uZXcNCiAgICAgIEVYUEFOU0lPTlMuZWFjaF9wYWlyIGRv IHxleHBhbnNpb24sIGV4cGFuZGVkfA0KICAgICAgICBuZXdfZmFjdG9yaXphdGlvbiA9IGZhY3Rv cml6YXRpb24uY2xvbmUNCiAgICAgICAgZXhwYW5zaW9uLmVhY2hfcGFpciBkbyB8a2V5LCB2YWx1 ZXwNCiAgICAgICAgICBpZiBuZXdfZmFjdG9yaXphdGlvbi5oYXNfa2V5PyhrZXkpICYmIG5ld19m YWN0b3JpemF0aW9uW2tleV0gPj0gdmFsdWUNCiAgICAgICAgICAgIG5ld19mYWN0b3JpemF0aW9u W2tleV0gLT0gdmFsdWUNCiAgICAgICAgICAgIG5ld19mYWN0b3JpemF0aW9uLmRlbGV0ZShrZXkp IGlmIG5ld19mYWN0b3JpemF0aW9uW2tleV0gPT0gMA0KICAgICAgICAgIGVsc2UNCiAgICAgICAg ICAgIG5ld19mYWN0b3JpemF0aW9uID0gbmlsDQogICAgICAgICAgICBicmVhaw0KICAgICAgICAg IGVuZA0KICAgICAgICBlbmQNCiAgICAgICAgbmV4dCB1bmxlc3MgbmV3X2ZhY3Rvcml6YXRpb24N CiAgICAgICAgbmV3X2ZhY3Rvcml6YXRpb25bZXhwYW5kZWRdIHx8PSAwDQogICAgICAgIG5ld19m YWN0b3JpemF0aW9uW2V4cGFuZGVkXSArPSAxDQogICAgICAgIGV4cGFuc2lvbnMubWVyZ2Uoc2Vs Zi5leHBhbnNpb25zKG5ld19mYWN0b3JpemF0aW9uKSkNCiAgICAgIGVuZA0KICAgICAgZXhwYW5z aW9ucyA8PCBmYWN0b3JpemF0aW9uDQogICAgZW5kDQogIA0KICAgICMgUmV0dXJucyB0aGUgY29z dCBpbiB0b290aHBpY2tzIG9mIHRoZSBnaXZlbiBleHBhbnNpb24NCiAgICBkZWYgZXhwYW5zaW9u X2Nvc3QoZXhwYW5zaW9uKQ0KICAgICAgY29zdCA9IDANCiAgICAgIG9wZXJhbmRzID0gMA0KICAg ICAgZXhwYW5zaW9uLmVhY2hfcGFpciBkbyB8a2V5LCB2YWx1ZXwNCiAgICAgICAgY29zdCArPSBr ZXkqdmFsdWUNCiAgICAgICAgb3BlcmFuZHMgKz0gdmFsdWUNCiAgICAgIGVuZA0KICAgICAgY29z dCArPSAyKihvcGVyYW5kcy0xKQ0KICAgIGVuZA0KICANCiAgICAjIFJldHVybnMgdGhlIGxlYXN0 IGV4cGVuc2l2ZSBleHBhbnNpb24NCiAgICBkZWYgYmVzdF9leHBhbnNpb24oZXhwYW5zaW9ucykN CiAgICAgIGJlc3RfZXhwYW5zaW9uID0gbmlsDQogICAgICBiZXN0X2Nvc3QgPSBuaWwNCiAgICAg IGV4cGFuc2lvbnMuZWFjaCBkbyB8ZXhwYW5zaW9ufA0KICAgICAgICBjb3N0ID0gc2VsZi5leHBh bnNpb25fY29zdChleHBhbnNpb24pDQogICAgICAgIGlmIGJlc3RfY29zdC5uaWw/IHx8IGNvc3Qg PCBiZXN0X2Nvc3QNCiAgICAgICAgICBiZXN0X2V4cGFuc2lvbiA9IGV4cGFuc2lvbg0KICAgICAg ICAgIGJlc3RfY29zdCA9IGNvc3QNCiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICAgIGJlc3Rf ZXhwYW5zaW9uDQogICAgZW5kDQoNCiAgZW5kDQoNCiAgbW9kdWxlIE9iamVjdE1ldGhvZHMNCiAg DQogICAgIyBGYWN0b3JzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGEgaGFzaCBvZiBwcmltZXMsIG9y IG5pbCBpZiBpdCdzIG5vdCBhIHByb2R1Y3QNCiAgICAjIG9mIHByaW1lcw0KICAgIGRlZiBmYWN0 b3INCiAgICAgIGlmIHNlbGYgPD0gMA0KICAgICAgICByYWlzZSAnSWxsZWdhbCBhcmd1bWVudCcN CiAgICAgIGVsc2lmIHNlbGYgPT0gMQ0KICAgICAgICByZXR1cm4gezE9PjF9DQogICAgICBlbmQN CiAgICAgIFBSSU1FUy5lYWNoIGRvIHxwcmltZXwNCiAgICAgICAgcmV0dXJuIHtwcmltZT0+MX0g aWYgc2VsZiA9PSBwcmltZQ0KICAgICAgICBxdW90aWVudCwgbW9kdWx1cyA9IHNlbGYuZGl2bW9k KHByaW1lKQ0KICAgICAgICBuZXh0IGlmIG1vZHVsdXMgIT0gMA0KICAgICAgICBmYWN0b3JpemF0 aW9uID0gcXVvdGllbnQuZmFjdG9yDQogICAgICAgIG5leHQgaWYgZmFjdG9yaXphdGlvbi5uaWw/ DQogICAgICAgIGZhY3Rvcml6YXRpb25bcHJpbWVdIHx8PSAwDQogICAgICAgIGZhY3Rvcml6YXRp b25bcHJpbWVdICs9IDENCiAgICAgICAgcmV0dXJuIGZhY3Rvcml6YXRpb24NCiAgICAgIGVuZA0K ICAgICAgbmlsDQogICAgZW5kDQogIA0KICAgICMgUmV0dXJucyBhIHN0cmluZyBleHByZXNzaW5n IHRoZSBnaXZlbiB2YWx1ZSBpbiB0b290aHBpY2tzDQogICAgZGVmIHRvX3Rvb3RocGlja3MNCiAg ICAgIGFkZCA9IDANCiAgICAgIHZhbHVlID0gc2VsZg0KICAgICAgd2hpbGUgKGZhY3Rvcml6YXRp b24gPSB2YWx1ZS5mYWN0b3IpLm5pbD8NCiAgICAgICAgdmFsdWUgLT0gMQ0KICAgICAgICBhZGQg Kz0gMQ0KICAgICAgZW5kDQogICAgICBleHBhbnNpb24gPSBzZWxmLmNsYXNzLmJlc3RfZXhwYW5z aW9uKHNlbGYuY2xhc3MuZXhwYW5zaW9ucyhmYWN0b3JpemF0aW9uKSkNCiAgICAgIGZhY3RvcnMg PSBbXQ0KICAgICAgZXhwYW5zaW9uLnNvcnQucmV2ZXJzZS5lYWNoIGRvIHxrZXksIHZhbHVlfA0K ICAgICAgICB2YWx1ZS50aW1lcyB7IGZhY3RvcnMgPDwga2V5IH0NCiAgICAgIGVuZA0KICAgICAg dG9vdGhwaWNrcyA9IFtdDQogICAgICBmYWN0b3JzLmVhY2ggZG8gfGZhY3RvcnwNCiAgICAgICAg cyA9ICcnDQogICAgICAgIGZhY3Rvci50aW1lcyB7IHMgPDwgJ3wnIH0NCiAgICAgICAgdG9vdGhw aWNrcyA8PCBzDQogICAgICBlbmQNCiAgICAgIHMgPSAiI3t0b290aHBpY2tzLmpvaW4oJ3gnKX0i DQogICAgICBpZiBhZGQgPiAwDQogICAgICAgIHMgPDwgIisje2FkZC50b190b290aHBpY2tzfSIN CiAgICAgIGVuZA0KICAgICAgcw0KICAgIGVuZA0KICBlbmQNCg0KZW5kDQoNCmNsYXNzIEludGVn ZXINCiAgZXh0ZW5kIFRvb3RocGlja3M6OkNsYXNzTWV0aG9kcw0KICBpbmNsdWRlIFRvb3RocGlj a3M6Ok9iamVjdE1ldGhvZHMNCmVuZA0KDQpyZXF1aXJlICd0ZXN0L3VuaXQnDQoNCmNsYXNzIFRl c3RUb290aFBpY2tzIDwgVGVzdDo6VW5pdDo6VGVzdENhc2UNCg0KICBkZWYgdGVzdF9mYWN0b3IN CiAgICBhc3NlcnRfZXF1YWwoezE9PjF9LCAxLmZhY3RvcikNCiAgICBhc3NlcnRfZXF1YWwoezI9 PjF9LCAyLmZhY3RvcikNCiAgICBhc3NlcnRfZXF1YWwoezI9PjEsIDM9PjF9LCA2LmZhY3RvcikN CiAgICBhc3NlcnRfZXF1YWwoezI9PjN9LCA4LmZhY3RvcikNCiAgICBhc3NlcnRfZXF1YWwoezI9 PjEsIDU9PjF9LCAxMC5mYWN0b3IpDQogICAgYXNzZXJ0X2VxdWFsKHsyPT4yLCA1PT4xfSwgMjAu ZmFjdG9yKQ0KICAgIGFzc2VydF9lcXVhbCh7Mj0+MiwgMz0+MSwgNT0+MX0sIDYwLmZhY3RvcikN CiAgICBhc3NlcnRfZXF1YWwoezI9PjIsIDM9PjF9LCAxMi5mYWN0b3IpDQogICAgYXNzZXJ0X25p bCgxMy5mYWN0b3IpDQogICAgYXNzZXJ0X2VxdWFsKHsyPT4yLCA3PT4xfSwgMjguZmFjdG9yKQ0K ICAgIGFzc2VydF9uaWwoMjkuZmFjdG9yKQ0KICAgIGFzc2VydF9uaWwoMjYuZmFjdG9yKQ0KICBl bmQNCg0KICBkZWYgdGVzdF9leHBhbnNpb25zDQogICAgIyBUT0RPIFNldCBlcXVhbHMgaXMgYnJv a2VuIHNvbWVob3cuLi4gc3VzcGVjdCByZWZlcmVuY2Ugdi5zLiB2YWx1ZSBlcXVhbGl0eQ0KICAg ICMgYXNzZXJ0X2VxdWFsKFt7Mj0+M30sIHsyPT4xLCA0PT4xfSwgezg9PjF9XS50b19zZXQsIElu dGVnZXI6OmV4cGFuc2lvbnMoSW50ZWdlcjo6ZmFjdG9yKDgpKSkNCiAgICAjIGFzc2VydF9lcXVh bChbezI9PjR9LCB7Mj0+MiwgND0+MX0sIHs0PT4yfSwgezI9PjEsIDg9PjF9XS50b19zZXQsIElu dGVnZXI6OmV4cGFuc2lvbnMoSW50ZWdlcjo6ZmFjdG9yKDE2KSkpDQogICAgIyBhc3NlcnRfZXF1 YWwoW3syPT4yLCAzPT4xfSwgezQ9PjEsIDM9PjF9XS50b19zZXQsIEludGVnZXI6OmV4cGFuc2lv bnMoSW50ZWdlcjo6ZmFjdG9yKDEyKSkpDQogICAgIyBhc3NlcnRfZXF1YWwoW3syPT4xLCAzPT4x fSwgezY9PjF9XS50b19zZXQsIEludGVnZXI6OmV4cGFuc2lvbnMoSW50ZWdlcjo6ZmFjdG9yKDYp KSkNCiAgZW5kDQoNCiAgZGVmIHRlc3RfZXhwYW5zaW9uX2Nvc3QNCiAgICBhc3NlcnRfZXF1YWwo MiwgSW50ZWdlci5leHBhbnNpb25fY29zdCh7Mj0+MX0pKQ0KICAgIGFzc2VydF9lcXVhbCg2LCBJ bnRlZ2VyLmV4cGFuc2lvbl9jb3N0KHsyPT4yfSkpDQogICAgYXNzZXJ0X2VxdWFsKDExLCBJbnRl Z2VyLmV4cGFuc2lvbl9jb3N0KHsyPT4yLCAzPT4xfSkpDQogIGVuZA0KDQogIGRlZiB0ZXN0X2Jl c3RfZXhwYW5zaW9uDQogICAgYXNzZXJ0X2VxdWFsKHs0PT4yfSwgSW50ZWdlci5iZXN0X2V4cGFu c2lvbihJbnRlZ2VyLmV4cGFuc2lvbnMoMTYuZmFjdG9yKSkpDQogICAgYXNzZXJ0X2VxdWFsKHs2 PT4xfSwgSW50ZWdlci5iZXN0X2V4cGFuc2lvbihJbnRlZ2VyLmV4cGFuc2lvbnMoNi5mYWN0b3Ip KSkNCiAgZW5kDQoNCiAgZGVmIHRlc3RfdG9vdGhwaWNrcw0KICAgIGFzc2VydF9lcXVhbCgnfCcs IDEudG9fdG9vdGhwaWNrcykNCiAgICBhc3NlcnRfZXF1YWwoJ3x8fHx4fHx8fCcsIDE2LnRvX3Rv b3RocGlja3MpDQogICAgYXNzZXJ0X2VxdWFsKCd8fHx8eHx8fHwrfCcsIDE3LnRvX3Rvb3RocGlj a3MpDQogICAgYXNzZXJ0X2VxdWFsKCd8fHx8eHx8fCcsIDEyLnRvX3Rvb3RocGlja3MpDQogICAg YXNzZXJ0X2VxdWFsKCd8fHx4fHx8eHx8fCcsIDI3LnRvX3Rvb3RocGlja3MpDQogICAgYXNzZXJ0 X2VxdWFsKCd8fHx8fHx8eHx8fHwnLCAyOC50b190b290aHBpY2tzKQ0KICBlbmQNCg0KICBkZWYg dGVzdF9leWViYWxsDQogICAgKDEuLjI1NikuZWFjaCBkbyB8aXwNCiAgICAgIHB1dHMgIiN7aX06 ICN7aS50b190b290aHBpY2tzfSINCiAgICBlbmQNCiAgZW5kDQoNCmVuZA0K ------_=_NextPart_001_01C743F3.21809F30--