O preenchimento de tabulação é um recurso útil que conclui automaticamente parcialmente os comandos gravados. Você vai implementá-lo.
Por exemplo, se os comandos disponíveis fossem ['apply','apple','apple pie','eat']
, a
seria concluído appl
como, como todos os comandos a
iniciados com appl
.
Entrada / Saída
Você precisa inserir uma sequência A e um conjunto de seqüências B.
Você precisa gerar o prefixo comum mais longo de todos os B que começa com A.
- Se nenhuma das opções começar com A, retorne A
- Você pode assumir que B não é vazio e que todas as cadeias de caracteres são vazias
- Você não pode assumir que qualquer uma das opções comece com A, nem que o prefixo comum seja maior que A
- Você pode fazer distinção entre maiúsculas e minúsculas ou não.
- Você só precisa lidar com ASCII imprimível
- Built-ins que explicitamente executam essa tarefa são permitidos
Casos de teste:
'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 '
Observe o espaço à direita no último caso de teste
Este é um código de golfe , portanto, faça suas respostas o mais curto possível!
\
or'
.'
em um exemplo. Se eu usar"
para as strings, as strings são diferentes de outros exemplos.Respostas:
JavaScript (ES6), 75 bytes
Explicação: Filtra todos os prefixos correspondentes e junta-se a novas linhas e correspondências em uma regex que encontra o prefixo comum mais longo de todas as linhas. Se não houver prefixos, o regex retornará uma string vazia. Nesse caso, simplesmente retornamos a string original.
fonte
e.startsWith(s)
come.match("^"+s)
um byte fora Currying irá poupar uma outramatch
com ASCII imprimível arbitrário.(s,a)=>
paras=>a=>
Geléia ,
1412 bytesExperimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Pitão,
1413 bytesObrigado a @isaacg por -1 byte
Um programa que pega a lista de seqüências de caracteres e, em seguida, a seqüência de caracteres em STDIN e imprime o resultado.
Verifique todos os casos de teste
Como funciona
fonte
f}zT
=>/#z
PowerShell v3 +, 112 bytes
Recebe a entrada como uma sequência
$a
e uma matriz de sequências$b
. Usa o-like
operador para extrair esses elementos$b
(sem diferenciação de maiúsculas e minúsculas)$a
, convertê-los explicitamente como uma matriz@(...)
(já que o resultado pode ser uma correspondência como escalar, caso em que a indexação falha posteriormente) e armazenar essa matriz$c
.Isso forma a
if
cláusula. Se não houver nada$c
(isto é, nada começa com$a
, então a matriz está vazia), em seguida, imprima$a
comelse
. De outra forma ...Elencamos o primeiro elemento
$c
comochar
-array e percorremos cada elemento, concatenando$i
as strings com o anterior e colocando as strings no pipeline por meio de parênteses de encapsulamento. Aqueles são filtrados através de|?{...}
(aWhere-Object
cláusula) para verificar se o.count
de$c
é-eq
ual ao.count
de coisas em$c
que estão-like
a substring (ou seja, o substring combina com tudo em $ c). Como estamos construindo nossas substrings da ordem do menor para o maior, precisamos da última[-1]
das seqüências resultantes.Casos de teste
fonte
Python 2, 122 bytes
Programa completo; usa string e lista de stdin exatamente como fornecido nos exemplos, exceto que as entradas devem estar em linhas separadas.
Verifique todos os casos de teste
fonte
l.pop()
invés del[-1]
?l
geralmente é umset
nesse ponto, o que não permite a indexação (sendo desordenada). (Felizmente, ambos os conjuntos e listas de apoiopop()
.)Perl, 54 bytes
Inclui +2 para
-Xp
(pode ser combinado com-e
) e +3 para-i
(não pode ser combinado)Forneça um dicionário sobre STDIN e a palavra após a
-i
opção, por exemplo:Apenas o código:
fonte
Perl, 61 bytes
Inclui +2 para
-0p
Execute com a primeira palavra seguida pelas palavras do dicionário em STDIN:
tabcompletion.pl
:fonte
Python 2, 112 bytes
fonte
Haskell, 67 bytes
A função auxiliar
?
encontra o prefixo comum mais longo de duas cadeias, recursivamente, obtendo o primeiro caractere, desde que seja o mesmo para as duas cadeias e as cadeias não estejam vazias.A principal função
%
primeira mantém apenas as cordas na lista que começa com o dado ums
, verificado pela maior prefixo comum coms
sendos
. Para lidar com a inexistência de competições válidas, ele adicionas
um resultado vazio viamax
. Em seguida, ele encontra o maior prefixo comum desses ao dobrar a função binária?
.fonte
Python 2, 75 bytes
Agradecemos a @xnor por sugerir o built-in, originalmente usado por @BetaDecay nesta resposta .
Para fins de pontuação,
ÿ
pode ser substituído por um byte DEL. Teste em Ideone .fonte
D, 88 bytes
Uso:
O código simplesmente remove todos os elementos dos
q
quais não começap
, depois calcula a maior subsequência inicial comum dos elementos restantes.Os parâmetros de modelo nos salvam duas repetições de
string
e uma deauto
. O uso indevido da exceção permite evitar a variável temporária e condicional que seriam necessárias para lidar com o caso em que nenhum elementoq
inicialp
.fonte
Python 2,
107102 bytesPara fins de pontuação,
ÿ
pode ser substituído por um byte DEL. Teste em Ideone .Obrigado a @xnor por salvar 5 bytes!
fonte
os.path.commonprefix
o Beta Decay encontrado , você pode fazer o trabalho para você.for c in ...
diretamente e terminar com erro após a impressãoif len(set(c))>1:print r or s;_
.PHP,
167160157152 bytesEu poderia economizar mais 3 bytes atribuindo variáveis com
preg_grep
epreg_quote
, mas eh.demolir
fonte
PHP, 156 bytes
com muita ajuda de Titus Obrigado
PHP, 199 bytes
32 bytes salvos por Titus com array_unique
Eu sei que a solução Regex de Titus foi mais curta até que Titus me ajudasse a melhorar meu caminho. Talvez a maneira que eu encontrei seja interessante para você
fonte
$z
with$s
to fix theapple, [eat,dine]
case. 2)$l=
is obsolete; You don´t use that variable. (-2) 3)$i++<$m
is shorter than++$i<=$m
. (-1) 4)substr($x,0,$i);
is shorter thanstr_split($x,$i)[0]
. (-3) 5) You can put$r[]=$v
inside the strlen. (-5)<2
is shorter than==1
. (-1) 7) You could usestrstr
in the first loop:strstr($v,$s)==$v
. (-3)$r[]=$v;$m=max($m,strlen($v));
to$m=max($m,strlen($r[]=$v));
and drop the curlys. This doesn´t touch the condition.$m
at all. All you need is something that is >= the minimum length of the replacements. The new 5) Replace{$r[]=$v;$m=max($m,strlen($v));}
with$r[]=$v;}
and<$m
with<strlen($r[0])
(-13)$r[]=$z=$v;
in the first loop and{$s=substr($z,0,$i);foreach($r as$x)if($x[$i]!=$z[$i])break 2;}
for the second (-3)Retina, 60 bytes
The trailing new line is significant. Takes input as the string on a line and then each word on a separate line (but no trailing newline!). Works in a similar way to my JavaScript answer by matching the longest common prefix of all lines that begin with the string on the first line. If it doesn't find one then it simply deletes all the words.
fonte
Scala, 119 bytes
Ungolfed:
Explanation:
fonte
PowerShell, 101 bytes
Based on Nail's awesome regexp.
Try it online!
fonte
05AB1E, 14 bytes
Try it online or verify all test cases.
Explanation:
fonte
Gaia, 12 bytes
Try it online!
Takes input as B, then A.
fonte