@@ -15,56 +15,61 @@ fun main() {
1515 parsedInput.forEach {
1616 val map = it.first().groupBy { it.length }.toSortedMap()
1717
18- val one = map[2 ]!! .first()
19- val four = map[4 ]!! .first()
20- val seven = map[3 ]!! .first()
21- val eight = map[7 ]!! .first()
18+ val segments = Array (10 ) { " " }
19+
20+ // 1, 4, 7, 8 have unique segment count
21+ segments[1 ] = map[2 ]!! .first().sortAlphabetically()
22+ segments[4 ] = map[4 ]!! .first().sortAlphabetically()
23+ segments[7 ] = map[3 ]!! .first().sortAlphabetically()
24+ segments[8 ] = map[7 ]!! .first().sortAlphabetically()
25+
26+ val digitsWith5Segments = map[5 ]!! .toMutableList() // 2, 3, 5 have 5 segments
2227
23- val digitsWith5Segments = map[5 ]!! .toMutableList()
2428 // 3 =
25- val threeIndex = digitsWith5Segments.indexOfFirst { it.contains(one[ 0 ]) && it.contains(one [1 ]) }
26- val three = digitsWith5Segments.removeAt(threeIndex)
29+ val threeIndex = digitsWith5Segments.indexOfFirst { it.contains(segments[ 1 ][ 0 ]) && it.contains(segments[ 1 ] [1 ]) }
30+ segments[ 3 ] = digitsWith5Segments.removeAt(threeIndex).sortAlphabetically( )
2731
2832 // 5 =
29- val fiveHint = four .replace(one[ 0 ].toString(), " " ).replace(one [1 ].toString(), " " )
33+ val fiveHint = segments[ 4 ] .replace(segments[ 1 ][ 0 ].toString(), " " ).replace(segments[ 1 ] [1 ].toString(), " " )
3034 val fiveIndex = digitsWith5Segments.indexOfFirst { it.contains(fiveHint[0 ]) && it.contains(fiveHint[1 ]) }
31- val five = digitsWith5Segments.removeAt(fiveIndex)
35+ segments[ 5 ] = digitsWith5Segments.removeAt(fiveIndex).sortAlphabetically( )
3236
3337 // 2 =
34- val two = digitsWith5Segments.first()
38+ segments[2 ] = digitsWith5Segments.first().sortAlphabetically()
39+
40+ val digitsWith6Segments = map[6 ]!! .toMutableList() // 0, 6, 9 have 6 segments
3541
36- val digitsWith6Segments = map[6 ]!! .toMutableList()
3742 // 6 =
38- val sixIndex = digitsWith6Segments.indexOfFirst { it.contains(one[ 0 ]) xor it.contains(one [1 ]) }
39- val six = digitsWith6Segments.removeAt(sixIndex)
43+ val sixIndex = digitsWith6Segments.indexOfFirst { it.contains(segments[ 1 ][ 0 ]) xor it.contains(segments[ 1 ] [1 ]) }
44+ segments[ 6 ] = digitsWith6Segments.removeAt(sixIndex).sortAlphabetically( )
4045
4146 // 0
42- val zeroHint = eight
43- .replace(four [0 ].toString(), " " )
44- .replace(four [1 ].toString(), " " )
45- .replace(four [2 ].toString(), " " )
46- .replace(four [3 ].toString(), " " )
47- .replace(seven [0 ].toString(), " " )
48- .replace(seven [1 ].toString(), " " )
49- .replace(seven [2 ].toString(), " " )
47+ val zeroHint = segments[ 8 ]
48+ .replace(segments[ 4 ] [0 ].toString(), " " )
49+ .replace(segments[ 4 ] [1 ].toString(), " " )
50+ .replace(segments[ 4 ] [2 ].toString(), " " )
51+ .replace(segments[ 4 ] [3 ].toString(), " " )
52+ .replace(segments[ 7 ] [0 ].toString(), " " )
53+ .replace(segments[ 7 ] [1 ].toString(), " " )
54+ .replace(segments[ 7 ] [2 ].toString(), " " )
5055 val zeroIndex = digitsWith6Segments.indexOfFirst { it.contains(zeroHint[0 ]) && it.contains(zeroHint[1 ]) }
51- val zero = digitsWith6Segments.removeAt(zeroIndex)
56+ segments[ 0 ] = digitsWith6Segments.removeAt(zeroIndex).sortAlphabetically( )
5257
5358 // 9 =
54- val nine = digitsWith6Segments.first()
59+ segments[ 9 ] = digitsWith6Segments.first().sortAlphabetically ()
5560
5661 val output = it[1 ].map {
57- when (it.toCharArray().sorted().joinToString( " " )) {
58- zero.toCharArray().sorted().joinToString( " " ) -> 0
59- one.toCharArray().sorted().joinToString( " " ) -> 1
60- two.toCharArray().sorted().joinToString( " " ) -> 2
61- three.toCharArray().sorted().joinToString( " " ) -> 3
62- four.toCharArray().sorted().joinToString( " " ) -> 4
63- five.toCharArray().sorted().joinToString( " " ) -> 5
64- six.toCharArray().sorted().joinToString( " " ) -> 6
65- seven.toCharArray().sorted().joinToString( " " ) -> 7
66- eight.toCharArray().sorted().joinToString( " " ) -> 8
67- nine.toCharArray().sorted().joinToString( " " ) -> 9
62+ when (it.sortAlphabetically( )) {
63+ segments[ 0 ] -> 0
64+ segments[ 1 ] -> 1
65+ segments[ 2 ] -> 2
66+ segments[ 3 ] -> 3
67+ segments[ 4 ] -> 4
68+ segments[ 5 ] -> 5
69+ segments[ 6 ] -> 6
70+ segments[ 7 ] -> 7
71+ segments[ 8 ] -> 8
72+ segments[ 9 ] -> 9
6873 else -> throw Error ()
6974 }.toString()
7075
@@ -85,3 +90,5 @@ fun main() {
8590 println (part2(input))
8691}
8792
93+ private fun String.sortAlphabetically () = toCharArray().sorted().joinToString(" " )
94+
0 commit comments