#111
Crossword puzzle
 

Difficulty:Hard
Topics:game


Write a function that takes a string and a partially-filled crossword puzzle board, and determines if the input string can be legally placed onto the board.

The crossword puzzle board consists of a collection of partially-filled rows. Empty spaces are denoted with an underscore (_), unusable spaces are denoted with a hash symbol (#), and pre-filled spaces have a character in place; the whitespace characters are for legibility and should be ignored.

For a word to be legally placed on the board:
- It may use empty spaces (underscores)
- It may use but must not conflict with any pre-filled characters.
- It must not use any unusable spaces (hashes).
- There must be no empty spaces (underscores) or extra characters before or after the word (the word may be bound by unusable spaces though).
- Characters are not case-sensitive.
- Words may be placed vertically (proceeding top-down only), or horizontally (proceeding left-right only).
test not run
(= true  (__ "the" ["_ # _ _ e"]))
test not run
(= false (__ "the" ["c _ _ _"
                    "d _ # e"
                    "r y _ _"]))
test not run
(= true  (__ "joy" ["c _ _ _"
                    "d _ # e"
                    "r y _ _"]))
test not run
(= false (__ "joy" ["c o n j"
                    "_ _ y _"
                    "r _ _ #"]))
test not run
(= true  (__ "clojure" ["_ _ _ # j o y"
                        "_ _ o _ _ _ _"
                        "_ _ f _ # _ _"]))


Code which fills in the blank: