Dadas (em STDIN, como argumentos de linha de comando ou argumentos de função) duas seqüências de caracteres não vazias distintas, localize e retorne a menor substring da primeira string que não é uma substring da segunda. Se não existir essa substring, você pode retornar a string vazia, retornar qualquer string que não seja uma substring da string original ou lançar uma exceção. Se você estiver retornando de uma função, também poderá retornar nulo (ou indefinido, Nenhum etc.) nesse caso. Se várias dessas substrings estiverem vinculadas pelo menor tempo, você poderá retornar qualquer uma delas.
As strings podem consistir em qualquer caractere ASCII imprimível.
As entradas fornecidas no STDIN serão fornecidas com uma string em cada linha. A seu pedido, uma única linha vazia pode ser adicionada no final da entrada.
Isso é código de golfe, então o programa válido mais curto vence.
ALGUNS CASOS DE TESTE
ENTRADA:
STRING ONE
STRING TWO
RESULTADO:
E
ENTRADA:
A&&C
A&$C
SAÍDAS VÁLIDAS:
&&
&C
ENTRADA:
(Duas seqüências de 80 letras geradas aleatoriamente)
QIJYXPYWIWESWBRFWUHEERVQFJROYIXNKPKVDDFFZBUNBRZVUEYKLURBJCZJYMINCZNQEYKRADRYSWMH
HAXUDFLYFSLABUCXUWNHPSGQUXMQUIQYRWVIXGNKJGYUTWMLLPRIZDRLFXWKXOBOOEFESKNCUIFHNLFE
TODAS AS SAÍDAS VÁLIDAS:
AD
BJ
BR
CZ
DD
EE
ER
EY
EY
FF
FJ
FW
FZ
HE
IJ
IN
IW
JC
JR
JY
KL
KP
KR
KV
LU
MH
MI
NB
NQ
OY
PK
PY
QE
QF
QI
RA
RB
RF
RO
RV
RY
RZ
SW
UE
UH
UN
UR
VD
VQ
VU
WB
WE
WI
WU
XN
XP
YI
YK
YK
YM
YS
YW
YX
ZB
ZJ
ZN
ZV
Respostas:
Braquilog , 23 bytes
Funciona no transpiler Java antigo. Espera as duas seqüências em uma lista como entrada, unifica a saída com a substring. Se nenhuma substring for encontrada, retornará false.
Infelizmente ainda não codifiquei o subconjunto embutido no novo transpilador Prolog.
Explicação
fonte
Python,
11911591Casos de teste:
Trabalhando em torná-lo mais curto, mas este é o meu instinto cerebral. Ainda não é realmente um jogador de golfe.
Obrigado a @ user81655 e @NonlinearFruit pelos bytes extras.
Editar :
Dang. Tentei este código:
Pensei que fosse alguns bytes mais curto. Acontece que era 1 byte a mais do que eu tinha antes da edição.
fonte
(r=range)(1,len(a)+1)
então usarr
?range
ar
na linha acima, ele realmente adiciona um byte. Boa ideia, no entanto. Provavelmente existe uma maneira mais curta de percorrer as substrings.range(1,len(a))
erange(len(a)-1)
deve funcionar, não deveria? Também acho que o uso de um caractere de tabulação para o recuo de dois espaços salvaria um byte.range(1,len(a))
, o quarto teste de teste falha porque não tenta a sequência completa; ele irá apenas para o comprimento da string - 1. E comrange(len(a)-1)
, o primeiro caso de teste falha ao retornar em'cd'
vez de apenas'd'
. Pode haver algo lá, no entanto.range(1,len(a)+1)
erange(len(a))
.Python,
8786 bytesSe existir, retornará o mais à esquerda de todas as substrings únicas mais curtas.
Se não houver substring exclusivo, um IndexError será gerado.
Teste em Ideone .
fonte
enumerate
começarj
ai+1
.j
primeiro, entãoi
.'ab'
por entradas'abc','aaa'
.Python, 82 bytes
Uso:
f('A&&C', 'A&$C')
-> retornos'&&'
Gera ValueError se não houver substring adequado.
Explicação:
g=lambda u:{u}|g(u[1:])|g(u[:-1])if u else{''}
cria recursivamente um conjunto de substrings deu
f=lambda s,t:min(g(s)-g(t),key=len)
leva o menor substring da diferença de conjuntofonte
JavaScript (ES6), 79 bytes
Se o retorno
false
for aceitável, salve 2 bytes usando em&&s
vez de?s:''
.fonte
Pitão, 11 bytes
Experimente online!
fonte
JavaScript (Firefox), 80 bytes
O teste funciona apenas no Firefox. Retorna
undefined
se não houver substring.fonte
b.includes
?includes
.SyntaxError: unexpected token 'for'
Retina , 37 bytes
A saída estará vazia se nenhuma substring válida for encontrada
A
.Experimente online! (Levemente modificado para executar vários casos de teste ao mesmo tempo. O formato de entrada é na verdade separado por avanço de linha, mas os conjuntos de testes são mais fáceis de escrever com um caso de teste por linha. A estrutura de teste transforma o espaço em um avanço de linha antes do início do código real.)
Explicação
Para cada posição inicial possível em
A
, corresponda à substring mais curta que não apareceB
. O&
é para correspondências sobrepostas, de modo que tentamos todas as posições iniciais, mesmo que uma correspondência tenha mais de um caractere. Os\G
garante que não pular nenhuma posições - em particular, desta forma, temos de parada no avanço de linha, de modo que nós não temos partidas adicionais a partir , por isso, vai todos os substrings que começam mais para a direita da posição atual, de modo descartando isso não é um problema (e realmente melhora o desempenho).B
si. A razão pela qual isso não atrapalha as coisas é realmente bastante sutil: porque se houver uma posição inicial emA
que não possamos encontrar nenhuma substring válida, também será uma falha que fará com\G
que pare de verificar outras posições. No entanto, se (a partir da posição inicial atual) todas as substrings apareceremB
Devido à
M!
configuração, todas essas correspondências serão retornadas do estágio, unidas aos feeds de linha.Isso classifica as linhas do resultado anterior por comprimento. Isso é feito combinando a linha com
.+
. Em seguida,$
ativa uma forma de "ordenar por", de modo que a correspondência seja substituída por$.&
para determinar a ordem de classificação. O$.&
próprio substitui a partida pelo seu comprimento. Finalmente, a#
opção informa ao Retina para classificar numericamente (caso contrário, trataria os números resultantes como seqüências de caracteres e os classificaria lexicograficamente).Finalmente, mantemos apenas a primeira linha, usando um estágio grep com um regex vazio (que sempre corresponde) e um limite de
1
.fonte
Perl,
8785Essa é uma função anônima que retorna o primeiro (por posição) dos substrings mais curtos
$_[0]
que não ocorrem$_[1]
ouundef
se não existe nenhum substring.Programa de teste com seqüências de caracteres retiradas da resposta de @ iAmMortos, testadas com Perl 5.22.1:
fonte
Haskell, 72 bytes
Exemplo de uso:
"abcd" # "dabc"
->"cd"
.Uma implementação direta: construa todas as subseqüências
a
e mantenha as que não aparecemb
.argmin
retorna um elemento de uma lista que minimiza a função dada a 2ª argumento, aqui:length
.fonte
argmin
! Parece extremamente útil.Pitão -
96 bytesExperimente online aqui .
fonte
C #, 152 bytes
fonte
Ruby, 70 bytes
Coleta todas as substrings de um determinado comprimento da primeira string e, se houver uma que não esteja na segunda, retorne-a.
fonte
Burlesco - 26 bytes
No momento, a maneira mais rápida de obter é:
fonte
Japonês , 14 bytes
Experimente online!
Retorna
undefined
se não houver substring válido . Isso é diferente de retornar a sequência "indefinida" , embora a diferença seja visível apenas devido ao sinalizador -Q.Explicação:
fonte
Japonês
-h
, 11 bytesTente
fonte