Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=8916997&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Wed Apr 13 11:59:52 2016
Кодировка: Windows-1251
Про diff - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 1
PropellerMan
I'm in space

Рег.: 06.02.2003
Сообщений: 20406
Рейтинг: 2939
  Про diff
      16.09.2009 01:00
 

Есть два файла, на которые я натравливаю diff:
1
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-а:

code:
$ diff 1.txt 2.txt 4,7c4,6 < a < b < c < d --- > m > n > o 11,16c10,13 < a < b < c < d < e < f --- > p > r > s > t 20,23c17,20 < c < d < e < f --- > u > v > x > z


Мне нужно так реализовать свой diff (точнее, это будет больше подходить на patch), который не будет зависеть от номеров строк. Если мой дифф выдаст что-то в духе "find 'abcd' and replace to 'mno'", то он заодно найдет 'abcdef', заменит начало и получится 'mnoef', что будет ошибкой. С алгоритмом поиска общей подпоследовательности проблем нету, а вот как сделать независимость от номеров строк, в голову не приходит. Тут главное как раз то, что поиск (в данном случае) abcd не закончится пока по всему файлу эти abcd не найдутся и не заменятся.



vissi

Рег.: 30.09.2007
Сообщений: 9275
Рейтинг: 8222
  Re: Про diff [re: PropellerMan]
      16.09.2009 01:19
 

а если abcd сначала заменяется на def а потом на fgh? Тогда твой дифф должен говорить "заменить abcd на def 1 раз", "заменить abcd на fgh 1 раз".



PropellerMan
I'm in space

Рег.: 06.02.2003
Сообщений: 20406
Рейтинг: 2939
  Re: Про diff [re: vissi]
      16.09.2009 01:31
 

Я вижу тут выход в добавлении к abcd еще одной буквы, чтобы отличить от других abcd. Но вот общего алгоритма не вижу.
И нельзя сказать "заменить 1 раз".

PropellerMan
I'm in space

Рег.: 06.02.2003
Сообщений: 20406
Рейтинг: 2939
  Re: Про diff [re: PropellerMan]
      16.09.2009 01:40
 

Я начинаю думать, что неправильно понял условия своей задачи, так что напишу ее сюда:

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", как я описал.

bashtanov
спец по говядине

Рег.: 11.05.2007
Сообщений: 9569
Из: например
Рейтинг: 7070
  Re: Про diff [re: PropellerMan]
      16.09.2009 01:59
 

думаю, они считают что надо писать инструкции вида "замени a b c d на m n o между 3 и 5"
6 условие означает, что если 3 a b c d 5 встретилось в файле более 1 раза, либо ни разу, то надо выдавать соотв. ошибки
5 условие означает, что на исходном тексте этих ошибок быть не должно

Kai

Рег.: 25.10.2002
Сообщений: 8251
Рейтинг: 818
  Re: Про diff [re: PropellerMan]
      16.09.2009 02:04
5

От тебя требуют unified diff без номеров строк, который можно однозначно приложить к исходному файлу. То есть просто для каждого чанка нужно взять достаточно окружающих линий, чтобы он был уникальным в TA.

Имхо, условию удовлетворяет CAB = TB. :grin:

Artanis
sir

Рег.: 28.11.2003
Сообщений: 1063
Рейтинг: 7
  Re: Про diff [re: PropellerMan]
      16.09.2009 06:09
 

Ну типа надо запоминать контекст вокруг каждой правки. Не формализовано, сколько этого контекста надо запоминать: если много, то размер CAB-файла увеличится и большой процент документов будут 'required context not found'; если мало контекста, то высока вероятность пропатчить что-то не то.
В пункте 5 сказано, что ты обязан сгенерить патч, который будет однозначно применяться на ТА (если возникают неоднозначности, надо увеличить SLC). А уже на других документах прога имеет право заявить о неоднозначности.
Важно уточнить такой момент: нельзя закладываться на относительный порядок правок, т.е. SLC разных правок могут идти в любом порядке в ТХ. Если же закладываться на порядок можно, то задача очень сложная

botWi

Рег.: 22.11.2003
Сообщений: 10160
Из: Moscow
Рейтинг: 1764
  Re: Про diff [re: PropellerMan]
      16.09.2009 08:34
 

бррр
или меня глючит или эта задача уже была?
ты ее откуда взял?

никак не вспомню, в какую-то компанию что ль ее давали решать как дз перед собеседованием



Хватит дрочить на рейтинги
botWi

Рег.: 22.11.2003
Сообщений: 10160
Из: Moscow
Рейтинг: 1764
  Re: Про diff [re: Artanis]
      16.09.2009 08:39
 

В ответ на:

Ну типа надо запоминать контекст вокруг каждой правки. Не формализовано, сколько этого контекста надо запоминать: если много, то размер CAB-файла увеличится и большой процент документов будут 'required context not found'; если мало контекста, то высока вероятность пропатчить что-то не то.




контекст вокруг запоминают и Eclipse и IDEA когда патч выдают
токо они собаки разное кол-во контекста заменяют
мне как-то приходилось 2 патч файла сравнивать - в результе ихние 2 патча замучаешься диффить :)



Хватит дрочить на рейтинги
DizzyDen
достаточно добр

Рег.: 04.03.2003
Сообщений: 51430
Из: http://лакалхвост
Рейтинг: 13545
  Re: Про diff [re: PropellerMan]
      16.09.2009 12:59
2

Quote:

Если мой дифф выдаст что-то в духе "find 'abcd' and replace to 'mno'", то он заодно найдет 'abcdef', заменит начало и получится 'mnoef', что будет ошибкой. С алгоритмом поиска общей подпоследовательности проблем нету, а вот как сделать независимость от номеров строк, в голову не приходит.



Ну как. Именно, что для нахождения нужного вхождения заменяемого куска нужно будет взять столько строк контекста спереди и сзади, чтобы не перепутать с другими.
В твоем примере, то есть, инструкции такие: "abcd в '3abcd' заменить на mno, abcdef заменить на prst, cdef в '0cdef' заменить на uvxz".
Если бы было "abcd456123abcd456123abcd456789 -> abcd456123efgh456123abcd456789", то правильная инструкция - что-то вроде "[3]abcd[4561] -> efgh". Контекст - [3] и [4561].



If stateless paradigm is good for your code, why shouldn't it be for your country?
PropellerMan
I'm in space

Рег.: 06.02.2003
Сообщений: 20406
Рейтинг: 2939
  Re: Про diff [re: PropellerMan]
      18.09.2009 13:43
 

Всем спасибо.
Как раз с алгоритмом налепить контекст и вышли трудности.
Пока сделал перебором. Более быстрое и лучшее в голову не приходит.

Страницы: 1

Technical >> Development (Archive)

Дополнительная информация
1 зарегистрированных и 2 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы

Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в