Cookpad Code Puzzle for RubyKaigi 2022 solutions
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
# https://ruby-puzzles-2022.cookpad.tech/ | |
def answer1(n) | |
n+1 | |
end | |
def answer2(str) | |
str.upcase | |
end | |
def answer3(n) | |
(0..n).to_a | |
end | |
def answer4 | |
yield + 42 | |
end | |
def answer5(n, m=1) | |
n+m | |
end | |
def answer6(n) | |
(n-1).remainder(9)+1 | |
end | |
def answer7(n) | |
# $stderr.puts n.inspect | |
JS.eval("console.log('#{n}')") | |
n.succ | |
end | |
def answer8(n) | |
n.to_s(2).count("1") | |
end | |
class M | |
def method_missing(name, *args) | |
puts "#{name}(" + args.map{_1.inspect}*',' + ")" | |
end | |
end | |
p func9(M.new) | |
def answer9(s) | |
s.gsub("u-g0t-me", "yikes") | |
end | |
$n=func10 | |
def answer10(a=nil) | |
if a | |
$n=0 | |
else | |
$n+=1 | |
end | |
end | |
def answer11(v) | |
v.hash | |
end | |
def answer12(v) | |
v.to_s.chars.sort.chunk{_1}.map{_2.length}.inject(:*) | |
end | |
def answer13(i) | |
e = Encoding.list[i] | |
e && e.name[0..1] | |
end | |
def answer14(i) | |
if i < 0 | |
"M" | |
elsif i < 20 | |
"ZOTTFFSSENTETTFFSSEN"[i] | |
elsif i < 100 | |
answer14(i/10) | |
elsif i < 1000 | |
answer14(i/100) | |
elsif i == 1000 | |
"T" # !? "O"ne thousandでは? | |
else | |
answer14(i/1000) | |
end | |
end | |
def answer15(i) | |
c = Object.constants.map{_1.to_s}.sort[i] | |
c && c[0..1] | |
end | |
p func16{|&a| p a} | |
p func16{|&a| p a[]} | |
def answer16(&blk) | |
called = false | |
blk.call{ | |
called = true | |
} | |
called | |
end | |
def answer17(t) | |
JS.eval("alert('#{t}')") | |
end | |
def answer18(s) | |
s.split(/(\D)/).filter{|tk|tk!=""}.map{|tk| | |
if tk =~ /[0-9]+/ | |
tk.to_i | |
else | |
tk | |
end | |
} | |
end | |
def parse_expr(tokens) | |
e = parse_product(tokens) | |
while !tokens.empty? | |
case tokens[0] | |
when "+", "-" | |
op = tokens.shift | |
e = [op, e, parse_product(tokens)] | |
when ")" | |
break | |
else | |
raise Exception.new("parse error at #{tokens} : current e = #{e}") | |
end | |
end | |
e | |
end | |
def parse_product(tokens) | |
e = parse_value(tokens) | |
while !tokens.empty? | |
case tokens[0] | |
when "*", "/" | |
op = tokens.shift | |
e = [op, e, parse_value(tokens)] | |
else | |
break | |
end | |
end | |
e | |
end | |
def parse_value(tokens) | |
if tokens[0] == "(" | |
tokens.shift | |
e = parse_expr(tokens) | |
if tokens[0] == ")" | |
tokens.shift | |
return e | |
else | |
raise Exception.new("')' not found") | |
end | |
elsif tokens[0].is_a?(Numeric) | |
["value", tokens.shift] | |
else | |
raise Exception.new("parse error at #{tokens}") | |
end | |
end | |
def answer19(tokens) | |
d = tokens.dup | |
parsed = parse_expr(d) | |
if !d.empty? | |
raise Exception.new("parse error at #{d} / parsed: #{parsed}") | |
end | |
parsed | |
end | |
def answer20(ast) | |
op = ast[0] | |
if op == "value" | |
ast[1] | |
else | |
l = answer20(ast[1]) | |
r = answer20(ast[2]) | |
case op | |
when "+" then l+r | |
when "-" then l-r | |
when "*" then l*r | |
when "/" then l/r | |
else | |
raise Exception.new("unknown operator: #{op}") | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment