Я довольно новичок в функциональном программировании, поэтому я прохожу некоторые практические упражнения. Я хочу написать функцию, по заданной матрице уникальных натуральных чисел, скажем 5х5, возвращающую набор уникальных матриц меньшего размера, скажем 3х3, где матрицы должны быть целыми, т.е. созданными из значений, которые в оригинале соседствуют.
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, чтобы получить что-то вроде:
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
или, в Скала,
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 или что-то в этом роде... Я искал ScalaDocs и не могу понять это.