Permalink
Cannot retrieve contributors at this time
130 lines (111 sloc)
2.59 KB
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Object | |
@@golf_hash = {} | |
verbose, $VERBOSE = $VERBOSE, nil | |
def method_missing m, *a, &b | |
t = @@golf_hash[ [m, self.class] ] ||= matching_methods(m)[0] | |
if t && b | |
__send__(t, *a) {|*args| | |
b.binding.eval("proc{|golf_matchdata| $~ = golf_matchdata }").call($~) if $~ | |
b.call(*args) | |
} | |
else | |
t ? __send__(t, *a, &b) : super | |
end | |
end | |
$VERBOSE = verbose | |
def matching_methods(s = '', m = callable_methods) | |
r = /^#{s.to_s.gsub(/./){"(.*?)" + Regexp.escape($&)}}/ | |
m.grep(r).sort_by do |i| | |
i.to_s.match(r).captures.map(&:size) << i | |
end | |
end | |
def self.const_missing c | |
t = @@golf_hash[ [c,self.class] ] ||= matching_methods(c, constants)[0] | |
t and return const_get(t) | |
raise NameError, "uninitialized constant #{c}", caller(1) | |
end | |
def shortest_abbreviation(s = '', m = callable_methods) | |
s = s.to_s | |
our_case = (?A..?Z) === s[0] | |
if m.index(s.to_sym) | |
1.upto(s.size){|z| s.scan(/./).combination(z).map{|trial| | |
next unless ((?A..?Z) === trial[0]) == our_case | |
trial *= '' | |
return trial if matching_methods(trial, m)[0].to_s == s | |
}} | |
else | |
nil | |
end | |
end | |
def callable_methods | |
self.class == Object ? methods + private_methods : methods | |
end | |
private | |
def h(a = 'H', b = 'w', c = '!') | |
puts "#{a}ello, #{b}orld#{c}" | |
end | |
def f(m = 100) | |
1.upto(m){|n|puts'FizzBuzz | |
'[i=n**4%-15,i+13]||n} | |
end | |
alias say puts | |
def do_while | |
0 while yield | |
end | |
def do_until | |
0 until yield | |
end | |
end | |
class Array | |
alias old_to_s to_s | |
alias to_s join | |
end | |
class FalseClass | |
alias old_to_s to_s | |
def to_s | |
"" | |
end | |
end | |
class Integer | |
alias each times | |
include Enumerable | |
end | |
class String | |
alias / split | |
def to_a | |
split('') | |
end | |
(Array.instance_methods - instance_methods - %i[to_ary transpose flatten flatten! compact compact! assoc rassoc]).each{|meth| | |
eval " | |
def #{meth}(*args, &block) | |
a = to_a | |
result = a.#{meth}(*args, &block) | |
replace(a.join) | |
if result.class == Array | |
Integer === result[0] ? result.pack('c*') : result.join | |
elsif result.class == Enumerator | |
result.map(&:join).to_enum | |
else | |
result | |
end | |
end" | |
} | |
end | |
class Enumerator | |
alias old_to_s to_s | |
(Array.instance_methods - instance_methods - [:replace] + [:to_s]).each{|meth| | |
eval " | |
def #{meth}(*args, &block) | |
to_a.#{meth}(*args, &block) | |
end" | |
} | |
alias old_inspect inspect | |
alias inspect old_to_s | |
end | |
class Symbol | |
def call(*args, &block) | |
proc do |recv| | |
recv.__send__(self, *args, &block) | |
end | |
end | |
end |