func can_make_word(word, blocks) { blocks.map! { |b| b.uc.chars.sort.join }.freq! func(word, blocks) { var char = word.shift var candidates = blocks.keys.grep { |k| 0 <= k.index(char) } for candidate in candidates { blocks{candidate} <= 0 && next; local blocks{candidate} = (blocks{candidate} - 1); return true if (word.is_empty || __FUNC__(word, blocks)); } return false; }(word.uc.chars, blocks) }