// TARGET_BACKEND: JVM // WITH_STDLIB // FULL_JDK package mask import java.io.* import java.util.* fun box() : String { val input = StringReader("/aaa/bbb/ccc/ddd") val luhny = Luhny() input.forEachChar { luhny.charIn(it) } luhny.printAll() return "OK" } class Luhny() { val buffer = LinkedList() val digits = LinkedList() var toBeMasked = 0 fun charIn(it : Char) { buffer.push(it) // Commented for KT-621 // when (it) { // .isDigit() => digits.push(it.toInt() - '0'.toInt()) // ' ', '-' => {} // else => { // printAll() // digits.clear() // } // } if (it.isDigit()) { digits.push(it - '0') } else if (it == ' ' || it == '-') { } else { printAll() digits.clear() } if (digits.size > 16) printOneDigit() check() } fun check() { if (digits.size < 14) return val sum = digits.sum { i, d -> if (i % 2 != 0) d * 2 / 10 + d * 2 % 10 else d } if (sum % 10 == 0) toBeMasked = digits.size } fun printOneDigit() { while (!buffer.isEmpty()) { val c = buffer.pop() out(c) if (c.isDigit()) { digits.pop() return } } } fun printAll() { while (!buffer.isEmpty()) out(buffer.pop()) } fun out(c : Char) { if (toBeMasked > 0) { print('X') toBeMasked-- } else { // print(c) } } } fun LinkedList.sum(f : (Int, Int) -> Int) : Int { var sum = 0 var i = 0 for (d in backwards()) { sum += f(i, d) i++ } return sum } fun List.backwards() : Iterable = object : Iterable { override fun iterator() : Iterator = object : Iterator { var current = size override fun next() : T = get(--current) override fun hasNext() : Boolean = current > 0 } } // fun Char.isDigit() = Character.isDigit(this) //class Queue(initialBufSize : Int) { // // private var bufSize = initialBufSize // private val buf = Array(initialBufSize) // private var head = 0 // private var tail = 0 // private var size = 0 // // val empty : Boolean get() = size == 0 // // private fun prev(i : Int) = (bufSize + i - 1) % bufSize // private fun next(i : Int) = (i + 1) % bufSize // // fun push(c : T) { // buf[tail] = c // tail = prev(tail) // size++ // } // // fun pop() : T { // if (size == 0) throw IllegalStateException() // size-- // val result = buf[head] // head = prev(head) // return result // } // // fun clear() {} //} fun Reader.forEachChar(body : (Char) -> Unit) { do { var i = read(); if (i == -1) break body(i.toChar()) } while(true) }