1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
available, desired = DATA.read.split("\n\n")
available = available.split(", ")
desired = desired.lines(chomp: true)

available_r = Regexp.new("^(#{available.join(?|)})+$")
pp desired.select { _1 =~ available_r }.size

ways = Hash.new {|h,k|
  h[k] = available
    .select { k.start_with?(_1) }
    .map { k.sub(_1, "") }
    .sum { h[_1] }
}
ways[""] = 1

pp desired.sum { ways[_1] }

__END__