3

私は Scala を使い始めたばかりで、最初のプロジェクトで数独ソルバーを書いています。Sudoku とソルバーの作成方法を説明しているすばらしいサイト ( http://norvig.com/sudoku.html ) に出会い、このサイトから対応する Scala コードを作成しようとしています。

数独グリッドの正方形は、基本的に行名と列名の外積です。これは、リスト内包表記を使用して Python で非常に簡単に生成できます。

# cross("AB", "12") = ["A1", "A2", "B1", "B2"]
def cross(A, B):
    "Cross product of elements in A and elements in B."
    return [a+b for a in A for b in B]

Scala でこれをエレガントに行う方法を考えるのにしばらく時間がかかりましたが、これが私が思いついたものです。

// cross("AB", "12") => List[String]("A1", "A2", "B1", "B2")
def cross(r: String, c: String) = {
   for(i <- r; j <- c) yield i + "" + j
}.toList

Scalaでこれを行うためのより良い方法があるかどうか、私はただ興味がありましたか? できればもっときれいに見えますが、それは何らかの理由yield i + jで結果になります。Intコメントや提案をいただければ幸いです。

4

1 に答える 1

1

はい、の加算Charは、同等の整数を加算することによって定義されます。あなたのコードは問題ないと思います。また、文字列補間を使用して、を節約することもできますtoList(代わりに、不変のインデックス付きシーケンスが得られますが、これは問題ありません)。

def cross(r: String, c: String) = for(i <- r; j <- c) yield s"$i$j"

編集

AnIndexedSeqは少なくとも と同じくらい強力Listです。結果の連続使用を確認するだけです。それは必要Listですか?headたとえば、 andtailと パターン マッチを と使用しますか::。そうでない場合は、強制する必要がある理由はありませんList。入力引数で と のシンタックス シュガーの代わりに とmapを使用する場合、引数を使用して に直接マップできます。flatMapforcollection.breakOutList

def cross(r: String, c: String): List[String] = 
  r.flatMap(i => c.map(j => s"$i$j"))(collection.breakOut)

それほどきれいではありませんが、extra よりも高速ですtoList

于 2013-03-29T22:56:57.983 に答える