Составное слово - это слово, содержащее 2 или более слов. Мы можем сделать лучше, чем это, хотя. Нам нужно, чтобы вы создали 1 (бессмысленное) слово, которое содержит каждое слово .
Однако мы хотим, чтобы это слово было как можно более коротким. Мы можем использовать перекрывающиеся буквы для достижения этой цели.
Например, если ваш список слов был ["cat", "atom", "a"]
, вы хотели бы вернуться "catom"
.
Ввод, вывод
Ваша программа должна будет взять список слов в качестве входных данных и вернуть составное слово в качестве выходных данных.
По словам Google, список слов, который вы будете использовать, - это первые 10000 слов на английском языке (если этот список окажется слишком простым, я могу изменить его на более длинный). Для справки, просто добавив каждое слово, вы получите 65888 баллов.
Ваша оценка - это количество букв в вашем последнем слове, чем меньше, тем лучше. Галстук идет к первому постеру.
источник
Ответы:
C ++, конечная длина слова: 38272
(оптимизированная версия заняла около 20 минут)
Проверка Bash однострочно:
Это также произвело некоторые довольно прохладные слова в процессе. Вот некоторые из моих любимых:
А также:
Окончательный результат находится на pastebin здесь: http://pastebin.com/j3qYb65b
источник
max_word_length - overlap(word[i], word[j])
(гдеoverlap
проверяется перекрытие справа от первый аргумент слева от второго). Решение этой проблемы (удачи!), Затем обрезание получающегося цикла с наивысшей стоимостью (с наименьшим перекрытием) даст упорядоченный список слов, которые можно объединить, чтобы получить оптимальное решение.C ++ 11, 38272 буквы, доказано оптимальным
Этот алгоритм гарантированно обеспечивает нижнюю границу решения. В этом случае он может достичь нижней границы и вывести оптимальное 38272 буквенное решение. (Это соответствует решению, найденному жадным алгоритмом Дейва. Я был удивлен и немного разочарован, обнаружив, что это оптимально, но мы здесь.)
Он работает путем решения проблемы минимальных затрат в сети, построенной следующим образом.
Любая строка длины n , содержащая каждое слово, может быть преобразована в поток в этой сети, стоимость которого не превышает n . Поэтому минимальный поток затрат в этой сети является нижней границей длины самой короткой такой строки.
Если нам повезет - и в этом случае мы - тогда, после того, как мы перенаправим поток, поступающий в w _1 обратно из w _0, мы найдем оптимальный поток, который имеет только один связанный компонент и который проходит через узел для пустого строка. Если это так, он будет содержать эйлерову схему, начинающуюся и заканчивающуюся там. Такая эйлерова схема может быть прочитана как строка оптимальной длины.
Если нам не повезло, добавьте несколько дополнительных дуг между пустой строкой и кратчайшими строками в других связанных компонентах, чтобы обеспечить существование эйлеровой схемы. Строка больше не обязательно будет оптимальной в этом случае.
Я использую библиотеку LEMON для ее минимального потока и алгоритмы Эйлера. (Это был мой первый раз, когда я использовал эту библиотеку, и я был впечатлен - я определенно буду использовать ее снова для будущих нужд алгоритма графа.) LEMON поставляется с четырьмя различными алгоритмами потока с минимальными затратами; Вы можете попробовать их здесь с
--net
,--cost
,--cap
и--cycle
( по умолчанию).Программа запускается за 0,5 секунды , создавая эту строку вывода .
источник
Ява 8, ~ 5 минут, длина 39 279
Входные данные:
Выход:
источник
26,609
персонажей.Python 2, 39254 символа
Занимает 1-2 минуты, чтобы запустить на моем компьютере, работает, беря самое длинное слово и затем всегда добавляя слово в строку результата, которая имеет наибольшее количество общих строк. (Перед этим все слова, которые являются подстрока других слов, удаляются, чтобы избежать ненужного добавления в строку.)
Обновление: пытался смотреть в обоих направлениях, но это не делает ничего лучше. (может быть, он использует слова, которые можно использовать позже?)
Ссылка на слово на pastebin.
первые 100 символов:
Код:
источник
Рубин, 39222 персонажа
В своем ответе на Python используется аналогичный подход к @KarlKastor, но начальная строка - одно из самых маленьких слов, а не самых больших. Другая оптимизация (я не знаю, насколько она полезна) заключается в том, что между каждым добавлением он удаляет любые слова, которые, возможно, уже были включены в строку из-за перекрывающихся слов.
Запускается на моей машине чуть более 4 минут, не считая веб-запроса на получение списка слов, но не совсем 4:20.
Слово о Пастебине.
источник
PowerShell v2 +, 46152 символа
Принимает входные данные в виде списка, преобразует его в ArrayList (чтобы мы могли манипулировать им). Мы
sort
этоlength
в-des
порядке убывания. Затемwhile
у нас все еще есть слова в нашем входном массиве, сделать цикл. На каждой итерации устанавливаем значение помощника$x
равным количеству, которое у нас осталось, прикрепляем следующий элемент списка к нашему выводу$o
, а затем просматриваем все, что остается в нашем списке. Если значение.IndexOf
не равно-1
(то есть слово было найдено где-то в$o
), мы удаляем это слово из нашего списка оставшихся слов. Наконец, в конце, вывод$o
.У меня нет доступа к Pastebin или подобному, так что вот начало и конец слова для временного -
telecommunicationscharacterizationresponsibilitiessublimedirectory...fcmxvtwvfxwujmjsuhjjrxjdbkdxqc
. Что, я думаю, сбило около 20 000 символов с ввода, так что, думаю, не так уж и плохо.Я работаю над уточнениями.
источник
PHP 46612 символов
Это только начало. Я надеюсь улучшить это. Все, что я сделал до сих пор, это удалил любое слово, которое является подстрокой другого слова. Я работаю над 3-мя копиями массива, но с памятью проблем не возникает.
источник