Я хочу продолжить традицию, начатую год назад вот этой статьей (кстати, мне очень приятно, что ее еще помнят), и рассказать о еще нескольких способах сделать свое поздравление необычным и профессиональным. На этот раз я вывожу просто «congrats» — условно-нетрудоемкие способы закончились еще в том году.
В этой номинации традиционно выступают профессиональные фокусы на совершенно нормальных языках, которыми мы пользуемся каждый день, в данном случае — С++ (можно и просто C).
Disclaimer. Этот фокус использует низкоуровневые манипуляции с памятью; результаты могут варьироваться в зависимости от архитектуры компьютера и используемого компилятора.
Подробно этот способ я разбирала в статье Числовые подписи; он основан на создании чисел, содержащих наборы байтов нужной строки, и выводе их как строк. Для лучшей обфускации нужные числа можно вычислять как результат операций над другими числами — в таком случае никакие числа не будут выглядеть осмысленными строками в других режимах просмотра.
В прошлом году в этой номинации был представлен код на Whitespace. Очевидный выбор, когда нужно написать что-то невидимое, но не единственный. В этом году для получения почти такого же эффекта я использую Ruby.
Конечно, не так впечатляюще; мешают команды, обрамляющие это буйство пробелов. Зато программа пишется не в пример проще: каждая строка в кавычках преобразуется в один символ с ASCII-кодом, равным длине строки. Содержимое строк совершенно не важно: можно, например, вписать туда явный текст или ASCII-арт, и так далее:
Это не столько самостоятельный способ, сколько поправка к способу, изложенному в прошлом году. Мне все-таки удалось запустить интерпретатор Shakespeare, и к моему стыду, поздравление в нем не запустилось. Прежде всего, язык распознает только известных автору интерпретатора персонажей Шекспира; ни Ариэль, ни Просперо, ни Калибан в их число не входят. То же самое относится к лексике: никаких морских свинок и пьяных болванов, только одобренный автором словарный запас (довольно скудный). Наконец, прилагательные должны соответствовать существительному по эмоциональной окраске. Соблюдение всех этих правил накладывает строгие ограничения на текст и лишает его большей части его очарования.
В прошлом году я совершенно незаслуженно очернила замечательный язык Befunge — на нем великолепно пишутся замаскированные поздравления, стоит только проявить немного изобретательности. Например, вот так:
Если присмотреться к надписи, видно, что символы v, > и ^ направляют указатель инструкций вдоль некоторых линий букв. Между поворотами курсора встроены команды добавления символов на стек в виде «символ» — в Befunge двойная кавычка переключает режим с интерпретации команд на ввод символов на стек. «Лишние» символы, попадающиеся указателю инструкций по пути, просто игнорируются. Заканчивается программа в последнем символе R и двух первых восклицательных знаках циклом, который выводит символы со стека (в порядке, обратном их попаданию на стек).
В этом разделе я предлагаю программу на Piet — этот язык оставляет больше простора для креативности, чем прошлогодний Brainloller.
ASCII-коды букв закодированы в размерах блоков, а цвета задают последовательность действий «добавить размер прошлого блока в стек — вывести символ на вершине стека — повторить».
И наконец,
Я очень люблю разные конкурсы и искренне верю, что лучшее поздравление с днем программиста — это профессиональный конкурс. Levsha и его команда верят в то же самое, и мы объединили усилия для создания такого конкурса. К сожалению, мы не успели собственно к празднику, но в октябре мы обязательно его запустим! А пока что можно зарегистрироваться на бета-тест на сайте будущего конкурса coder2011.ru и проголосовать за свою любимую тему здесь.
Способ 1. Магический
В этой номинации традиционно выступают профессиональные фокусы на совершенно нормальных языках, которыми мы пользуемся каждый день, в данном случае — С++ (можно и просто C).
#include <stdio.h> int main() { int A = 10, B = A^1937006968, C = B^337251857; printf((char *)&C); }
Disclaimer. Этот фокус использует низкоуровневые манипуляции с памятью; результаты могут варьироваться в зависимости от архитектуры компьютера и используемого компилятора.
Подробно этот способ я разбирала в статье Числовые подписи; он основан на создании чисел, содержащих наборы байтов нужной строки, и выводе их как строк. Для лучшей обфускации нужные числа можно вычислять как результат операций над другими числами — в таком случае никакие числа не будут выглядеть осмысленными строками в других режимах просмотра.
Способ 2. Шпионский
В прошлом году в этой номинации был представлен код на Whitespace. Очевидный выбор, когда нужно написать что-то невидимое, но не единственный. В этом году для получения почти такого же эффекта я использую Ruby.
print " ".map{|z| z.size.chr}
Конечно, не так впечатляюще; мешают команды, обрамляющие это буйство пробелов. Зато программа пишется не в пример проще: каждая строка в кавычках преобразуется в один символ с ASCII-кодом, равным длине строки. Содержимое строк совершенно не важно: можно, например, вписать туда явный текст или ASCII-арт, и так далее:
print " ## ## #### ##### ##### #### ## ## #### ##### ##### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ###### ###### ##### ##### ###### ###### ###### ##### ##### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##### ## ## ## ## ## ## ## ## ##### ## ## ".map{|z| z.size.chr}
Способ 3. Драматический
Это не столько самостоятельный способ, сколько поправка к способу, изложенному в прошлом году. Мне все-таки удалось запустить интерпретатор Shakespeare, и к моему стыду, поздравление в нем не запустилось. Прежде всего, язык распознает только известных автору интерпретатора персонажей Шекспира; ни Ариэль, ни Просперо, ни Калибан в их число не входят. То же самое относится к лексике: никаких морских свинок и пьяных болванов, только одобренный автором словарный запас (довольно скудный). Наконец, прилагательные должны соответствовать существительному по эмоциональной окраске. Соблюдение всех этих правил накладывает строгие ограничения на текст и лишает его большей части его очарования.
Способ 4. Классический
В прошлом году я совершенно незаслуженно очернила замечательный язык Befunge — на нем великолепно пишутся замаскированные поздравления, стоит только проявить немного изобретательности. Например, вот так:
v > AA vBBB >RRR AA v > AA vBBB >:#, _ @ I " " A A " B " R A A " " A A " B " R I I I SHHT AAAA ABBB RRRR AAAA GHHN AAAA OBBB CRRR I I I " " A A " B " R A A " " A A " B " R > ^ A A >BBB ^ RR A A > ^ A A >BBB ^ RR o o o
Если присмотреться к надписи, видно, что символы v, > и ^ направляют указатель инструкций вдоль некоторых линий букв. Между поворотами курсора встроены команды добавления символов на стек в виде «символ» — в Befunge двойная кавычка переключает режим с интерпретации команд на ввод символов на стек. «Лишние» символы, попадающиеся указателю инструкций по пути, просто игнорируются. Заканчивается программа в последнем символе R и двух первых восклицательных знаках циклом, который выводит символы со стека (в порядке, обратном их попаданию на стек).
Способ 5. Декоративный
В этом разделе я предлагаю программу на Piet — этот язык оставляет больше простора для креативности, чем прошлогодний Brainloller.
ASCII-коды букв закодированы в размерах блоков, а цвета задают последовательность действий «добавить размер прошлого блока в стек — вывести символ на вершине стека — повторить».
И наконец,
Способ 6. Бонусный
Я очень люблю разные конкурсы и искренне верю, что лучшее поздравление с днем программиста — это профессиональный конкурс. Levsha и его команда верят в то же самое, и мы объединили усилия для создания такого конкурса. К сожалению, мы не успели собственно к празднику, но в октябре мы обязательно его запустим! А пока что можно зарегистрироваться на бета-тест на сайте будущего конкурса coder2011.ru и проголосовать за свою любимую тему здесь.