Дифференциальное сжатие [закрыто]


20

Для этого вам нужно сжать разность. Разница - это некоторые данные, которые представляют разницу между двумя строками. Для этой задачи вам необходимо предоставить одну или несколько программ, которые могут:

  1. Введите Aи B, и выведите diff,C
  2. Входной Aи C, и выходB
  3. Входной Bи C, и выходA

Цель состоит в том, чтобы сделать diff Cкак можно меньше. Разница может быть чем угодно: строка, число, блок данных. Мы просто заботимся о размере (количестве байтов).

У меня есть 50 тестовых случаев, которые можно найти на Github . Каждый тестовый пример состоит из двух разделенных пробелами URL-адресов, которые указывают на 2 файла, которые необходимо проверить. (Эти тестовые примеры взяты из профилей Github членов PPCG. Спасибо всем!)

Все три задачи, описанные выше, должны выполняться менее чем за минуту на компьютере с разумной нагрузкой (для каждого тестового случая).

Ваша оценка равна общему размеру (в байтах) всех 50 различий, чем ниже, тем лучше. Жесткое кодирование различий в вашей программе не разрешено (я оставляю за собой право изменять контрольные примеры для предотвращения жесткого кодирования). Встроенные функции, которые производят diff (как diffutils), не допускаются.


4
Что именно представляет собой различие?
Конор О'Брайен,

Все, что вы хотите, на самом деле. Неофициально, это строка, которая представляет различия между AиB
Натан Меррилл

1
More link rot: нумерация пар контрольных примеров по индексу на 1 базовую линию; обе пары тестовых случаев 3, 13, 14, 15, 16, 17, 18, 19, 20, 21 - все 404. За исключением этого мне удалось найти все остальные случаи.
H Уолтерс

3
Я закрываю этот вопрос, потому что он в основном остается без ответа, и многие старые ссылки, которые я использовал в качестве тестовых примеров, больше не работают. Не стесняйтесь обновить вопрос и открыть, если хотите.
Натан Меррилл

1
Выполнено. GIST - это gist.github.com/sethhillbrand/64066935e3f8c0fac75d75edd43c9ef8 Второй файл представляет собой архив uuencoded из 40 оставшихся пар тестовых случаев.
Сет

Ответы:


0

Мой ответ действителен?

set f [open commits.txt]
while {![eof $f]} {scan [gets $f] %s\ %s a b; puts [string compare $a $b]}
close $f

тестируется на: http://www.tutorialspoint.com/execute_tcl_online.php?PID=0Bw_CjBb95KQMNmd4QkxvQUFsTnM


1
Вам необходимо предоставить несколько программ (как diffэквивалентных, так и patchэквивалентных). Если string comparediffs строки, это нарушает правило "без встроенных". Если он сравнивает только строки (как следует из названия), он не оставляет достаточно информации для воссоздания патча.

@ ais523: buildins Я понял это как команды командной строки. Я знаю, что string compareэто не генерирует информацию для создания страницы, но нет места в вопросе об этом.
sergiol

Из вопроса «2. Вход A и C, а выход B». Это то, что ваша заявленная программа не может сделать, и на самом деле это не может сделать ни одна программа (так как у нее недостаточно информации).

@ ais523: Хорошо, я не понял.
sergiol

@ ais523: Я не думаю, что ваше утверждение верно, «на самом деле ни одна программа не может сделать». Если C - разница между A и B, то для C и A можно вычислить B. Может быть, я упустил вашу точную точку зрения
Сет
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.