Open6

「Advent of Code 2022」を Kotlin で解く

mskmsk

概要

「Advent of Code 2022」を Kotlin で解く

mskmsk
mskmsk

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()}
mskmsk

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()
    }
mskmsk
mskmsk

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")
    }
}