私は関数型プログラミングにかなり慣れていないので、いくつかの練習問題を行っています。一意の自然の行列、たとえば5x5が与えられた場合に、関数を記述したいと思います。たとえば、3x3のように、より小さなサイズの一意の行列のコレクションを返します。ここで、行列はそのままである必要があります。つまり、元の値に隣接する値から作成されます。
01 02 03 04 05
06 07 08 09 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
単純。3つのグループで1つずつ横にスライドしてから下にスライドするだけで、次のようなものが得られます。
01 02 03 | 02 03 04 | 03 04 05 | 06 07 08
06 07 08 | 07 08 09 | 08 09 10 | 11 12 13
11 12 13 | 12 13 14 | 13 14 15 | 16 17 18
または、Scalaでは
List(List(1, 2, 3), List(6, 7, 8), List(11, 12, 13))
List(List(2, 3, 4), List(7, 8, 9), List(12, 13, 14))
List(List(3, 4, 5), List(8, 9, 10), List(13, 14, 15))
List(List(6, 7, 8), List(11, 12, 13), List(16, 17, 18))
などなど...
それで、私はScala(命令型から機能型に進化することができるので私の選択した言語)に挑戦し、ここ数年はJavaで過ごしました。
val array2D = "01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25".grouped(3).map(_.trim.toInt).grouped(5)
val sliced = array2D.map(row => row.sliding(3, 1).toList).sliding(3, 1).toList
これで、作業できるデータ構造ができましたが、機能的な方法がわかりません。確かに、私は各ピースをトラバースしsliced
、作成し、var matrix = new ListBuffer[Seq[Int]]()
それらのバッグを作成することができます。これで完了です。
Scalaを使用して、機能的で理想的にはポイントフリーのアプローチを見つけたいのですが、困惑しています。3などでzipする方法が必要です...ScalaDocsを検索しましたが、理解できないようです。