------_=_NextPart_001_01C6CFF6.CEC86FB1 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi, Here's my solution to this weeks problem. I haven't done the "extra credit" work to make it work with different bases, but I have done a bit of work to maybe make the method a bit faster (by caching some results). Here's the benchmark for my different solutions calculating all happy values from 0-10000: Rehearsal --------------------------------------------- simple: 4.032000 0.000000 4.032000 ( 4.032000) smarter: 1.984000 0.000000 1.984000 ( 2.000000) cached: 1.125000 0.000000 1.125000 ( 1.125000) ------------------------------------ total: 7.141000sec user system total real simple: 4.016000 0.000000 4.016000 ( 4.015000) smarter: 1.969000 0.000000 1.969000 ( 1.969000) cached: 1.187000 0.000000 1.187000 ( 1.187000) I might look into making this support different bases as well if I get the time. Fun quiz. :) Cheers, Helge Elvik ------_=_NextPart_001_01C6CFF6.CEC86FB1 Content-Type: application/octet-stream; name="bench.rb" Content-Transfer-Encoding: base64 Content-Description: bench.rb Content-Disposition: attachment; filename="bench.rb" cmVxdWlyZSAnaGFwcHknDQpyZXF1aXJlICdiZW5jaG1hcmsnDQoNCkJlbmNobWFyay5ibWJtKDEw KSBkbyB8YnwNCgliLnJlcG9ydCgic2ltcGxlOiIpIHsgMTAwMDAudGltZXMgeyB8bnwgSGFwcHlD bGFzcy5oYXBweV9zaW1wbGUobikgfSB9DQoJYi5yZXBvcnQoInNtYXJ0ZXI6IikgeyAxMDAwMC50 aW1lcyB7IHxufCBIYXBweUNsYXNzLmhhcHB5X3NtYXJ0ZXIobikgfSB9DQoJYi5yZXBvcnQoImNh Y2hlZDoiKSB7IDEwMDAwLnRpbWVzIHsgfG58IEhhcHB5Q2xhc3MuaGFwcHlfY2FjaGVkKG4pIH0g fQ0KZW5k ------_=_NextPart_001_01C6CFF6.CEC86FB1 Content-Type: application/octet-stream; name="happy.rb" Content-Transfer-Encoding: base64 Content-Description: happy.rb Content-Disposition: attachment; filename="happy.rb" Y2xhc3MgSGFwcHlDbGFzcwkNCglkZWYgc2VsZi5oYXBweV9zaW1wbGUobnVtYmVyKQ0KCQloYXBw eV9saXN0ID0gW10NCgkJY3VycmVudCA9IG51bWJlci50b19zLnNwbGl0KC8vKS5pbmplY3QoMCkg eyB8c3VtLCBkfCBzdW0gKz0gZC50b19pICoqIDIgfQ0KCQl3aGlsZSBjdXJyZW50ICE9IDEgYW5k IGhhcHB5X2xpc3QuaW5kZXgoY3VycmVudCkubmlsPw0KCQkJaGFwcHlfbGlzdCA8PCBjdXJyZW50 DQoJCQljdXJyZW50ID0gY3VycmVudC50b19zLnNwbGl0KC8vKS5pbmplY3QoMCkgeyB8c3VtLCBk fCBzdW0gKz0gZC50b19pICoqIDIgfQ0KCQllbmQNCgkJcmV0dXJuIGN1cnJlbnQgPT0gMSA/IGhh cHB5X2xpc3QubGVuZ3RoIDogMA0KCWVuZA0KCQ0KCWRlZiBzZWxmLmhhcHB5X3NtYXJ0ZXIobnVt YmVyKQ0KCQloYXBweV9saXN0ID0gW10NCgkJY3VycmVudCA9IG51bWJlci50b19zLnNwbGl0KC8v KS5pbmplY3QoMCkgeyB8c3VtLCBkfCBzdW0gKz0gZC50b19pICoqIDIgfQ0KCQl3aGlsZSBjdXJy ZW50ICE9IDEgYW5kIGhhcHB5X2xpc3QuaW5kZXgoY3VycmVudCkubmlsPw0KCQkJaGFwcHlfbGlz dCA8PCBjdXJyZW50DQoJCQljdXJyZW50ID0gY3VycmVudC50b19zLnNwbGl0KC8vKS5pbmplY3Qo MCkgeyB8c3VtLCBkfCBzdW0gKz0gZC50b19pICoqIDIgfQ0KCQkJYnJlYWsgdW5sZXNzIFs0LCAx NiwgMjAsIDM3LCA0MiwgNTgsIDg5LCAxNDVdLmluZGV4KGN1cnJlbnQpLm5pbD8gIyBJZiB3ZSBo aXQgdGhlc2UsIHdlIGtub3cgd2UncmUgdW5oYXBweS4uLg0KCQllbmQNCgkJcmV0dXJuIGN1cnJl bnQgPT0gMSA/IGhhcHB5X2xpc3QubGVuZ3RoIDogMA0KCWVuZA0KDQoJQEBub3RfaGFwcHkgPSBb NCwgMTYsIDIwLCAzNywgNDIsIDU4LCA4OSwgMTQ1XQ0KCWRlZiBzZWxmLmhhcHB5X2NhY2hlZChu dW1iZXIpDQoJCWhhcHB5X2xpc3QgPSBbXQ0KCQljdXJyZW50ID0gbnVtYmVyLnRvX3Muc3BsaXQo Ly8pLmluamVjdCgwKSB7IHxzdW0sIGR8IHN1bSArPSBkLnRvX2kgKiogMiB9DQoJCXdoaWxlIGN1 cnJlbnQgIT0gMSBhbmQgaGFwcHlfbGlzdC5pbmRleChjdXJyZW50KS5uaWw/DQoJCQloYXBweV9s aXN0IDw8IGN1cnJlbnQNCgkJCWN1cnJlbnQgPSBjdXJyZW50LnRvX3Muc3BsaXQoLy8pLmluamVj dCgwKSB7IHxzdW0sIGR8IHN1bSArPSBkLnRvX2kgKiogMiB9DQoJCQlicmVhayB1bmxlc3MgQEBu b3RfaGFwcHkuaW5kZXgoY3VycmVudCkubmlsPw0KCQllbmQNCgkJQEBub3RfaGFwcHkgPDwgbnVt YmVyIGlmIGN1cnJlbnQgIT0gMSBhbmQgbnVtYmVyIDwgMTUwDQoJCXJldHVybiBjdXJyZW50ID09 IDEgPyBoYXBweV9saXN0Lmxlbmd0aCA6IDANCgllbmQNCgkJDQoJZGVmIHNlbGYuZmluZF9iaWdn ZXN0X3VuZGVyKHVuZGVyLCBmdW5jID0gOmhhcHB5X3NpbXBsZSkNCgkJKHVuZGVyLTEpLmRvd250 bygwKSBkbyB8bnVtfA0KCQkJaWYgc2VuZChmdW5jLCBudW0pICE9IDANCgkJCQlyZXR1cm4gbnVt DQoJCQllbmQNCgkJZW5kDQoJZW5kDQplbmQNCg0KaWYgX19GSUxFX18gPT0gJDANCglyZXF1aXJl ICd0ZXN0L3VuaXQnDQoJDQoJY2xhc3MgVGVzdEhhcHB5Q2xhc3MgPCBUZXN0OjpVbml0OjpUZXN0 Q2FzZQ0KCQlIYXBweUNsYXNzLm1ldGhvZHMuZ3JlcCgvXmhhcHB5LykuZWFjaCBkbyB8bXwNCgkJ CWRlZmluZV9tZXRob2QoInRlc3RfI3ttfSIudG9fc3ltKSBkbw0KCQkJCWFzc2VydF9lcXVhbCgg NCwgSGFwcHlDbGFzcy5zZW5kKG0udG9fc3ltLCA3KSApDQoJCQkJYXNzZXJ0X2VxdWFsKCA2LCBI YXBweUNsYXNzLnNlbmQobS50b19zeW0sIDc4Xzk5OSkgKSAjIEJlc3Qgc2NvcmUgdW5kZXIgMU0N CgkJCQlhc3NlcnRfZXF1YWwoIDAsIEhhcHB5Q2xhc3Muc2VuZChtLnRvX3N5bSwgMCkgKQ0KCQkJ CWFzc2VydF9lcXVhbCggMCwgSGFwcHlDbGFzcy5zZW5kKG0udG9fc3ltLCAxKSApDQoJCQkJYXNz ZXJ0X2VxdWFsKCA2LCBIYXBweUNsYXNzLnNlbmQobS50b19zeW0sIDk5OV85OTgpICkNCgkJCWVu ZA0KCQkJDQoJCQlkZWZpbmVfbWV0aG9kKCJ0ZXN0X2ZpbmRfYmlnZ2VzdF91bmRlcl8je219Ii50 b19zeW0pIGRvDQoJCQkJYXNzZXJ0X2VxdWFsKCA5OTlfOTk4LCBIYXBweUNsYXNzLmZpbmRfYmln Z2VzdF91bmRlcigxXzAwMF8wMDAsIG0pICkNCgkJCQlhc3NlcnRfZXF1YWwoIDk5OV85OTIsIEhh cHB5Q2xhc3MuZmluZF9iaWdnZXN0X3VuZGVyKDk5OV85OTgsIG0pICkNCgkJCQlhc3NlcnRfZXF1 YWwoIDcsIEhhcHB5Q2xhc3MuZmluZF9iaWdnZXN0X3VuZGVyKDEwLCBtKSApDQoJCQllbmQNCgkJ ZW5kDQoJCQ0KCQlkZWYgdGVzdF92YWxpZGF0ZV9oYXBweV9zbWFydGVyDQoJCQkxMDAwLnRpbWVz IGRvIHxufA0KCQkJCWFzc2VydF9lcXVhbCggSGFwcHlDbGFzcy5oYXBweV9zaW1wbGUobiksIEhh cHB5Q2xhc3MuaGFwcHlfc21hcnRlcihuKSApDQoJCQllbmQNCgkJZW5kDQoJCQ0KCQlkZWYgdGVz dF92YWxpZGF0ZV9oYXBweV9jYWNoZWQNCgkJCTEwMDAudGltZXMgZG8gfG58DQoJCQkJYXNzZXJ0 X2VxdWFsKCBIYXBweUNsYXNzLmhhcHB5X3NpbXBsZShuKSwgSGFwcHlDbGFzcy5oYXBweV9jYWNo ZWQobikgKQ0KCQkJZW5kDQoJCWVuZA0KCWVuZA0KZW5k ------_=_NextPart_001_01C6CFF6.CEC86FB1--