-
Notifications
You must be signed in to change notification settings - Fork 36
/
Copy pathGravity-Tumbler.kt
77 lines (64 loc) · 2.02 KB
/
Gravity-Tumbler.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package easy.gravityTumbler
import java.util.*
// https://www.codingame.com/ide/puzzle/gravity-tumbler
enum class Puzzle(val char: Char) {
HEAVY_BIT('#'),
EMPTY_BIT('.'),
}
/**
* Print n-Times c-Char.
*/
fun printNChar(n: Int, c: Char) =
run {
(0 until n).forEach { print(c) }
}
fun main(args: Array<String>) {
val input = Scanner(System.`in`)
val width = input.nextInt()
val height = input.nextInt()
// gravityToRightMode(true) when count is even: height lines of width characters.
// else(false) when count is odd: width lines of height characters.
val gravityToRightMode = when {
input.nextInt() % 2 == 0 -> true
else -> false
}
// Trim whitespace
if (input.hasNextLine()) {
input.nextLine()
}
// for index 'i' in histogram array:
// histogram[i] = number of '#' in line i.
val inputHistogram = IntArray(height) { input.nextLine().count { it == '#' } }
// easy.gravityTumbler.gravityTumbler.transform input array (inputHistogram) according to input mode.
val transformed = when {
gravityToRightMode -> inputHistogram
else -> transform(array = inputHistogram, transformedSize = width)
}
// Print with applying the gravity mode
transformed.forEach {
printNChar(
when {
gravityToRightMode -> width
else -> height
} - it, Puzzle.EMPTY_BIT.char
)
printNChar(it, Puzzle.HEAVY_BIT.char)
println()
}
}
/**
* easy.gravityTumbler.gravityTumbler.transform L lines R rows to array of R line L rows,
* transformation according to puzzle rules,
* which means the '#' will "fall" by gravity.
*/
fun transform(array: IntArray, transformedSize: Int): IntArray {
val transformed = IntArray(transformedSize)
for (i in array.indices.reversed()) {
for (j in transformed.indices.reversed()) {
if (array[i] == 0) break
++transformed[j]
--array[i]
}
}
return transformed
}