全ての組み合わせ
Posted feedbacks - Scala
結果は(見易さのために改行を足しましたが)こんな感じです。
scala> crossproduct(List(1,2,3), List(4,5,6))
res14: List[List[Int]] =
List(List(1, 4), List(1, 5), List(1, 6),
List(2, 4), List(2, 5), List(2, 6),
List(3, 4), List(3, 5), List(3, 6))
scala> crossproduct(List(1,2),List(4,5),List(6,7))
res15: List[List[Int]] =
List(List(1, 4, 6), List(1, 4, 7), List(1, 5, 6), List(1, 5, 7),
List(2, 4, 6), List(2, 4, 7), List(2, 5, 6), List(2, 5, 7))
1 2 3 4 5 6 | def crossproduct[T](xss: List[T]*) = {
var ps = List(List[T]())
for (xs <- xss.reverse)
ps = for (i <- xs; j <- ps) yield i::j
ps
}
|
1行にしてみました。
1 2 3 4 5 6 7 | def crossProduct(as:List[Any]*) = {
as.reverse./:(List(List[Any]())){for(i <-_; j <-_) yield j::i}
}
println(crossProduct(List(1,2,3,4), List('a', 'b', 'c')))
println(crossProduct(List(0,1), List('a', 'b'), List("Foo", "Bar")))
|




zigorou #3400() Rating0/0=0.00
Pythonで表現すると下のようになります。
順番はこの通りでなくても構いません。返すものはリストと書きましたが、 なんらかの「一度に全部をメモリ上に作成しないリスト状のモノ」がある言語ではそちらを使う方がおすすめです。 数値や文字列を一つのリストに混在させるのがやっかいな言語では整数のリストに限定しても構いません。このお題はZIGOROuさんとのやりとりにヒントを得て作りました。 (しまった、先にブログで公開されてしまった→Yet Another Hackadelic - 直積の導出と考えうる全ての値を網羅したハッシュの生成)
追記:サンプル出力が間違っていたのでoceanさんの解答を使って出力し直しました。
[ reply ]