    import java.util.Arrays

    /*
        Swap elements i and j of a Kotlin Array.
     */
    fun <T> Array<T>.swap(i: Int, j: Int) {
        val tmp = this[i]
        this[i] = this[j]
        this[j] = tmp
    }

    data class Block(val block: String)

    /*
     *  Not the most elegant way but interesting from an highlighting perspective ;)
     */
    public class ABC() {
        class object {

            public fun canMakeWord(word: String, blocks: Array<Block>): Boolean {
                if (word.length() == 0)
                    return true

                val c = Character.toUpperCase(word.charAt(0))
                for (i in 0..blocks.size - 1) {
                    val b = blocks[i]
                    if (Character.toUpperCase(b.block.charAt(0)) != c && Character.toUpperCase(b.block.charAt(1)) != c)
                        continue
                    blocks.swap(0, i)
                    if (canMakeWord(word.substring(1), Arrays.copyOfRange(blocks, 1, blocks.size)))
                        return true
                    blocks.swap(0, i)
                }

                return false
            }

            public fun main(args: Array<String>) {

                val blocksString = array("BO", "XK", "DQ", "CP", "NA", "GT", "RE", "TG", "QD", "FS", "JW",
                                                 "HU", "VI", "AN", "OB", "ER", "FS", "LY", "PC", "ZM");

                val blocks = Array(blocksString.size, { s -> Block(blocksString[s])})

                val words = array("", "A", "BARK", "book", "treat", "COMMON", "SQuAd", "CONFUSE");

                for (word in words) {
                    System.out.println("${word}: " + canMakeWord("${word}", blocks))
                }

            }
        }
    }

    fun main(args: Array<String>) = ABC.main(args)