Entrada:
Dos cadenas sin líneas nuevas o espacios en blanco.
Salida:
Ambas cadenas de entrada en líneas separadas, con espacios donde sea necesario † para una de las dos cadenas. Y una tercera línea con los personajes A
, R
, M
y , en representación añadió , eliminó , modificado , y sin cambios .
† Agregamos espacios a la cadena de entrada superior o inferior (si es necesario). El objetivo de este desafío es producir con la menor cantidad de cambios ( ARM
) posible, también conocida como la distancia de Levenshtein .
Ejemplo:
Digamos que las cadenas de entrada son ABCDEF
y AFBECD
, entonces, la salida sería esta:
A B CDEF
AFBECD
A A RR
Aquí hay algunos otros posibles resultados no válidos como ejemplo (y hay muchos más):
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
Sin embargo, ninguno de estos tiene solo cuatro cambios, por lo que solo A B CDEF\nAFBECD \n A A RR
es una salida válida para este desafío.
Reglas de desafío:
- Puede suponer que las cadenas de entrada no contendrán nuevas líneas o espacios.
- Las dos cadenas de entrada pueden ser de diferentes longitudes.
- Una de las dos cadenas de entrada debe permanecer como está, a excepción de los espacios iniciales / finales opcionales.
- Si sus idiomas no admiten nada más que ASCII, puede asumir que la entrada solo contendrá caracteres ASCII imprimibles.
- El formato de entrada y salida son flexibles. Puede tener tres cadenas separadas, una matriz de cadenas, una sola cadena con nuevas líneas, una matriz de caracteres 2D, etc.
- Se le permite usar algo más en lugar de
ARM
, pero indique lo que ha usado (es decir123
, oabc.
, etc.) - Si es posible más de una salida válida con la misma cantidad de cambios (
ARM
), puede elegir si generará una de las salidas posibles o todas. Los espacios iniciales y finales son opcionales:
A B CDEF AFBECD A A RR
o
"A B CDEF\nAFBECD\n A A RR" ^ Note there are no spaces here
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de código de golf lo desalienten de publicar respuestas con idiomas que no sean de código. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados, programas completos. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código.
- Además, agregue una explicación si es necesario.
Casos de prueba:
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
Respuestas:
Haskell ,
192181174161158150147143158 1 bytesPruébalo en línea! Ejemplo de uso:
"ABCDEF" & "AFBECD"
. Devuelve una lista de tres cadenas. Esta es una extensión de mi solución recursiva a la pregunta de distancia ordinaria de Levenshtein .Explicación:
Para calcular las modificaciones mínimas para llegar
"xyz"
a"yw"
, nos centramos en el primer carácter de ambas cadenas. Hay tres posibilidades:x
desde la primera cadena y calcular recursivamente las modificaciones para llegar"yz"
a"yw"
. Esto produce las tres líneas["yz","yw"," M"]
. Agreguex
al primero, un espacio al segundo yR
al tercero. Obtenemosy
desde la segunda cadena y calcular"xyz" & "w"
, lo que devuelve el resultado["xyz","w","MRR"]
. Necesitamos agregar un espacio en la primera línea,y
a la segunda yA
a la tercera línea:"yz" & "w"
. Al resultado["yz","w","MR"]
, agregamosx
el primero yy
la segunda línea. Solo para la última línea necesitamos diferenciar si los caracteres iniciales son los mismos. Si son iguales, se agrega un espacio a la tercera línea, de lo contrario (como en este caso porquex \= y
)M
se agrega un:De esos tres candidatos, necesitamos encontrar el que tenga la menor cantidad de modificaciones. Esto es equivalente a tener la mayoría de los espacios en la tercera línea. Por lo tanto, convertimos cada candidato
s
(una lista de tres cadenas) en una tupla([1|' '<-s!!2],s)
, dondes
aparece como segundo componente y el primer componente es una lista con tantos elementos como espacios en la tercera línea des
(s!!2
debido a la indexación 0). Como elemento de lista1
se utiliza, pero el elemento real es irrelevante siempre que sea el mismo para todos los candidatos.En total, esto produce la lista de tuplas
El incorporadomaximum
selecciona el elemento más grande de esta lista, donde las tuplas se comparan lexicográficamente, es decir, de componentes de izquierda a derecha. Como[1]
es mayor que[]
, se selecciona la primera tupla ysnd
devuelve el segundo componente, que es la lista de líneas, de la tupla.1 +15 bytes para corregir un error donde los
A
cambios al final de una cadena se mostrarían comoR
cambiosfuente
JavaScript (ES6),
413...343342 bytesAhorró 5 bytes ajustando los índices de bucle, como lo sugiere @KevinCruijssen
Toma la entrada como 2 cadenas en la sintaxis de curry. Devuelve una matriz de 3 cadenas.
Casos de prueba
Mostrar fragmento de código
Menos golf
Ejemplo
A continuación se muestra la matriz inicial para b = "foo" y a = "ok" :
y aquí está la matriz final después de todas las iteraciones:
La cadena de modificación final junto con la distancia de Levenshtein se almacenan en la celda inferior derecha.
fuente
j
yx
aún se aplica a su última edición: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 bytesPruébalo en línea!
Usos en
'ARM_'
lugar de'ARM '
Funciona construyendo la matriz de Levenshtein
y luego atravesando hacia atrás para encontrar las operaciones. Ahora construye la cadena de operación al mismo tiempo que la matriz de Levenshtein, como en la respuesta JS de Arnauld1: Más bytes, ya que no funcionó si la primera cadena era un solo carácter.
2: Cambió a construir las combinaciones en la matriz de Levenshtein.
fuente
m+i+1
puede 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
Pruébalo en línea!
Usar
difflib.SequenceMatcher
eso calcula una alineación entre dos cadenasfuente
"This_is_an_example_text","This_is_a_test_as_example"
Mathematica, 250
256259384bytes~ 0.00035 segundos para el caso del código java.
Uso:
f["ABCDE", "ABCDF"]
Pruébalo en línea!
El código se basa en un hecho que
SequenceAlignment
funciona de forma predeterminada enA saber, la puntuación se calcula por
M
,A
yR
, en consecuencia.Ejemplo:
fuente
i="";o="";p="";
ai="";o=i;p=i;
reducir 2 bytes?i=o=p=""
?D ,
351345bytes-6 bytes gracias a KevinCruijssen
Pruébalo en línea!
fuente
break;
. +1, sin embargo, la primera vez que veo el lenguaje de programación D.