Friday, September 24, 2010

О достаточности буквы ы и <Shift>

Вот некоторые говорят, что общение посредством одной буквы "ы" невозможно. Может, оно и так. Но если добавить хоть ещё один символ (скажем, "Ы") в алфавит, то вполне достаточно: действительно, отобразим {(a₁, a₂, ..., a₈) | a_i ∊ {'ы', 'Ы'} } в, скажем, набор cp1251 (однобайтная кодировка) таким образом: i-й бит нашего байта равен 0, если a_i = 'ы', и 1 в противном случае. Очевидно, что такое отображение биективно. (Если кому-то так же, как мне, не хватает cp1251, используйте просто отображение {'ы','Ы'} → {0,1} и UTF-8. Идея тут ясна.)


...теперь про изображения. Конечно, можно и тупо все байты в кучу 'ы' и 'Ы' перегнать, но это же так скучно, правда?..
Так что предлагаю рассмотреть следующий язык для рисования чёрно-белых изображений. Представим себе черепашку (как в Лого Мирах, лол), которая начинает из верхнего левого угла картинки идти вниз (для определённости) с поднятым пером. Введём следующие команды:

ы - поворот против часовой стрелки на 90°
Ы - прохождение на один пиксел в текущем направлении.

Теперь смотрите. Если мы натыкаемся на "ыыыы" в исходной строке (естественно, окружённую не 'ы'), будем считать это командой "инвертировать состояние пера": действительно, поворот на 360° — совершенно бессмысленное занятие, так что лучше бы эта подпоследовательность что-нибудь значила.

Аналогично, бессмысленную команду "ыыыыыыыы" задействуем в качестве команды окончания рисунка.
Т.е.: если менее 4 'ы' подряд — всё ОК, 4 'ы' - инвертирование пера, от 4 до 7 'ы' включительно - инвертирование пера + поворот (заметим, что поскольку поворот не меняет состояние рисунка, эти два действия можно выполнять в любой последовательности, так что двусмысленность отсутствует), 8 'ы' и более - завершаем выполнение программы.

*фух, выдохнул*