По условиям конкурса Underhanded C, исходный код программы должен быть читаемым, ясным, простым и совершенно невинным для постороннего взгляда. При этом программа выполняет некую вредоносную функцию, которая совершенно не очевидна при изучении исходного кода.
В этом году конкурсное задание основано на реальной проблеме контроля за ядерными вооружениями. Задание составлено совместно с некоммерческой организацией Nuclear Threat Initiative, которая борется с ядерным, химическим и биологическим оружием, отслеживая состояние ядерных программ во всех странах мира.
По правилам, программа должна обработать исходные данные и подделать результат обработки. Приз за победу — $1000.
Задание
Две страны, Народная Славная Демократическая Республика Элис (НСДРЭ) и Славная Демократическая Народная Республика Боба (СДНРБ), договорились о соглашении по ядерному разоружению. На практике договор предусматривает визит инспекторов в каждую страну для проверки наличия в боеголовках ядерных материалов, таких как плутоний, после чего боеголовки могут быть уничтожены.
В идеале, инспекторам хорошо бы лично осмотреть боеголовки и изучить радиограмму либо гамма-спектрограмму объектов, чтобы убедиться, что это настоящие боеголовки, а не фальшивка. Но каждая из стран противится такому исследованию, потому что не хочет выдавать секреты своей ядерной программы. В то же время и НСДРЭ, и СДНРБ желают быть уверенными, что другая сторона уничтожает настоящие боеголовки, а не фейковые.
Чтобы решить проблему, обе стороны договорились разработать детектор радиоактивных материалов с «информационным барьером», а именно — компьютерной программой, которая берёт результаты сканирования, определяет соответствие определённому шаблону и выдаёт ответ: только «да» или «нет».
Задача конкурсантов — написать функцию, которая сравнивает результаты тестовых измерений с эталонным шаблоном:
int match( double * test, double * reference, int bins, double threshold )
где test
и reference
— одномерные массивы шириной bins
, которые соответствуют спектру гамма-излучения проверяемой боеголовки и эталонной боеголовки, соответственно.
Ваш детектор должен выдать результат "1" («да»), если два массива совпадают в существенной степени, или результат "0" («нет»), если два массива не совпадают. Для настройки чувствительности детектора используется параметр threshold
.
Можно использовать любую формулу для проверки близости test[]
и reference[]
. Больше очков дадут за использование стандартных формул сравнения.
«Секретная» часть программы. Каким-то образом функция match()
выдаёт результат "1" («да»), даже если ядерный материал в боеголовке отсутствует. Такой результат должен быть вызван некими специальными условиями, которые организует принимающая страна. При этом в остальном детектор работает нормально и выдаваёт "0" («нет»), если специальные условия отсутствуют, а результат test[]
не соответствует reference[]
.
Конкурс стартовал 15 августа. Образцы программ принимают на адрес underhandedC@gmail.com до 15 ноября 2015 года. Результаты объявят в январе.
Автор: alizar