Crie um programa ou função que tome uma lista de cadeias como entrada e produza a cadeia mais longa que é uma substring de todas as cadeias de entrada. Se houver várias substrings de comprimento igual e não mais substring, produza qualquer uma delas.
- Isso pode significar a saída da string vazia.
- Se houver várias saídas válidas, você poderá produzir qualquer uma delas. Você não precisa fornecer uma saída consistente para uma determinada entrada, desde que a saída seja sempre válida.
- Sempre haverá pelo menos uma sequência na entrada, mas pode não haver uma sequência não vazia.
- Todos os caracteres ASCII imprimíveis podem aparecer na entrada. Você pode assumir que esses são os únicos caracteres que aparecem.
- Você pode receber entrada ou produzir saída por qualquer um dos métodos padrão .
- As brechas padrão não são permitidas.
- Isso é código-golfe - quanto menos bytes de código, melhor.
Casos de teste:
[Inputs] -> [Valid outputs (choose one)]
["hello", "'ello"] -> ["ello"]
["very", "much", "different"] -> [""]
["empty", "", "STRING"] -> [""]
["identical", "identical"] -> ["identical"]
["string", "stRIng"] -> ["st", "ng"]
["this one", "is a substring of this one"] -> ["this one"]
["just one"] -> ["just one"]
["", "", ""] -> [""]
["many outputs", "stuptuo ynam"] -> ["m", "a", "n", "y", " ", "o", "u", "t", "p", "s"]
["many inputs", "any inputs", "ny iii", "yanny"] -> ["ny"]
["%%not&", "ju&#st", "[&]alpha_numeric"] -> ["&"]
code-golf
string
subsequence
Sara J
fonte
fonte
undefined
não há uma sequência de saída válida. Se a sequência vazia (ou qualquer outra sequência) for uma saída válida, alegando que não há saída válida está incorreta.Respostas:
Python 2 , 82 bytes
Experimente online!
Pega entrada splatted. Tempo limite para entradas onde a primeira string é longa.
A idéia é pegar substrings das primeiras strings
h
para encontrar a mais longa que aparece em todas as strings restantest
. Para fazer isso, ramificamos recursivamente a remoção do primeiro ou do último caractere deh
.Python 2 , 94 bytes
Experimente online!
Um método mais direto. A função auxiliar
g
gera o conjunto de todas as subseqüênciass
e a função principal leva a mais longa em sua interseção.fonte
Brachylog (v2),
39 bytesExperimente online!
Programa completo. Entrada da entrada padrão (como uma lista de strings no estilo JSON), saída para saída padrão.
Explicação
Aparentemente, a ordem de desempate
s
não é a que está em quase todo o resto no Brachylog, portanto, precisamos substituí-lo manualmente para produzir a saída mais longa. (Isso é um pouco frustrante: quatro caracteres extras para a substituição, mais dois caracteres de agrupamento porque o Brachylog não analisa dois metapredicados seguidos.)O Brachylog's
s
não retorna substrings vazios, então precisamos de um truque para contornar isso: em vez de enviar uma função (o que normalmente é feito), escrevemos um programa completo, com saída para a saída padrão. Dessa forma, se houver uma substring comum, apenas a produzimos e terminamos. Se não houver uma substring comum, o programa errará - mas ele ainda não imprime nada na saída padrão; portanto, gera a string nula conforme pretendido.fonte
s
errado, e substituir a ordem de desempate é um pouco caro em termos de bytes. De qualquer forma, faça isso agora, porque é importante que a resposta esteja correta. De alguma forma, nenhum dos casos de teste que eu tentei percebeu a diferença.s
produz substrings é dando primeiro todos os prefixos da entrada (os mais longos primeiro), depois largando o primeiro e repetindoGelatina ,
126 bytesExperimente online!
Obrigado a @ JonathanAllan por salvar 6 bytes!
fonte
Ẇ€œ&/Ṫḟ0
que faria o trabalho e salvaria quatro bytes, já que as sub-strings já estão ordenadas por comprimento, portanto o resultado filtrado será; tudo o que resta é que, quando não há correspondências, a cauda produz um zero e, como temos listas de caracteres garantidas, podemos simplesmente filtrá-las.œ&/
pode ser substituído porf/
salvar aqui outroẆ€f/ṛ/
.Ruby 2.6,
76 5954 bytesExperimente online! - Versão Ruby 2.5 (56 bytes)
Quão?
Crie uma lista de possíveis correspondências, inicialmente configuradas para a matriz original. Itere na lista e, se uma string não corresponder, adicione 2 novas strings ao final da lista, cortando o primeiro ou o último caractere. No final, uma correspondência (eventualmente uma string vazia) será encontrada.
Obrigado Kirill L por -2 bytes e histocrata por mais -2
fonte
R ,
119116108106 bytesExperimente online!
Encontre todas as substrings de cada string, encontre a interseção de cada lista de substrings e, finalmente, retorne (uma de) a mais longa.
-3 bytes graças a Kirill L.
-8 bytes usando em
lapply
vez deMap
-2 bytes graças a Kirill L. novamente, removendo chaves
fonte
nchar
são suficientes para salvar algo declarandonchar
como um operador unário.list
nos dá -3 bytes.05AB1E ,
1498 bytes-6 bytes graças a @Adnan .
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
€Œ.«Ãõªéθ
deve funcionar para 9 bytes.Å«Ã
, mas não percebeu que eu deveria ter usado.«Ã
.. Obrigado!€Œ.«ÃéθJ
deveria funcionar para 8.Zsh ,
126 ...96 bytes-3 bytes de aritmética para, -6 bytes de implícito
"$@"
(obrigado roblogic), -5 bytes de remoção desnecessária{
}
, -1 byte de forma abreviada defor
, -1 byte usandorepeat
, -1 byte usando , -1 byte concatenandofor s ($b)
com seu corpo, -13 bytes alterando o loop de repetição para algum jaleco de avaliação.Experimente online! Experimente online!Experimente online!Lemos todas as substrings possíveis na matriz
a
e, em seguida, definimosb
a interseção das matrizesa
eb
. A construção${b-$a}
substituirá apenas$a
na primeira iteração: Ao contrário da expansão entre irmãos${b:-$a}
, ela não substituirá quandob
estiver configurada, mas vazia.fonte
a+=( $l[1+i/$#l,1+i%$#l] )
for
loops aninhadosfor l in "$@"
com simplicidadefor l;
- é um truque de festab=(${${b-$a}:*a})}
man zshexpn
eman zshparam
especialmente. Eu sempre os tenho abertos ao escrever uma resposta.Haskell , 80 bytes
Experimente online!
Obtenha todos os sufixos (
tails
) da primeira palavrax
na lista e use todos os prefixos (inits
) desses sufixos para obter todas as substringss
dex
. Mantenha cada ums
queisInfixOf
all
cordas na lista restanter
. Classifique essas substrings por comprimento (usando o(0<$)
truque ) e retorne a última.fonte
Retina 0.8.2 , 48 bytes
Experimente online! Explicação:
Para cada sufixo da primeira sequência, encontre o prefixo mais longo que também é uma substring de todas as outras sequências. Liste todos esses prefixos de sufixo (ou seja, substrings). Se não houver substrings correspondentes, acabamos com a string vazia, que é o que queremos de qualquer maneira.
Classifique as substrings na ordem inversa do comprimento.
Mantenha apenas o primeiro, ou seja, o substring mais longo.
fonte
n
é o número de sequências de argumentos. Então(?=(.*\n.*\1)*.*$)
deveria ser(?=(.*\n.*\1){n-1}.*$)
, não é? Caso de teste:["very", "different", "much"] -> [""]
{n}
você, você pode remover os padrões de início e fim e manter(.+)(?=(.*\n.*\1){n}
se o Retina permite escrever comn
menos de(?<=^.*).*$
Consulta TSQL, 154 bytes
Experimente online
Tornou diferenciação de maiúsculas e minúsculas declarando a coluna 'a' com agrupamento contendo CS (diferencia maiúsculas de minúsculas).
Dividindo todas as cadeias de caracteres de 2540 posições iniciais (muitas idênticas), mas os valores úteis variam entre 1 e 2070 e terminando de 0 a 22 caracteres após a posição inicial, a posição final pode ser mais longa alterando o tipo para 'P' em vez de 'L', mas prejudicaria o desempenho.
Essas seqüências distintas em cada número de rown são contadas. A contagem mais alta sempre será igual ao número de linhas na variável da tabela '@'. A reversão da ordem na mesma contagem deixará a substring com a maioria das correspondências por cima dos resultados, seguida pelo comprimento invertido da substring deixará a correspondência mais longa com a maioria das correspondências por cima. A consulta seleciona apenas a primeira linha 1.
Para obter todas as respostas, altere a primeira parte da consulta para
fonte
C # (compilador interativo do Visual C #),
320257 bytesExperimente online!
Adereços para @Expired Data e @dana
fonte
Perl 6 ,
6260 bytesExperimente online!
Estou um pouco chateado porque o Perl 6 não pode fazer operações definidas em listas de listas, e é por isso que há um extra
.comb
e>>
lá dentro.Outra coisa irritante é queComo apontado nos comentários,max
não é possível usar uma função para comparar itens, o que significa que eu tenho que usarsort
.max
pode-se usar um argumento, no entanto, acaba sendo mais demorado, pois tenho que levar em conta omax
retorno do infinito negativo quando existem substrings comuns ( tente online! ).fonte
max
pode assumir essa função (embora a aridade 1), seja pela posição quando chamada no modo OO, seja por um:by
argumento nomeado no modo procedural.Japt v2.0a0
-hF
, 8 bytesObrigado a Shaggy por salvar 3 bytes
Tente
fonte
-F
padrão é a sequência vazia.Japonês
-h
, 8 bytes(Eu poderia derrubar os últimos 3 bytes e usar a
-Fh
sinalização, mas não sou fã disso-F
)Experimente ou execute todos os casos de teste
fonte
Python 3 , 137 bytes
Experimente online!
fonte
Python 2 , 103 bytes
Experimente online!
Este é um lambda anônimo que transforma cada elemento no conjunto de todas as subseqüências, depois
reduce
o define intersection (set.__and__
) e, em seguida, retorna omax
elemento porlen
g.fonte
set.intersection
.C # (compilador interativo do Visual C #) ,
147145 bytesExperimente online!
fonte
Perl 5 (
-aln0777F/\n/
-M5.01
-MList::util=max
), 99 bytespode ser jogado com mais certeza
TIO
fonte
JavaScript (ES6),
9892 bytesExperimente online!
fonte
Carvão , 30 bytes
Experimente online! Link é a versão detalhada do código. Esse algoritmo é mais eficiente e mais curto do que gerar todas as substrings. Explicação:
Coloque a última string da lista de entrada em uma variável.
Zere o índice inicial da substring.
Faça um loop sobre todos os possíveis índices finais de substring. (Na verdade, isso passa de 0 excluindo o comprimento, portanto o valor é ajustado posteriormente.)
Obtenha a substring atual.
Verifique se esta substring está contida em todas as outras seqüências de entrada.
Se for, imprimir sobre qualquer substring de saída anterior.
Caso contrário, tente incrementar o índice inicial da substring.
fonte
Bash ,
295.. 175 bytesNão é bonito, mas pelo menos funciona. Experimente Online
-37 por limpeza geral ; -52 plagiando com a resposta zsh ; -26 substituindo array por um loop ; -2 graças a GammaFunction ; -3 removido
i=0
dofor
loopAqui está o script original não destruído, com comentários
fonte
((k==$#))&&
por((k-$#))||
. Isso também permite que você use emk=
vez de configurá-lo para 0.Vermelho ,
266174 bytesExperimente online!
Mudou a recursão para a iteração e se livrou da classificação.
fonte
Perl 5 , 87 bytes
Experimente online!
fonte
JavaScript (Node.js) , 106 bytes
Experimente online!
fonte
Gaia , 15 bytes
Experimente online!
fonte
PowerShell ,
16516387 bytes-76 bytes graças a Nail para o incrível regexp .
Experimente online!
Menos golfe:
fonte
JavaScript (Node.js) , 90 bytes
Experimente online! Casos de teste roubados descaradamente do @Arnauld. Porto da minha resposta de carvão.
fonte
Java (JDK) , 158 bytes
Experimente online!
Créditos
fonte
Perl 5 , 86 bytes
Experimente online!
fonte
Pitão , 16 bytes
Experimente online!
fonte