Итоги новогоднего конкурса
 
04.02.2003
Владимир Пинаев

Мозги, давно отвыкшие от подобного напряжения, наконец вскипели и выдали что-то похожее на решение…
Константин Едренкин
АААААААААААА! Все равно не сдамся! (восклицание после очередной не очень удачной попытки)
Николай Логвинов
В полночь таки пришло озарение :) Высылаю последний на сегодня вариант. —  Роман Шевцов
Давно не получал столько заряда бодрости, сколько получил, пытаясь найти решение задачи. Будет здоро-
во, если будут еще такие конкурсы. —  Олег Момотов
Неужто, можно еще короче???? —  
Жуков Дмитрий
Из писем участников

Редакция поздравляет победителей и награждает каждого из них трехмесячной подпиской.

Вкратце напомним о новогодней конкурсной задаче («КТ» #471). Участники должны были написать интроспективную программу, то есть программу, печатающую свой собственный текст. Причем, чтобы не учитывать индивидуальные пристрастия читателей журнала, для ее решения был придуман специальный язык PIBAS, который включает в себя:

  1. операторы присваивания и вывода;
  2. операцию конкатенации строк и функцию вырезки подстроки;
  3. задание строковых констант через двойные кавычки или апострофы.

По правилам конкурса для каждой программы измерялась ее длина в символах. Чтобы победить, необходимо было представить самую короткую интроспективную программу.

В общей сложности на конкурс поступила двести тридцать одна работа. Многие участники неоднократно улучшали свой результат, присылая все лучшее и лучшее решение.

Разбор полетов начнем с написания простой интроспективной программы. Прежде всего определим структуру решения (рис. 1). Для удобства чтения здесь и далее будем выделять цветом строковые константы (без ограничивающих кавычек).

 

1. вспомогательная переменная A=””;
2. задание строк со значениями кавычек B=’’’’;C=””;
3. Вывод ?…

Рис.1 Структура решения

Покажем, что в операторе вывода нетрудно напечатать все, что ему предшествует. Но при этом разрешим себе использовать кавычки только того вида, которые не совпадают с ограничивающими кавычками первого оператора присваивания (рис. 2). 
?’A=’+B+A+B+’;B=’+C+B+C+’;C=’+B+C+B

Рис. 2. Оператор вывода.

Итак, то, что предшествует оператору вывода, мы смогли напечатать. А как же напечатать сам оператор вывода? Но у нас еще есть резерв, а именно — мы пока не определили содержимое вспомогательной строки A. Так давайте добавим в оператор вывода печать строки A и поместим весь оператор вывода в эту строку (рис. 3).

A=”;?’A=’+B+A+B+’;B=’+C+B+C+’;C=’+B+C+B+A”;
B=’’’’;
C=””;
?’A=’+B+A+B+’;B=’+C+B+C+’;C=’+B+C+B+A

Рис. 3. Простая
интроспективная программа.

Если, как полагается в языке PIBAS, выписать наше решение в одну строчку, мы получим интроспективную программу из 92 символов. Совсем неплохо для начала! С таким решением мы заняли бы на конкурсе 26-е место.

Возникает вопрос, а зачем в язык PIBAS включена функция вырезания подстроки? Заметим, что в нашем решении в строке A присутствует несколько апострофов. Поэтому строку C можно исключить, а требуемый апостроф вырезать из строки A. Как и в первом решении, весь оператор вывода с небольшой приставкой включен в строку A (рис. 4).

A=”’;?’A=’+B+A+B+’;B=’+$(A,1,1)+B+A”;
B=’’’’;
?’A=’+B+A+B+’;B=’+$(A,1,1)+B+A

Рис. 4. Интроспективная программа
с функцией вырезки подстроки.

Длина этого решения составляет уже всего 73 символа, что соответствует девятому месту в итоговом протоколе конкурса.
Собственно, примерно такая программа, по мнению автора, и должна была победить. Но участники конкурса проявили недюжинную смекалку и существенно укоротили решение.

Стоит отметить программу из 68 символов (присланную несколькими участниками), в которой использовано всего два оператора (рис. 5).

A=”’;?$(A+A,32,34)+$(A+A,29,34)+”’+”’A=’”;
?$(A+A,32,34)+$(A+A,29,34)

Рис. 5. Интроспективная программа
из двух операторов.

А победителем новогоднего конкурса заслуженно стал Иван Басов. Седьмого декабря он первым прислал решение из 65 (!) символов (рис. 6). Мы поздравляем Ивана с победой и надеемся, что потраченной время с лихвой окупится повышением производительности труда в новом году!

A=’”;?B+A+$(B+”;B=”+A,3,5)+B+A’;
B=”A=’”;
?B+A+$(B+”;B=”+A,3,5)+B+A

Рис. 6. Самая короткая
интроспективная программа.

В дальнейшем еще шесть участников — Артем Родичев, Михаил Климов, Ярослав Мирошниченко, Сергей Беляев, Павел Толпегин и А. Тремба — прислали аналогичные решения. Полные протоколы конкурса доступны на www. pic200x.chat.ru.
В журнальной заметке невозможно написать обо всех идеях и предложениях, которые высказали наши читатели. Заметим только, что конкурс «КТ» получил продолжение в некоторых учебных заведениях — об этом нам сообщили студенты МАТИ и Владимир Антипов, учитель из Новомосковска Тульской области.
В заключение приведем диаграмму, отражающую длины всех решений.



 День и ночь [ "13-я КОМНАТА" ]
 Новости [ "НОВОСТИ" ]
 МикроФишки [ "НОВОСТИ" ]
 Час от часу не легче [ "НОВОСТИ" ]
 Вот такой ширины [ "НОВОСТИ" ]
 Жажда биометрии [ "НОВОСТИ" ]
 Особенности национальной рыбалки [ "ТЕМА НОМЕРА" ]
 Как вытащить рыбку из пруда [ "ТЕМА НОМЕРА" ]
 CRM [ "ТЕМА НОМЕРА" ]
 Внедрение CRM: вам помочь или не мешать? [ "ТЕМА НОМЕРА" ]
 Повелитель картинок [ "SOFTТЕРРА LITE" ]
 Огненная стена для ПК [ "SOFTТЕРРА LITE" ]
 Совершенство и простота. Часть первая [ "SOFTТЕРРА LITE" ]
 Последыш [ "КОМПЬЮFЕРРА LITE" ]
 Небесная механика. 5-я передача [ "КОМПЬЮFЕРРА LITE" ]
 В моей смерти прошу винить Клаву… [ "КОМПЬЮFЕРРА LITE" ]
 Ваттное одеяло [ "КОМПЬЮFЕРРА LITE" ]
 Запас карман не тянет [ "UNDOCUMENTED" ]
 Повесть о настоящем хакере [ "АНАЛИЗЫ" ]
 Национальная Интернет Статья [ "СОБЫТИЯ" ]
 Компьютеррный гороскоп [ "КНОПКИ" ]
 Итоги новогоднего конкурса [ "КНОПКИ" ]
 Вы готовы открыть свои личные данные продавцу товаров или услуг (банку, магазину…)? [ "ВОПРОС НЕДЕЛИ" ]
 Тот самый коридор [ "ПИСЬМОНОСЕЦ" ]


Все материалы номера