Dive into Coding Life

AtCoder:6 ABC083B – Some Sums

25/12/2020

https://atcoder.jp/contests/abs/tasks/abc083_b
問題文は上記リンクを参照。

KotlinではreadLine()を使えば以下のように1行で変数の初期化ができますね。

val (n, a, b) = readLine()!!.split(" ").map { it.toInt() }

入力を文字列として読み込むので空白で区切り、各値をInt型にキャストして変数を初期化します。

閑話休題

値を読み込んだ後、各値の計算から出力処理まで1行で処理をしている人がいました。

println((0..n).filter { “$it".map { “$it".toInt() }.sum() in a..b }.sum())

https://atcoder.jp/contests/abs/submissions/18082269

filterはコレクションの各要素に対しある条件(ラムダ)を当てはめ、合致する要素をListとして返します。
mapはコレクションの各要素に対しある処理(ラムダ)を行い、その結果をListとして返します。
各処理を細かく見ていくと以下のようになっています。

println((0..n).filter { // (0..20)コレクションで、flterを適用します
    "$it".map { //(0..20)コレクションの各値に対し処理を行います
        "$it".toInt() //(0..20)コレクションの各桁の値$itはchar型で渡されるのでInt型にキャストします(mapの処理ラムダ)
    }.sum() in a..b //Int型にキャストされた(0..20)コレクションの各桁の値の合計がa..bの条件に当てはまっているかfilterします(filterの処理ラムダ)
}.sum()) // 条件に当てはまっているfilterの結果(List<Int>型)を合計し標準出力します

mapの処理がループ処理として最初に実行され、その結果に対しfilterの処理が行われます。
分割した方がわかりやすいでしょう。

val filterList = (0..n).filter { // (0..20)コレクションで、flterを適用します
    val mapList = "$it".map { //(0..20)コレクションの各値に対し処理を行い
        "$it".toInt() //(0..20)コレクションの各桁の値$itはchar型で渡されるのでInt型にキャストします(mapの処理ラムダ)
    } //mapListを作成します
	mapList.sum() in a..b //mapListの各値がa..bの条件に当てはまっているかfilterします(filterの処理ラムダ)
} //filterListを作成します
println(filterList.sum()) // 条件に当てはまっているfilterの結果(List<Int>型)を合計し標準出力します

中々ややこしいですね。

参考

Kotlinのコレクションクラスの各メソッドをまとめて紹介している情報がありましたので参考までに。
Kotlin のコレクション使い方メモ
https://qiita.com/opengl-8080/items/36351dca891b6d9c9687