Entrada:
Duas strings sem novas linhas ou espaços em branco.
Resultado:
Ambas as strings de entrada em linhas separadas, com espaços onde necessário † para uma das duas strings. E uma terceira linha com os caracteres A
, R
, M
e , representando adicionados , removidos , modificados , e inalterada .
† Adicionamos espaços à sequência de entrada superior ou inferior (se for necessário). O objetivo desse desafio é gerar a menor quantidade possível de alterações ( ARM
), também conhecida como distância de Levenshtein .
Exemplo:
Digamos que as seqüências de entrada sejam ABCDEF
e AFBECD
, então a saída seria esta:
A B CDEF
AFBECD
A A RR
Aqui estão algumas outras saídas inválidas possíveis, como exemplo (e há muito mais):
ABCDEF
AFBECD
MMMMM
A BCDEF
AFBECD
A MMMR
AB CDEF
AFBECD
MAMMMR
ABC DEF
AFBECD
MMAMMR
ABC DEF
AFBECD
MMAA RR
ABCDEF
AFB ECD
MMR MA
AB CDEF // This doesn't make much sense,
AFBECD // but it's to show leading spaces are also allowed
AM A RR
No entanto, nenhuma dessas mudanças possui apenas quatro alterações; portanto, apenas A B CDEF\nAFBECD \n A A RR
uma saída válida para esse desafio.
Regras do desafio:
- Você pode assumir que as seqüências de entrada não conterão novas linhas ou espaços.
- As duas cadeias de entrada podem ter comprimentos diferentes.
- Uma das duas seqüências de entrada deve permanecer como está, exceto nos espaços iniciais / finais opcionais.
- Se seus idiomas não suportam nada além de ASCII, você pode assumir que a entrada conterá apenas caracteres ASCII imprimíveis.
- O formato de entrada e saída é flexível. Você pode ter três Strings separadas, uma matriz de String, uma única String com novas linhas, matriz de caracteres 2D, etc.
- Você tem permissão para usar outra coisa em vez de
ARM
, mas indique o que usou (ou seja123
, ouabc.
etc.) - Se mais de uma saída válida for possível com a mesma quantidade de alterações (
ARM
), você poderá escolher se deseja gerar uma das saídas possíveis ou todas elas. Os espaços à esquerda e à direita são opcionais:
A B CDEF AFBECD A A RR
ou
"A B CDEF\nAFBECD\n A A RR" ^ Note there are no spaces here
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Casos de teste:
In: "ABCDEF" & "AFBECD"
Output (4 changes):
A B CDEF
AFBECD
A A RR
In: "This_is_an_example_text" & "This_is_a_test_as_example"
Possible output (13 changes):
This_is_an _example_text
This_is_a_test_as_example
MAAAAAAA RRRRR
In: "AaAaABBbBBcCcCc" & "abcABCabcABC"
Possible output (10 changes):
AaAaABBbBBcCcCc
abcABCab cABC
R MM MMMR MM R
In: "intf(){longr=java.util.concurrent.ThreadLocalRandom.current().nextLong(10000000000L);returnr>0?r%2:2;}" & "intf(){intr=(int)(Math.random()*10);returnr>0?r%2:2;}"
Possible output (60 changes):
intf(){longr=java.util.concurrent.ThreadLocalRandom.current().nextLong(10000000000L);returnr>0?r%2:2;}
intf(){i ntr=( i n t)(M ath.r andom ()* 10 );returnr>0?r%2:2;}
MR M MRRRRRR RRRR RRRRRR MMMRR MMMMRRR RRRRRRRR MRRRRRRRRR RRRRRRRRRR
In: "ABCDEF" & "XABCDF"
Output (2 changes):
ABCDEF
XABCD F
A R
In: "abC" & "ABC"
Output (2 changes):
abC
ABC
MM
Respostas:
Haskell ,
192181174161158150147143158 1 bytesExperimente online! Exemplo de utilização:
"ABCDEF" & "AFBECD"
. Retorna uma lista de três strings. Essa é uma extensão da minha solução recursiva à questão comum da distância de Levenshtein .Explicação:
Para calcular as modificações mínimas para começar a partir
"xyz"
de"yw"
, vamos nos concentrar no primeiro caractere de ambas as cadeias. Existem três possibilidades:x
da primeira corda e recursivamente calcular as modificações para começar a partir"yz"
de"yw"
. Isso produz as três linhas["yz","yw"," M"]
. Adicionex
ao primeiro, um espaço para o segundo eR
para o terceiro. Nós temosy
da segunda sequência e calcule"xyz" & "w"
, que retorna o resultado["xyz","w","MRR"]
. Precisamos adicionar um espaço na primeira linha,y
na segunda eA
na terceira linha:"yz" & "w"
. Para o resultado["yz","w","MR"]
, adicionamosx
ele primeiro ey
na segunda linha. Somente para a última linha, precisamos diferenciar se os caracteres iniciais são os mesmos. Se forem iguais, um espaço será adicionado à terceira linha, caso contrário (como neste caso, porquex \= y
) umM
é adicionado:Desses três candidatos, precisamos encontrar o que tiver menos modificações. Isso é equivalente a ter mais espaços na terceira linha. Portanto, convertemos cada candidato
s
(uma lista de três cadeias) em uma tupla([1|' '<-s!!2],s)
, ondes
aparece como segundo componente e o primeiro componente é uma lista com tantos elementos quanto espaços na terceira linhas
(s!!2
devido à indexação 0). Como o elemento list1
é usado, mas o elemento real é irrelevante, desde que seja o mesmo para todos os candidatos.Ao todo, isso produz a lista de tuplas
O build-inmaximum
seleciona o maior elemento desta lista, onde as tuplas são comparadas lexicograficamente, que são componentes da esquerda para a direita. Como[1]
é maior que[]
, a primeira tupla é selecionada esnd
retorna o segundo do componente, que é a lista de linhas, da tupla.1 +15 bytes para corrigir um erro no qual
A
-changes no final de uma string seria exibido comoR
-changesfonte
JavaScript (ES6),
413...343342 bytesEconomizou 5 bytes ajustando os índices de loop, conforme sugerido por @KevinCruijssen
Recebe entrada como 2 strings na sintaxe de currying. Retorna uma matriz de 3 strings.
Casos de teste
Mostrar snippet de código
Menos golfe
Exemplo
Abaixo está a matriz inicial para b = "foo" e a = "ok" :
e aqui está a matriz final após todas as iterações:
A sequência final de modificação, juntamente com a distância de Levenshtein, são armazenadas na célula inferior direita.
fonte
j
ex
ainda se aplica a sua mais recente edição:b=>a=>{m=[];x=a.length;y=b.length+1;for(i=y;i--;)m[i]=[[i,'R'.repeat(i)]];for(j=x+1;j--;)m[i=0][j]=[j,'A'.repeat(j)];for(;++i<y;)for(j=-1;++j<x;)R=m[S=(X=m[i-1][j])[0],I=(Y=m[i][j])[0],D=(Z=m[i-1][j+1])[0],Q=[D+1,Z[1]+'R'],i][j+1]=b[i-1]==a[j]?[S,X[1]+' ']:S<I?D<S?Q:[S+1,X[1]+'M']:D<I?Q:[I+1,Y[1]+'A'];return[(g=s=>R[1].replace(/./g,c=>c==s?' ':b[i++],i=0))('A'),g('R',b=a),R[1]]}
:)Python 2 ,
548536484500 1488447381 2373371357350 bytesExperimente online!
Usa em
'ARM_'
vez de'ARM '
Trabalha construindo a matriz de Levenshtein
e depois retrocedendo para encontrar as operações. Agora cria a cadeia de operação ao mesmo tempo que a matriz de Levenshtein, como na resposta JS de Arnauld1: Mais bytes, pois não funcionou se a primeira sequência fosse um único caractere.
2: Mudou para construir as combinações na matriz de Levenshtein.
fonte
m+i+1
pode serm-~i
.while i+j<n+m:v,A=(L[i]+[m,m])[j:j+2];R,M=(L[i+1]+[m,m])[j:j+2];d=min(A,R,M);q=M==d or(R==d)*2;r+=' '*(d==v==M)or'AMR'[q];i+=q>0;j+=q<2
Python 2 , 310 bytes
Experimente online!
Usando
difflib.SequenceMatcher
isso calcula um alinhamento entre duas stringsfonte
"This_is_an_example_text","This_is_a_test_as_example"
Mathematica, 250
256259384bytes~ 0.00035 segundos para o caso do código java.
Uso:
f["ABCDE", "ABCDF"]
Experimente online!
O código é baseado em um fato que
SequenceAlignment
funciona por padrão emNomeadamente, a pontuação é calculada por
M
,A
eR
, em conformidade.Exemplo:
fonte
i="";o="";p="";
parai="";o=i;p=i;
reduzir 2 bytes?i=o=p=""
?D ,
351345 bytes-6 bytes thanx em KevinCruijssen
Experimente online!
fonte
break;
. +1, porém, pela primeira vez, estou vendo a linguagem de programação D.