Ela*_*ich 3 arrays functional-programming scala matrix
我正在尝试解决一些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
Run Code Online (Sandbox Code Playgroud)
其中矩阵的每个元素由三个整数组成.所以这个例子应该转换为
#!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),
)
Run Code Online (Sandbox Code Playgroud)
一种必要的解决方案就是形式
#!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)
Run Code Online (Sandbox Code Playgroud)
我想到的功能解决方案是
#!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
}
Run Code Online (Sandbox Code Playgroud)
但我真的觉得这是错误的方式,因为:
List每一行的功能结构,然后将其转换为数组.整个代码似乎不那么有效什么是正确的功能方式呢?
val x = """2 3
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 0
"""
val a = x split "\n" map (_.trim.split(" "))
val rows = a(0)(0).toInt
val columns = a(0)(1).toInt
val matrix = (a drop 1) map (_ grouped columns toList) toList
Run Code Online (Sandbox Code Playgroud)
并打印结果:
matrix.map(_.map(_.mkString("(",",",")")).mkString("(",",",")")).mkString("\n")
res1: String =
((1,2,3),(4,5,6),(7,8,9))
((2,3,4),(5,6,7),(8,9,0))
Run Code Online (Sandbox Code Playgroud)
假设:
assert(rows == matrix.length)
assert(matrix.forall(_.forall(_.size == columns)))
Run Code Online (Sandbox Code Playgroud)
生产阵列tabulate更合适:
val a = x split "\n" map (_.trim.split(" "))
val rows = a(0)(0).toInt
val columns = a(0)(1).toInt
val matrix = Array.tabulate(rows, a(1).size / columns, columns)(
(i,j,k) => a(i + 1)(j * columns + k))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |