import java.util.Arrays /* Swap elements i and j of a Kotlin Array. */ fun Array.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): 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) { 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) = ABC.main(args)