Входные данные:
Две строки без перевода строки или пробелов.
Выход:
Обе входные строки в отдельных строках с пробелами, где это необходимо † для одной из двух строк. И третья строка с символами A
, R
, M
и , представляющий собой добавлена , удалена , изменена , и без изменений .
† Мы добавляем пробелы в верхнюю или нижнюю строку ввода (если нужно). Цель этой задачи - вывести с наименьшим количеством возможных изменений ( ARM
), также известных как расстояние Левенштейна .
Пример:
Допустим, входные строки имеют вид ABCDEF
и AFBECD
, тогда результат будет таким:
A B CDEF
AFBECD
A A RR
Вот несколько других возможных неправильных выводов в качестве примера (и их намного больше):
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
Однако ни одно из них не имеет только четырех изменений, поэтому только A B CDEF\nAFBECD \n A A RR
допустимый результат для этой задачи.
Правила соревнований:
- Вы можете предположить, что входные строки не будут содержать никаких новых строк или пробелов.
- Две входные строки могут быть разной длины.
- Одна из двух входных строк должна оставаться как есть, за исключением необязательных начальных / конечных пробелов.
- Если ваши языки не поддерживают ничего кроме ASCII, вы можете предположить, что ввод будет содержать только печатные символы ASCII.
- Формат ввода и вывода являются гибкими. Вы можете иметь три отдельных строки, массив строк, одну строку с новыми строками, двумерный массив символов и т. Д.
- Вам разрешено использовать что-то другое вместо
ARM
, но указать, что вы использовали (то есть123
, илиabc.
, и т. Д.) - Если с одним и тем же количеством изменений возможны несколько допустимых выходных данных (
ARM
), вы можете выбрать, выводить ли один из возможных выходных данных или все из них. Начальные и конечные пробелы являются необязательными:
A B CDEF AFBECD A A RR
или
"A B CDEF\nAFBECD\n A A RR" ^ Note there are no spaces here
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение, если это необходимо.
Тестовые случаи:
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
Ответы:
Haskell ,
192181174161158150147143158 1 байтПопробуйте онлайн! Пример использования:
"ABCDEF" & "AFBECD"
. Возвращает список из трех строк. Это продолжение моего рекурсивного решения обычного вопроса о расстоянии Левенштейна .Объяснение:
Для того, чтобы вычислить минимальные изменения , чтобы получить от
"xyz"
к"yw"
, мы ориентируемся на первый символ обеих строк. Есть три варианта:x
из первой строки и рекурсивно вычислить изменения , чтобы получить от"yz"
до"yw"
. Это дает три строки["yz","yw"," M"]
. Добавьтеx
к первому, пробел ко второму иR
к третьему. Мы получаемy
из второй строки и вычислить"xyz" & "w"
, что возвращает результат["xyz","w","MRR"]
. Нам нужно добавить пробел в первой строке,y
во второй иA
третьей строке:"yz" & "w"
. К результату["yz","w","MR"]
добавляемx
он первую иy
вторую строку. Только для последней строки мы должны различать, являются ли начальные символы одинаковыми. Если они одинаковы, к третьей строке добавляется пробел, в противном случае (как в этом случае, потому чтоx \= y
)M
добавляется an :Из этих трех кандидатов нам нужно найти того, у кого меньше модификаций. Это эквивалентно наличию наибольшего количества пробелов в третьей строке. Поэтому мы преобразуем каждого кандидата
s
(список из трех строк) в кортеж([1|' '<-s!!2],s)
, где онs
отображается как второй компонент, а первый компонент представляет собой список с таким количеством элементов, сколько имеется пробелов в третьей строкеs
(s!!2
из-за индексации 0). В качестве элемента списка1
используется, но фактический элемент не имеет значения, если он одинаков для всех кандидатов.В целом, это дает список кортежей
Встроенныйmaximum
выбирает наибольший элемент из этого списка, в котором кортежи сравниваются лексикографически, то есть покомпонентная слева направо. Как[1]
больше[]
, выбирается первый кортеж, иsnd
возвращает второй из компонента, то есть список строк, кортежа.1 + 15 байт, чтобы исправить ошибку, при которой
A
-changes в конце строки будет отображаться какR
-changesисточник
JavaScript (ES6),
413...343342 байтаЭкономия 5 байтов путем настройки индексов цикла, как это было предложено @KevinCruijssen
Принимает ввод как 2 строки в синтаксисе карри. Возвращает массив из 3 строк.
Контрольные примеры
Показать фрагмент кода
Меньше гольфа
пример
Ниже приведена исходная матрица для b = "foo" и a = "ok" :
и вот окончательная матрица после всех итераций:
Последняя строка модификации вместе с расстоянием Левенштейна хранятся в правой нижней ячейке.
источник
j
и по-x
прежнему применимо к вашему последнему редактированию: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 байтПопробуйте онлайн!
Использует
'ARM_'
вместо'ARM '
Работает, выстраивая матрицу Левенштейна,
а затем возвращаясь назад, чтобы найти операции. Теперь строит строку операции одновременно с матрицей Левенштейна, как в ответе Арно на JS1: Больше байтов, так как это не сработало, если первая строка была одним символом.
2: перешел на построение комбинаций в матрице Левенштейна.
источник
m+i+1
может бытьm-~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 байт
Попробуйте онлайн!
Используя
difflib.SequenceMatcher
это вычисляет выравнивание между двумя строкамиисточник
"This_is_an_example_text","This_is_a_test_as_example"
Математика, 250
256259384байтов~ 0,00035 секунд для случая кода Java.
Использование:
f["ABCDE", "ABCDF"]
Попробуйте онлайн!
Код основан на том факте, что
SequenceAlignment
по умолчанию работает наА именно, скоринг рассчитывается
M
,A
иR
, соответственно.Пример:
источник
i="";o="";p="";
чтобыi="";o=i;p=i;
уменьшить 2 байта?i=o=p=""
?D ,
351345 байт-6 байт спасибо Кевину Круйссену
Попробуйте онлайн!
источник
break;
. +1 хотя, впервые я вижу язык программирования D.