Как я могу найти возможные комбинации, которые формируют данный ввод

#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 обновлен, чтобы вернуть все перестановки допустимых токенов