From: Jamie Macey Date: 2007-02-12T03:02:02+09:00 Subject: Re: [QUIZ] One-Liners (#113) ------=_Part_42541_8283815.1171216920003 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Basic test case attached, code should be stuffed in one_liner.rb for tests to pass. Solutions are class methods that take a parameter usually not named 'quiz' :P I probably could have got smaller solutions with inject instead of more manual iteration, but they are all under 80, so I'm happy leaving them as is. - Jamie class OneLiner; class << self # Convert to string, work backwards from . (or end of string) to add commas def commaize(number) s = number.to_s; while s.gsub!(/^(-?\d+)(\d{3})([,.]\d+|$)/, '\1,\2\3'); end; s end # Single elements appended to array, arrays added together def flatten_once(ary) a = []; ary.each{|e| e.kind_of?(Array) ? a += e : a << e }; a end # Random sort, block evaluates to 1, 0, or -1. def shuffle(ary) ary.sort{|a,b|1-rand(3)} end # Traverse class hierarchy looking up constant names def get_class(name) name.split("::").inject(Object){|klass, name| klass.const_get(name)} end # Find up to 40 chars including the space, and add a \n following. def wrap_text(paragraph) paragraph.gsub(/(.{1,39}( |$))/, "\\1\n") end # Sort the first word's chars, if current word's chars sort same, is anagram def find_anagrams(words) word = words.shift.split(//).sort; words.select{|w|w.split(//).sort == word} end # Unpack char as 8bit binary, but only grab the (important) last 7 bits # Would likely be easier with a sprintf %7b def binarize(slogan) slogan.split(' ').map{|w|w.unpack('B8'*w.size).map{|b|b[1..7]}.join}.join("\n") end # Split lines, grab one at random def random_line(file) lines = file.read.split("\n"); lines[rand(lines.size)] end # Generate sequence, terminating on a 1 def wondrous_sequence(n) a = [n]; while n != 1; n = (n%2>0) ? n*3+1 : n/2; a << n; end; a end # Recursive version, using a lambda for the recursive function def wondrous_sequence_r(n) r=lambda{|i| i==1 ? [1] : [i] + r.call((i%2>0) ? i*3+1 : i/2)}; r.call(n) end # Pop keys off the end of the array, create a new hash around it def nested_hash(ary) hsh = ary.pop; while key = ary.pop; hsh = {key => hsh}; end; hsh end # Recursive version, using a lambda for the recursive function def nested_hash_r(ary) r=lambda{|a|a.size == 1 ? a.first : {a.shift => r.call(a)}}; r.call(ary) end end; end ------=_Part_42541_8283815.1171216920003 Content-Type: application/x-ruby; name=test_one_liner.rb Content-Transfer-Encoding: base64 X-Attachment-Id: f_ey1rzp5r Content-Disposition: attachment; filename="test_one_liner.rb" cmVxdWlyZSAnb25lX2xpbmVyJwpyZXF1aXJlICd0ZXN0L3VuaXQnCnJlcXVpcmUgJ29zdHJ1Y3Qn CgpjbGFzcyBUZXN0T25lTGluZXIgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQogICMgR2l2ZW4gYSBO dW1lcmljLCBwcm92aWRlIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIHdpdGggY29tbWFzIGluc2Vy dGVkCiAgIyBiZXR3ZWVuIGVhY2ggc2V0IG9mIHRocmVlIGRpZ2l0cyBpbiBmcm9udCBvZiB0aGUg ZGVjaW1hbC4gIEZvciBleGFtcGxlLAogICMgMTk5OTk5NS45OSBzaG91bGQgYmVjb21lICIxLDk5 OSw5OTUuOTkiLgogIGRlZiB0ZXN0X2NvbW1haXplCiAgICBhc3NlcnRfZXF1YWwgIjEsOTk5LDk5 NS45OTAxMSIsIE9uZUxpbmVyLmNvbW1haXplKDE5OTk5OTUuOTkwMTEpCiAgZW5kCiAgCiAgIyBH aXZlbiBhIG5lc3RlZCBBcnJheSBvZiBBcnJheXMsIHBlcmZvcm0gYSBmbGF0dGVuKCktbGlrZSBv cGVyYXRpb24gdGhhdAogICMgcmVtb3ZlcyBvbmx5IHRoZSB0b3AgbGV2ZWwgb2YgbmVzdGluZy4g IEZvciBleGFtcGxlLCBbMSwgWzIsIFszXV1dIHdvdWxkCiAgIyBiZWNvbWUgWzEsIDIsIFszXV0u CiAgZGVmIHRlc3RfZmxhdHRlbl9vbmNlCiAgICBhcnkgPSBbMSwgWzIsIFszLCA0XV0sIFs1XV0K ICAgIGZsYXR0ZXJfYXJ5ID0gWzEsIDIsIFszLCA0XSwgNV0KICAgIGFzc2VydF9lcXVhbCBmbGF0 dGVyX2FyeSwgT25lTGluZXIuZmxhdHRlbl9vbmNlKGFyeSkKICBlbmQKICAKICAjIFNodWZmbGUg dGhlIGNvbnRlbnRzIG9mIGEgcHJvdmlkZWQgQXJyYXkuCiAgZGVmIHRlc3Rfc2h1ZmZsZQogICAg YXJ5ID0gWzMsMSw0LDEsNSw5XQogICAgc2h1ZmZsZWRfYXJ5ID0gT25lTGluZXIuc2h1ZmZsZShh cnkpCiAgICBhc3NlcnRfbm90X2VxdWFsIGFyeSwgc2h1ZmZsZWRfYXJ5CiAgICBhc3NlcnRfZXF1 YWwgYXJ5LnNvcnQsIHNodWZmbGVkX2FyeS5zb3J0CiAgZW5kCiAgCiAgIyBHaXZlbiBhIFJ1Ynkg Y2xhc3MgbmFtZSBpbiBTdHJpbmcgZm9ybSAobGlrZQogICMgIkdob3N0V2hlZWw6OkV4cHJlc3Np b246Okxvb2tBaGVhZCIpLCBmZXRjaCB0aGUgYWN0dWFsIGNsYXNzIG9iamVjdC4KICBkZWYgdGVz dF9nZXRfY2xhc3MKICAgIGFzc2VydF9lcXVhbCBUZXN0OjpVbml0OjpUZXN0Q2FzZSwKICAgICAg ICAgICAgICAgICBPbmVMaW5lci5nZXRfY2xhc3MoIlRlc3Q6OlVuaXQ6OlRlc3RDYXNlIikKICBl bmQKICAKICAjIEluc2VydCBuZXdsaW5lcyBpbnRvIGEgcGFyYWdyYXBoIG9mIHByb3NlIChwcm92 aWRlZCBpbiBhIFN0cmluZykgc28KICAjIGxpbmVzIHdpbGwgd3JhcCBhdCA0MCBjaGFyYWN0ZXJz LgogIGRlZiB0ZXN0X3dyYXBfdGV4dAogICAgd3JhcHBlZCA9ICJJbnNlcnQgbmV3bGluZXMgaW50 byBhIHBhcmFncmFwaCBvZiAiICsgIlxuIiArIAogICAgICAgICAgICAgICJwcm9zZSAocHJvdmlk ZWQgaW4gYSBTdHJpbmcpIHNvIGxpbmVzICIgKyAiXG4iICsKICAgICAgICAgICAgICAid2lsbCB3 cmFwIGF0IDQwIGNoYXJhY3RlcnMuIiArICJcbiIKICAgIHBhcmFncmFwaCA9ICJJbnNlcnQgbmV3 bGluZXMgaW50byBhIHBhcmFncmFwaCBvZiAiICsgCiAgICAgICAgICAgICAgICAicHJvc2UgKHBy b3ZpZGVkIGluIGEgU3RyaW5nKSBzbyBsaW5lcyAiICsKICAgICAgICAgICAgICAgICJ3aWxsIHdy YXAgYXQgNDAgY2hhcmFjdGVycy4iCiAgICBhc3NlcnRfZXF1YWwgd3JhcHBlZCwgT25lTGluZXIu d3JhcF90ZXh0KHBhcmFncmFwaCkKICBlbmQKICAKICAjIEdpdmVuIGFuIEFycmF5IG9mIFN0cmlu ZyB3b3JkcywgYnVpbGQgYW4gQXJyYXkgb2Ygb25seSB0aG9zZSB3b3JkcyB0aGF0CiAgIyBhcmUg YW5hZ3JhbXMgb2YgdGhlIGZpcnN0IHdvcmQgaW4gdGhlIEFycmF5LgogIGRlZiB0ZXN0X2ZpbmRf YW5hZ3JhbXMKICAgIGFuYWdyYW1zID0gJXcoY2F0IGFjdCkKICAgIGFzc2VydF9lcXVhbCBhbmFn cmFtcywgT25lTGluZXIuZmluZF9hbmFncmFtcygldyh0YWMgYmF0IGNhdCByYXQgYWN0KSkKICBl bmQKICAKICAKICAjIENvbnZlcnQgYSBUaGlua0dlZWsgdC1zaGlydCBzbG9nYW4gKGluIFN0cmlu ZyBmb3JtKSBpbnRvIGEgYmluYXJ5CiAgIyByZXByZXNlbnRhdGlvbiAoc3RpbGwgYSBTdHJpbmcp LiAgRm9yIGV4YW1wbGUsIHRoZSBwb3B1bGFyIHNoaXJ0CiAgIyAieW91IGFyZSBkdW1iIiBpcyBh Y3R1YWxseSBwcmludGVkIGFzOgogICAgICAgICAjIDExMTEwMDExMTAxMTExMTExMDEwMQogICAg ICAgICAjIDExMDAwMDExMTEwMDEwMTEwMDEwMQogICAgICAgICAjIDExMDAxMDAxMTEwMTAxMTEw MTEwMTExMDAwMTAKICBkZWYgdGVzdF9iaW5hcml6ZQogICAgb3V0cHV0ID0gIjExMTEwMDExMTAx MTExMTExMDEwMSIgKyAiXG4iICsKICAgICAgICAgICAgICIxMTAwMDAxMTExMDAxMDExMDAxMDEi ICsgIlxuIiArCiAgICAgICAgICAgICAiMTEwMDEwMDExMTAxMDExMTAxMTAxMTEwMDAxMCIKICAg IGFzc2VydF9lcXVhbCBvdXRwdXQsIE9uZUxpbmVyLmJpbmFyaXplKCJ5b3UgYXJlIGR1bWIiKQog IGVuZAogIAogICMgUHJvdmlkZWQgd2l0aCBhbiBvcGVuIEZpbGUgb2JqZWN0LCBzZWxlY3QgYSBy YW5kb20gbGluZSBvZiBjb250ZW50LgogICMKICAjIE5PVEU6IFRoaXMgdGVzdCBhc3N1bWVzIHlv dSdyZSB1c2luZyBGaWxlI3JlYWQgdG8gZ2V0IHRoZSBzdHJpbmcgZGF0YQogICMgICAgICAgZnJv bSB0aGUgZmlsZSAtIGlmIGRvaW5nIG90aGVyd2lzZSwgdXBkYXRlIHRoZSB0ZXN0PwogIGRlZiB0 ZXN0X3JhbmRvbV9saW5lCiAgICBmaWxlID0gT3BlblN0cnVjdC5uZXcoOnJlYWQgPT4gImRldmVs b3BtZW50OgogIGFkYXB0ZXI6IG15c3FsCiAgZGF0YWJhc2U6IHJlZHZhc2VfZGV2ZWxvcG1lbnQK ICBob3N0OiBsb2NhbGhvc3QKICB1c2VybmFtZTogcm9vdAogIHBhc3N3b3JkOiIpCiAgICBsaW5l cyA9IGZpbGUucmVhZC5zcGxpdCgiXG4iKQogICAgbGluZSA9IE9uZUxpbmVyLnJhbmRvbV9saW5l KGZpbGUpCiAgICBhc3NlcnRfZXF1YWwgdHJ1ZSwgbGluZXMuaW5jbHVkZT8obGluZSkKICBlbmQK ICAKICAjIEdpdmVuIGEgd29uZHJvdXMgbnVtYmVyIEludGVnZXIsIHByb2R1Y2UgdGhlIHNlcXVl bmNlIChpbiBhbiBBcnJheSkuICBBCiAgIyB3b25kcm91cyBudW1iZXIgaXMgYSBudW1iZXIgdGhh dCBldmVudHVhbGx5IHJlYWNoZXMgb25lLCBpZiB5b3UgYXBwbHkKICAjIHRoZSBmb2xsb3dpbmcg cnVsZXMgdG8gYnVpbGQgYSBzZXF1ZW5jZSBmcm9tIGl0LiAgSWYgdGhlIGN1cnJlbnQgbnVtYmVy CiAgIyBpbiB0aGUgc2VxdWVuY2UgaXMgZXZlbiwgdGhlIG5leHQgbnVtYmVyIGlzIHRoYXQgbnVt YmVyIGRpdmlkZWQgYnkgdHdvLgogICMgV2hlbiB0aGUgY3VycmVudCBudW1iZXIgaXMgb2RkLCBt dWx0aXBseSB0aGF0IG51bWJlciBieSB0aHJlZSBhbmQgYWRkCiAgIyBvbmUgdG8gZ2V0IHRoZSBu ZXh0IG51bWJlciBpbiB0aGUgc2VxdWVuY2UuICBUaGVyZWZvcmUsIGlmIHdlIHN0YXJ0IHdpdGgK ICAjIHRoZSB3b25kcm91cyBudW1iZXIgMTUsIHRoZSBzZXF1ZW5jZSBpcyBbMTUsIDQ2LCAyMywg NzAsIDM1LCAxMDYsIDUzLAogICMgMTYwLCA4MCwgNDAsIDIwLCAxMCwgNSwgMTYsIDgsIDQsIDIs IDFdLgogIGRlZiB0ZXN0X3dvbmRyb3VzX3NlcXVlbmNlCiAgICBzZXEgPSBbMjMsIDcwLCAzNSwg MTA2LCA1MywgMTYwLCA4MCwgNDAsIDIwLCAxMCwgNSwgMTYsIDgsIDQsIDIsIDFdCiAgICBhc3Nl cnRfZXF1YWwgc2VxLCBPbmVMaW5lci53b25kcm91c19zZXF1ZW5jZSgyMykKICAgIGFzc2VydF9l cXVhbCBzZXEsIE9uZUxpbmVyLndvbmRyb3VzX3NlcXVlbmNlX3IoMjMpCiAgZW5kCiAgCiAgIyBD b252ZXJ0IGFuIEFycmF5IG9mIG9iamVjdHMgdG8gbmVzdGVkIEhhc2hlcyBzdWNoIHRoYXQgJXdb b25lIHR3byB0aHJlZQogICMgZm91ciBmaXZlXSBiZWNvbWVzIHsib25lIiA9PiB7InR3byIgPT4g eyJ0aHJlZSIgPT4geyJmb3VyIiA9PiAiZml2ZSJ9fX19LgogIGRlZiB0ZXN0X25lc3RlZF9oYXNo CiAgICBoYXNoID0gezpvID0+IHs6dCA9PiB7OnQgPT4gezpmID0+IDpmfX19fQogICAgYXNzZXJ0 X2VxdWFsIGhhc2gsIE9uZUxpbmVyLm5lc3RlZF9oYXNoKFs6bywgOnQsIDp0LCA6ZiwgOmZdKQog ICAgYXNzZXJ0X2VxdWFsIGhhc2gsIE9uZUxpbmVyLm5lc3RlZF9oYXNoX3IoWzpvLCA6dCwgOnQs IDpmLCA6Zl0pCiAgZW5kCmVuZAoK ------=_Part_42541_8283815.1171216920003--