Панграмма является строкой , которая содержит все буквы a
- z
от английского алфавита, не чувствительны к регистру. (Это нормально, если панграмма содержит более одной копии буквы или если она содержит не буквенные символы в дополнение к буквам.)
Напишите программу или функцию, чьи входные данные представляют собой список строк и которые выводят одну или несколько строк, которые имеют следующие свойства:
- Каждая выходная строка должна быть панграммой.
- Каждая выходная строка должна быть сформирована путем объединения одной или нескольких строк из списка ввода, разделенных пробелами.
- Каждая выходная строка должна быть самой короткой или привязанной к самой короткой из всех строк с этими свойствами.
Многие программы выберут вывод только одной строки; вы бы хотели вывести более одной строки, если бы вам пришлось написать дополнительный код для ограничения вывода.
Вы можете предположить, что входные данные не содержат непечатаемых символов или пробелов и что ни одно слово в нем не превышает (в 26 раз больше натурального логарифма длины списка) символов. (Однако вы не можете предполагать, что ввод содержит только буквы или только строчные буквы; знаки препинания и заглавные буквы вполне возможны.)
Ввод и вывод может быть дан в любом разумном формате. Для тестирования вашей программы я рекомендую использовать два контрольных примера: словарь английских слов (у большинства компьютеров есть один) и следующий случай (для которого идеальная (26-буквенная) панграмма невозможна, поэтому вам придется найти один содержащие повторяющиеся буквы):
abcdefghi
defghijkl
ijklmnop
lmnopqrs
opqrstuvw
rstuvwxyz
Вы должны включить образец результатов вашей программы вместе с вашим представлением. (Это может отличаться для разных людей в результате использования разных списков слов.)
Состояние победы
Это код-гольф ограниченной сложности сложная задача . Победителем является самая короткая программа (в байтах), которая выполняется за полиномиальное время . (Резюме для людей, которые не знают, что это значит: если вы удвоите размер списка слов, программа должна стать медленнее не более чем на постоянный фактор. Однако рассматриваемый постоянный фактор может быть таким же большим, как вы Например, допустимо, чтобы он становился в четыре раза медленнее или в восемь раз медленнее, но не для того, чтобы он становился меньше в зависимости от длины списка слов; фактор, из-за которого он становится медленнее, должен быть ограничен.)
Ответы:
Рубин 159 (итеративный)
Рубин
227220229227221 (рекурсивный)Новое итеративное решение (на основе алгоритма, описанного @Niel):
Старое рекурсивное решение:
Измерение байтов основано на исключении последней строки в файле, что не имеет значения
ruby 2.3.1p112
. После исправления небольшой ошибки число байт снова увеличилось.downcase
.upcase
для нечувствительности к регистру, как того требует постановка задачи).Вот более ранняя версия до сокращения идентификаторов и тому подобное:
Как это работает? По сути, он поддерживает набор символов, которые все еще должны охватывать, и повторяется только в слове, если это уменьшит раскрытый набор. Кроме того, результаты рекурсии запоминаются. Каждое подмножество 2 ^ 26 соответствует записи в таблице памятки. Каждая такая запись рассчитывается во времени, пропорциональном размеру входного файла. Так что все дело в том
O(N)
(гдеN
размер входного файла), хотя и с огромной константой.источник
JavaScript (ES6),
249248 байт, возможно, конкурирующийОбъяснение: Преобразует массив путем преобразования букв в битовую маску, сохраняя только самое короткое слово для каждой битовой маски на карте. Затем перебирая копию карты, увеличивайте карту, добавляя каждую комбинированную битовую маску, если результирующая строка будет короче. Наконец, верните строку, сохраненную для растрового изображения, соответствующего панграмме. (Возвращает,
undefined
если такой строки не существует.)источник
Python 3,
98,94, 92 байтаВыполняет итерацию в алфавитном представлении ASCII и добавляет 1 в список, если в строке обнаружена буква. Если сумма в списке больше 25, он содержит все буквы алфавита и будет напечатан.
источник
(' ')
иif
. Вы также можете изменитьord(i) in range(65,91)
на91>x>=65
. Кроме того, в чем сложность?