Skip to content

Instantly share code, notes, and snippets.

@youz
Last active September 13, 2022 03:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save youz/906cc05baa737682bfc2b8ff00dd25e4 to your computer and use it in GitHub Desktop.
Save youz/906cc05baa737682bfc2b8ff00dd25e4 to your computer and use it in GitHub Desktop.
Cookpad Code Puzzle for RubyKaigi 2022 solutions
# 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