Завершение табуляции - полезная функция, которая автоматически завершает частично написанные команды. Вы собираетесь это реализовать.
Например, если бы доступные команды были ['apply','apple','apple pie','eat']
, то a
завершился бы так appl
, как все команды, начинающиеся сa
также начинаются с appl
.
Ввод, вывод
Вам нужно ввести строку A и набор строк B.
Вам нужно вывести самый длинный общий префикс из всех B, который начинается с A.
- Если ни один из вариантов не начинается с A, верните A
- Вы можете предположить, что B непусто, и что все строки непусты
- Вы не можете предполагать, что любой из параметров начинается с A, или что общий префикс будет длиннее, чем A
- Вы можете быть чувствительными к регистру или без учета регистра.
- Вам нужно только обрабатывать ASCII для печати
- Встроенные модули, которые явно выполняют эту задачу, разрешены
Тестовые случаи:
'a' ['apply','apple','apple pie','eat'] => 'appl'
'a' ['apple pie'] => 'apple pie'
'apple' ['eat','dine'] => 'apple'
'program' ['programa','programb'] => 'program'
'*%a(' ['*%a()-T>','*%a()-T<','@Da^n&'] => '*%a()-T'
'a' ['abs','absolute','answer'] => 'a'
'a' ['a','abs'] => 'a'
'one to' ['one to one','one to many'] => 'one to '
Обратите внимание на завершающий пробел в последнем тесте
Это код-гольф , поэтому делайте ваши ответы как можно короче!
\
или'
.'
в примере. Если я использую"
для строк, то строки отличаются от других примеров.Ответы:
JavaScript (ES6), 75 байт
Объяснение: Фильтрует все совпадающие префиксы, затем объединяет их с символами новой строки и сопоставляет с регулярным выражением, которое находит самый длинный общий префикс из всех строк. Если префиксов нет, регулярное выражение возвращает пустую строку, и в этом случае мы просто возвращаем исходную строку.
источник
e.startsWith(s)
сe.match("^"+s)
на один байт от Карринг сохранит другойmatch
произвольную печатную версию ASCII.(s,a)=>
кs=>a=>
Желе ,
1412 байтПопробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
Pyth,
1413 байтовСпасибо @isaacg за -1 байт
Программа, которая принимает список строк, а затем строку в STDIN и печатает результат.
Проверьте все контрольные примеры
Как это работает
источник
f}zT
=>/#z
PowerShell v3 +, 112 байт
Принимает ввод в виде строки
$a
и массива строк$b
. Использует-like
оператор для извлечения этих элементов из$b
этого (без учета регистра), с которого они$a
явно преобразуются в массив@(...)
(так как результатом может быть одно совпадение в виде скаляра, в этом случае индексация позднее не выполняется), и сохраняют этот массив в$c
.Это формирует
if
пункт. Если в нем ничего нет$c
(т. Е. Ничего не начинается с$a
массива, поэтому массив пуст), выведите результат$a
сelse
. Иначе ...Мы приводим первый элемент
$c
какchar
-array и перебираем каждый элемент, объединяя строки с предыдущим$i
и помещая строки в конвейер с помощью инкапсулирующих паренов. Те , фильтруют через|?{...}
(вWhere-Object
пункте) , чтобы убедиться в том , что.count
в$c
это-eq
UAL на.count
вещи в$c
том , что есть-like
подстрока (т.е. подстрока соответствует всем в $ с). Поскольку мы строим наши подстроки в порядке от кратчайшего до самого длинного, нам нужна последняя[-1]
из результирующих строк.Тестовые случаи
источник
Python 2, 122 байта
Полная программа; принимает строку и список из stdin точно так, как указано в примерах, за исключением того, что входные данные должны быть в отдельных строках.
Проверьте все контрольные примеры
источник
l.pop()
вместоl[-1]
?l
это обычноset
точка, которая не позволяет индексировать (будучи неупорядоченным). (К счастью, поддерживаются и наборы, и спискиpop()
.)Perl, 54 байта
Включает +2 для
-Xp
(можно комбинировать с-e
) и +3 для-i
(нельзя комбинировать)Дайте словарь на STDIN и слово после
-i
опции, например:Просто код:
источник
Perl 61 байт
Включает +2 для
-0p
Запустите с первым словом, за которым следуют словарные слова на STDIN:
tabcompletion.pl
:источник
Python 2, 112 байт
источник
Haskell, 67 байт
Вспомогательная функция
?
находит самый длинный общий префикс из двух строк, рекурсивно беря первый символ, если он одинаков для обеих строк и строки не пустые.Основная функция
%
первая хранит только строки в списке , которые начинаются с заданной одинs
, проверил самый длинный общий префикс сs
тогоs
. Чтобы справиться с отсутствием действительных соревнований, он добавляетs
пустой результат черезmax
. Затем он находит самый длинный общий префикс из них, складывая двоичную функцию?
.источник
Python 2, 75 байт
Спасибо @xnor за предложение встроенного, первоначально использованного @BetaDecay в этом ответе .
В целях оценки
ÿ
может быть заменен байтом DEL. Проверьте это на Ideone .источник
D, 88 байт
Использование:
Код просто удаляет все элементы,
q
которые не начинаются сp
, а затем вычисляет наибольшую общую начальную подпоследовательность оставшихся элементов.Шаблонные параметры сохраняют нам два повторения
string
и одно изauto
. Неправильное использование исключений позволяет нам избежать временных и условных переменных, которые в противном случае были бы необходимы для обработки случая, когда нет элементов,q
начинающихся сp
.источник
Python 2,
107102 байтаВ целях оценки
ÿ
может быть заменен байтом DEL. Проверьте это на Ideone .Спасибо @xnor за сохранение 5 байтов!
источник
os.path.commonprefix
как бета - распад найден , вы можете это сделать для вас работу.for c in ...
напрямую и завершиться с ошибкой после печати, какif len(set(c))>1:print r or s;_
.PHP,
167160157152 байтаЯ мог бы сохранить еще 3 байта, назначив переменные с помощью
preg_grep
иpreg_quote
, но да.сломать
источник
PHP, 156 байт
с большой помощью от Тита Спасибо
PHP, 199 байт
32 байта спасает Титус с array_unique
Я знаю, что решение Regex от Titus было короче, пока Titus не помог мне улучшить мой путь. Может быть, то, как я нашел, вам интересно
источник
$z
на,$s
чтобы исправитьapple, [eat,dine]
дело. 2)$l=
устарел; Вы не используете эту переменную. (-2) 3)$i++<$m
короче чем++$i<=$m
. (-1) 4)substr($x,0,$i);
корочеstr_split($x,$i)[0]
. (-3) 5) Вы можете положить$r[]=$v
внутрь strlen. (-5)<2
короче чем==1
. (-1) 7) Вы можете использоватьstrstr
в первом цикле:strstr($v,$s)==$v
. (-3)$r[]=$v;$m=max($m,strlen($v));
чтобы$m=max($m,strlen($r[]=$v));
и падение curlys. Это не касается состояния.$m
вообще. Все, что вам нужно, это то, что> = минимальная длина замен. Новый 5) Заменить{$r[]=$v;$m=max($m,strlen($v));}
на$r[]=$v;}
и<$m
с<strlen($r[0])
(-13)$r[]=$z=$v;
в первом цикле и{$s=substr($z,0,$i);foreach($r as$x)if($x[$i]!=$z[$i])break 2;}
во втором (-3)Сетчатка, 60 байт
Трейлинг новой строки является значительным. Принимает ввод как строку в строке, а затем каждое слово в отдельной строке (но не завершающий перевод строки!). Работает аналогично моему ответу JavaScript, сопоставляя самый длинный общий префикс из всех строк, начинающихся со строки в первой строке. Если он не находит его, он просто удаляет все слова.
источник
Scala, 119 байт
Ungolfed:
Объяснение:
источник
PowerShell , 101 байт
На основе удивительного регулярного выражения Нейла .
Попробуйте онлайн!
источник
05AB1E , 14 байтов
Попробуйте онлайн или проверьте все тесты .
Объяснение:
источник
Gaia , 12 байт
Попробуйте онлайн!
Принимает ввод как B, а затем A.
источник