Open6
「Advent of Code 2022」を Kotlin で解く
概要
「Advent of Code 2022」を Kotlin で解く
Day01
問題
解説
Part 1
以下のような入力が与えられたときに、改行までを 1 グループとして、1 グループの合計が最も大きな値を求める。
1000
2000
3000
4000
5000
6000
7000
8000
9000
10000
split で分割する。
改行の split は "\n\n"
?
input.split("\n\n")
すると、改行された文字列の配列が生成される。
さらに、文字列ごとに lines()
で分割して、map で配列に変換するときに Int にキャストする
val data = input.split("\n\n").map { elf -> elf.lines().map { it.toInt() } }
maxOf{ it.sum()}
で配列の合計値を算出しておわり。
data.maxOf {it.sum()}
Part2
コレクション操作を追加する。
- part 1 で配列ごとの合計を持った配列に変更
data.map{ it.sum() }
- 逆順に sort
sorted().reversed()
- 3 つ目までの要素を取得
take(3)
- 合計をとる
sum
fun part2(input: String): Int {
val data = input.split("\n\n").map { elf -> elf.lines().map { it.toInt() } }
return data.map { it.sum() }.sorted().reversed().take(3).sum()
}
Day02
問題
解説
part1
じゃんけんの問題。
- 相手がA、B、C。自分が、X、Y、Z
- グーパーチョキの順番
- 勝ちで6、引き分けで3、負けで0ポイント入る
- グーで1、パーで2、チョキで3ポイントはいる
A Y
B X
C Z
連続した文字列に連番の数字を割り当てたいときには、Char 型が便利。
fun shapeScore(shape: Char) = (shape - 'X' + 1)
String 型に分割宣言のためのcomponent を持たせると、char 型になる。
operator fun String.component1() = this[0]
operator fun String.component2() = this[1]
operator fun String.component3() = this[2]
when 式の良い使い方。hashmap でやるよりも明確だった。
fun resultScore(theirShape: Char, myShape: Char): Int {
return when (theirShape to myShape) {
'B' to 'X', 'C' to 'Y', 'A' to 'Z' -> 0
'A' to 'X', 'B' to 'Y', 'C' to 'Z' -> 3
'C' to 'X', 'A' to 'Y', 'B' to 'Z' -> 6
else -> error("Check your inputs")
}
}