#groovy #jvm-languages
#groovy #jvm-языки
Вопрос:
У меня есть список, подобный этому, скажем, например, имя списка output
, которое имеет:
[[[o, g], [g, o]], [[o, g, o, d]], [[o, d]], [[t, s, n, e, e, e, n, c, s]], [[t, s, n, e, e]], [[e, n, c, s]]]
И у меня есть такой ввод, скажем input
, как:
ogodtsneeencs
Теперь, очевидно, input
может быть сформирован из output
. Я попробовал subsequences()
из output
, чтобы найти возможные комбинации, которые формируют input
, но дело в том, что это не сработает для всех input
.
Кто-нибудь может сказать мне, как я могу найти комбинации, output
которые будут равны input
? И, возможно, сохранить в некоторых list
.
Заранее спасибо.
Комментарии:
1. Вы говорите
obviously
, но вопрос на самом деле не так очевиден 🙁2. Итак, мы не можем найти? 🙁 хотите удалить мой вопрос?
3. Дело не в том, что мы не можем найти… дело в том, что я не знаю, о чем вы спрашиваете. Вы хотите повторно сгенерировать
ogodtsneeencs
из этого списка? Или вы хотите просто сгенерировать что-то еще?4. да, именно я хочу восстановить
ogodtsneeencs
из списка.. Однако есть много способов восстановить его с помощьюoutput
. Мне нужны все эти способы. Теперь мне ясно?5. @tim_yates: ну, я думал,
subsequences()
сработает. Но дело в том, что это работает только в некоторых случаях. Не во всех случаях…
Ответ №1:
Учитывая только этот небольшой набор предоставленных вами тестовых данных, я придумал это:
def list = [[['o', 'g'], ['g', 'o']], [['o', 'g', 'o', 'd']], [['o', 'd']], [['t', 's', 'n', 'e', 'e', 'e', 'n', 'c', 's']], [['t', 's', 'n', 'e', 'e']], [['e', 'n', 'c', 's']]]
// For every combination of the lists
def result = list.combinations().collect { combination ->
// Join them into strings
combination*.join().with { stringcombo ->
// Then find every string in the list
stringcombo.findAll { word ->
// Which is not a substring of another string in the list
(stringcombo - word).every { it.indexOf( word ) == -1 }
}
}.permutations()*.join() // Then get every String permutation of these remaining strings
}.flatten().unique() // and get them into a single unique list
// And print them out
result.each {
println it
}
Который выводит:
ogodtsneeencs
tsneeencsogod
Без дополнительных данных трудно сказать, правильно ли это, но это может быть хорошей отправной точкой для вас
Редактировать
Обновлено, чтобы вернуть все перестановки допустимых токенов
Комментарии:
1. @Ant обновлен, чтобы вернуть все перестановки допустимых токенов