Вычесть строку формата из заданных результатов

#algorithm #format #printf

#алгоритм #формат #printf

Вопрос:

Существует ли существующий алгоритм, чтобы сделать что-то подобное, из нескольких результатов воссоздать исходную строку формата.

Например, вот входные:

 "the fox jumps over the lazy brown dog"
"the man jumps over the lazy black cat"
"the dolphin jumps over the big wave"
 

=> вывод:

 output="the {} jumps over the {}"
 

Существует несколько строк формата, которые работают, но мы должны получить строку с наибольшим количеством символов, которые не принадлежат владельцам мест, и наименьшим количеством владельцев мест.

поскольку в python мы имеем:

 "the fox jumps over the lazy brown dog" = output.format('fox', 'lazy brown dog')
"the man jumps over the lazy black cat" = output.format('man ', 'lazy black cat')
"the dolphin jumps over the big wave" = output.format('dolphin', 'big wave')
 

или даже лучше на C, предполагая, что при достаточном количестве входных данных мы можем получить

 output = "the %s jumps over the %s"
 

Ответ №1:

Насколько мне известно, в стандартных библиотеках такого алгоритма нет. Мы можем рассматривать это как вариант проблемы с самой длинной общей подстрокой, вот идея о том, как это сделать.

Наивный алгоритм был бы примерно таким:

 1. Split the first string, with ' ' (space) as split character and keep this array
   (base_array)

2. For each following input :
    a. Split string with ' ' as split character, let's call this array curr_array

    b. Compare, from left to right, each curr_array entry with the base_array entries and 
       apply the following rule: 
         - match at curr_array[i] and base_array[j]:
               compare curr_array[i 1] and base_array[j 1]

         - no match at curr_array[i] and base_array[j]:
               recurse b. with curr_array[i 1] and base_array[j], if recursion found a
               match at curr_array[i k], continue algorithm from the top of the recursion
               from curr_array[i k 1] and base_array[j 1],

               if recursion was not successful update base_array[j] = "" and continue
               algorithm with curr_array[i] and base_array[j 1]
 

Допустим, у вас есть два входа:

 "this is a very poor and long example"
"this is a good and short example"
 

Когда алгоритм завершится, base_array будет содержать записи, подобные этой:

 [this][is][a][][][and][][example]
 

Затем просто перегруппируйте соседние пустые записи:

 [this][is][a][][and][][example]
 

Замените оставшиеся пустые записи символами по вашему выбору и присоединитесь к списку, чтобы получить желаемый результат

 this is a {} and {} example
 

Надеюсь, это помогло!

Комментарии:

1. Это помогло. Я также нашел инструмент, который работает для моей конкретной проблемы: git diff --word-diff который использует алгоритм, аналогичный приведенному выше.