Стандартная функция для перечисления всех строк заданной длины по заданному алфавиту - PullRequest
0 голосов
/ 14 ноября 2011

Предположим, у меня есть алфавит из N символов и я хочу перечислить все различные строки длины M по этому алфавиту. Предоставляет ли Scala стандартную библиотечную функцию для этого?

Ответы [ 2 ]

3 голосов
/ 14 ноября 2011

Вдохновившись другим ответом :

val letters = Seq("a", "b", "c")
val n = 3

Iterable.fill(n)(letters) reduceLeft { (a, b) =>
    for(a<-a;b<-b) yield a+b
}

Seq[java.lang.String] = List(aaa, aab, aac, aba, abb, abc, aca, acb, acc, baa, bab, bac, bba, bbb, bbc, bca, bcb, bcc, caa, cab, cac, cba, cbb, cbc, cca, ccb, ccc)

Для работы с чем-то, кроме строк:

val letters = Seq(1, 2, 3)

Iterable.fill(n)(letters).foldLeft(List(List[Int]())) { (a, b) =>
    for (a<-a;b<-b) yield(b::a)
}

Необходима дополнительная аннотация типанемного раздражает, но без него работать не будет (если кто-то не знает другого пути).

2 голосов
/ 15 ноября 2011

Другое решение:

val alph = List("a", "b", "c")
val n = 3

alph.flatMap(List.fill(alph.size)(_))
    .combinations(n)
    .flatMap(_.permutations).toList

Обновление : Если вы хотите получить список строк в выводе, тогда alph должна быть строкой.

val alph = "abcd"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...