Я пытаюсь решить некоторые проблемы, Google Code Jam, где входная матрица, как правило, данные в этой форме:Функциональный способ получить матрицу из текста
2 3 #matrix dimensions
1 2 3 4 5 6 7 8 9 # all 3 elements in the first row
2 3 4 5 6 7 8 9 0 # each element is composed of three integers
, где каждый элемент матрицы состоит из , скажем, три целых числа. Так что этот пример должен быть преобразован в
#!scala
Array(
Array(A(1,2,3),A(4,5,6),A(7,8,9),
Array(A(2,3,4),A(5,6,7),A(8,9,0),
)
Императивный решение будет иметь вид
#!python
input = """2 3
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 0
"""
lines = input.split('\n')
class Aclass:
def __init__(self,a,b,c):
pass
print lines[0]
m,n = (int(x) for x in lines[0].split())
array = []
row = []
A = []
for line in lines[1:]:
for elt in line.split():
A.append(elt)
if len(A)== 3:
row.append(Aclass(A[0],A[1],A[2]))
A = []
array.append(row)
row = []
from pprint import pprint
pprint(array)
функциональное решение, которое я надумал это
#!scala
def splitList[A](l:List[A],i:Int):List[List[A]] = {
if (l.isEmpty) return List[List[A]]()
val (head,tail) = l.splitAt(i)
return head :: splitList(tail,i)
}
def readMatrix(src:Iterator[String]):Array[Array[TrafficLight]] = {
val Array(x,y) = src.next.split(" +").map(_.trim.toInt)
val mat = src.take(x).toList.map(_.split(" ").
map(_.trim.toInt)).
map(a => splitList(a.toList,3).
map(b => TrafficLight(b(0),b(1),b(2))
).toArray
).toArray
return mat
}
Но я действительно чувствую, что это неправильный путь, потому что:
- Я используя функциональную структуру
List
для каждой строки, а затем преобразуйте ее в массив. Весь код выглядит намного менее efficeint - Я нахожу его более менее элегантным и гораздо менее читаемым, чем решение python. Сложнее определить, какая из функций карты работает над тем, что, поскольку все они используют одну и ту же семантику.
Каков правильный функциональный способ сделать это?
Будет ли scala быть языком тогда? Если не на каком языке вы используете? Я знаю, что вы после функционального способа сделать это, но хороший класс, вероятно, предоставит вам гораздо лучшее решение. – thecoshman
@thecoshman - это язык, через который я передаю идеи FP. Мне это не нужно для практических целей, я просто изучаю FP. Я знаю Scala, а не Haskell, поэтому я использовал его, но я мог бы сделать это на каждом достаточно функциональном языке (даже python довольно функциональный). Возможно, действительно, эта задача больше подходит для императивного/OO-подхода, но я все еще ищу лучшее функциональное решение. –
Как бы выглядели данные матрицы 3x2? –