2013-03-29 3 views
3

저는 스칼라에서 처음 시작했으며 첫 번째 프로젝트에서는 스도쿠 해결사를 쓰고 있습니다. 스도쿠 (Sudoku)를 설명하는 멋진 사이트와 해결 방법을 작성하는 방법에 대해 살펴 보았습니다. http://norvig.com/sudoku.html이 사이트에서 해당 스칼라 코드를 작성하려고합니다.두 문자열의 교차 제품

# 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] 

그것은 생각을 잠시 나를 데려 :

스도쿠 그리드의 사각형은 기본적으로 지능형리스트를 사용하여,이 파이썬에서 정말 쉽게 생성 할 수있는 열 이름과 열 이름의 외적 있습니다 에 대해 어떻게 스칼라에서 우아하게이 작업을 수행하고, 이것이 내가 생각 해낸 것입니다 : 스칼라에서이 일에 더 좋은 방법이 있다면 난 그냥 궁금해서

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

? 어떤 이유로 든 yield i + j을 수행 할 수 있지만 그 결과는 Int 인 경우 훨씬 더 깨끗해 보입니다. 모든 의견이나 제안을 주시면 감사하겠습니다.

+0

'yield i + j'는 'i'와 'j'가 Char 유형이기 때문에 결과가 I가됩니다. – Larsenal

+0

@Larsenal 나는 그것이 일어나고 있다고 가정했는데, 나는 단지'Char' +'Char'에 대한 의미가 그것들을 문자열로 연결할 것이라고 생각했다. 'Char'는 본질적으로'Int'이기 때문에 아마 너무 희망적이었을 것입니다. –

답변

1

예, Char에 대한 덧셈은 정수 등가 값을 더하여 정의됩니다. 나는 당신의 코드가 괜찮다고 생각한다. 또한 문자열 보간을 사용하고 절약 할 수있는 toList (당신은 괜찮 대신 불변의 인덱스 순서 얻을 것이다) :

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

편집

IndexedSeq는 적어도 강력한를 List. 결과를 연속적으로 사용하는지 확인하십시오. List이 필요합니까? 예 : headtail을 사용하고 패턴 일치를 ::으로 사용 하시겠습니까? 그렇지 않은 경우 List을 시행해야하는 이유가 없습니다. 대신 for와 문법 설탕의 입력 인수에 mapflatMap를 사용하는 경우, 직접 List A를 매핑 할 collection.breakOut 인수를 사용할 수 있습니다

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

로 꽤 있지만, 추가 toList보다 더 빨리 없습니다.

+0

보간법은 스칼라 2.10입니다. 그렇지 않으면 비슷한 접근 방식으로' "% s % s".format (i, j)'를 할 수 있습니다. – Larsenal

+0

감사합니다, 그들은 아마 능률의 동일한 수준에 맞았습니까? 어느 쪽이든 당신은 연결해야합니다. 필자가'toList '를 사용하는 이유는 다른 데이터 구조를 구성하기 위해이'List of square'를 사용할 것입니다. 'IndexedSeq'를 사용하는 것이 더 좋을까요? –

+0

스칼라 2.10 REPL에서 보간은'map (j => s "$ i $ j")'내부에서 실패하고,'map (j => i + ""+ j)' 다시. –