Про diff
а если abcd сначала заменяется на def а потом на fgh? Тогда твой дифф должен говорить "заменить abcd на def 1 раз", "заменить abcd на fgh 1 раз".
И нельзя сказать "заменить 1 раз".
Description
Create a console program that can perform the following operations:
• generate a change set file CAB for any given pair of text files (TA, TB)
• apply a given change set file CAB to an input file TX and produce the target file TY.
NOTE: when applied to the input file TA the change set file CAB must produce the original file TB
Detailed specification
1 Files TA and TB are plain ANSI charset text files (ordered collection of lines delimited by ‘\n’ character or ‘\r\n’ character combination).
2 The change set file CAB should contain human readable instructions to convert file TA into file TB. It is part of your work to design your own specification of the conversion instructions and change set file format.
3 The conversion instructions should work with whole lines (do not refer to words or symbols inside a line). Lines that differ at least in one character should be considered different (treat differences in whitespace as significant).
4 The conversion instructions must be bound to the surrounding lines context (SLC). It is not allowed to bind conversion instructions to absolute or relative line numbers.
5 Each SLC in CAB must identify the lines being added, deleted, or modified uniquely in the scope of change set CAB if it is applied to the source file TA. In other words, applying the change set instructions from CAB to the original file TA must never be ambiguous.
6 The program must allow applying the change set file to any text file if the contents of the text file are compatible with the contexts found in the change set file. Otherwise the error description should be printed out to the console. The two basic types of errors are: “required context not found” and “change set applying is ambiguous”.
Что здесь означает 5-е условие? Мне кажется, что это как раз условие правильного разруливания множественного "abcd", как я описал.
6 условие означает, что если 3 a b c d 5 встретилось в файле более 1 раза, либо ни разу, то надо выдавать соотв. ошибки
5 условие означает, что на исходном тексте этих ошибок быть не должно
Имхо, условию удовлетворяет CAB = TB.
В пункте 5 сказано, что ты обязан сгенерить патч, который будет однозначно применяться на ТА (если возникают неоднозначности, надо увеличить SLC). А уже на других документах прога имеет право заявить о неоднозначности.
Важно уточнить такой момент: нельзя закладываться на относительный порядок правок, т.е. SLC разных правок могут идти в любом порядке в ТХ. Если же закладываться на порядок можно, то задача очень сложная
или меня глючит или эта задача уже была?
ты ее откуда взял?
никак не вспомню, в какую-то компанию что ль ее давали решать как дз перед собеседованием
Ну типа надо запоминать контекст вокруг каждой правки. Не формализовано, сколько этого контекста надо запоминать: если много, то размер CAB-файла увеличится и большой процент документов будут “required context not found”; если мало контекста, то высока вероятность пропатчить что-то не то.контекст вокруг запоминают и Eclipse и IDEA когда патч выдают
токо они собаки разное кол-во контекста заменяют
мне как-то приходилось 2 патч файла сравнивать - в результе ихние 2 патча замучаешься диффить
Если мой дифф выдаст что-то в духе "find 'abcd' and replace to 'mno'", то он заодно найдет 'abcdef', заменит начало и получится 'mnoef', что будет ошибкой. С алгоритмом поиска общей подпоследовательности проблем нету, а вот как сделать независимость от номеров строк, в голову не приходит.Ну как. Именно, что для нахождения нужного вхождения заменяемого куска нужно будет взять столько строк контекста спереди и сзади, чтобы не перепутать с другими.
В твоем примере, то есть, инструкции такие: "abcd в '3abcd' заменить на mno, abcdef заменить на prst, cdef в '0cdef' заменить на uvxz".
Если бы было "abcd456123abcd456123abcd456789 -> abcd456123efgh456123abcd456789", то правильная инструкция - что-то вроде "[3]abcd[4561] -> efgh". Контекст - [3] и [4561].
Как раз с алгоритмом налепить контекст и вышли трудности.
Пока сделал перебором. Более быстрое и лучшее в голову не приходит.
Оставить комментарий
okunek
Есть два файла, на которые я натравливаю diff:2
3
a
b
c
d
5
6
7
a
b
c
d
e
f
8
9
0
c
d
e
f
1
2
3
m
n
o
5
6
7
p
r
s
t
8
9
0
u
v
x
z
Вывод diff-а:
Мне нужно так реализовать свой diff (точнее, это будет больше подходить на patch который не будет зависеть от номеров строк. Если мой дифф выдаст что-то в духе "find 'abcd' and replace to 'mno'", то он заодно найдет 'abcdef', заменит начало и получится 'mnoef', что будет ошибкой. С алгоритмом поиска общей подпоследовательности проблем нету, а вот как сделать независимость от номеров строк, в голову не приходит. Тут главное как раз то, что поиск (в данном случае) abcd не закончится пока по всему файлу эти abcd не найдутся и не заменятся.