Сегодня 11 ноября 2011 года; в формате DD.MM.YY получается исключительно красивая бинарная запись (последняя, кстати, за следующие 88 лет — до 1 января 2100). Это замечательный повод объявить этот день Nerd New Year, с каковым я вас и поздравляю.
Хотя стоп, поздравление с таким днем в plaintext — это нонсенс. Я уже писала о необычных поздравлениях с днем программиста (2010, 2011), но здесь нужно что-то особенное… Лично у меня термин nerd ассоциируется с чем-нибудь бинарным; как насчет поздравлений, основанных на 0 и 1?
Начнем с классики. Brainfuck — язык на все случаи жизни; и бинарный диалект у него тоже есть. В Spoon команды BF заменяются на последовательности нулей и единиц, составляющие префиксно-свободный код, так что их даже не нужно разделять пробелами. Следующий код на BF, выводящий «Happy Nerd New Year!»,
эквивалентен коду на Spoon
но, согласитесь, последний выглядит гораздо бинарнее.
Автор языка описывает его как «головокружительный», и я не могу не согласиться с этой характеристикой. Программы на этом языке строго бинарны, но, в отличие от Spoon, нулями и единицами кодируются не сами команды, а система переключения между ними. В Whirl 24 команды, которые расположены на двух кольцах — математическом и операционном. Нули и единицы управляют вращением колец (т.е. сменой текущей команды на кольце), переключением между кольцами и активацией выполнения текущей команды. Механическая реализация интерпретатора выглядела бы примерно так:
Все это довольно запутанно (так, например, ноль либо переключает текущее кольцо, либо меняет его направление вращения в зависимости от предыдущего символа), но, как ни странно, язык сравнительно популярен и развивается не только его автором. Так, некий Aviad Ben Dov написал генератор кода на Whirl, которым я и воспользовалась для создания программы, выводящей «congrats»:
Этот язык не вполне бинарный, он требует использования и других символов, но нули и единицы все еще несут основную смысловую нагрузку, а для вывода текстового сообщения их более чем достаточно.
Правда, текстовое сообщение на этом языке довольно просто раскодировать: последовательность 0 и 1 после знака равенства — это всего лишь бинарные коды символов сообщения, записанные подряд в том же порядке, что в сообщении: 01001000 — 'H', 01100001 — 'a' и т.д. Никаких инверсий битов, никаких обратных порядков символов — даже скучно, но для коллекции пусть будет.
В этот список можно включить и BIT, еще один шедевр от Дэвида Морган-Мара. Этот язык тоже основан на бинарной записи программ, хотя вместо 0 и 1 используются более читабельные ZERO и ONE. Запись и чтение тоже оперируют отдельными битами, поэтому программа, выводящая текстовое сообщение, выглядит как последовательность значительного количества строк вида
В каждой строке указан ее номер (LINE NUMBER ...), выполняемая команда (PRINT ...) и безусловный переход на другую строку (GOTO ...). Но такая программа 1) неинтересна и 2) сложно проверяется ввиду отсутствия авторского интерпретатора. Так что ее я оставляю на откуп богатому воображению читателя.
Хотя стоп, поздравление с таким днем в plaintext — это нонсенс. Я уже писала о необычных поздравлениях с днем программиста (2010, 2011), но здесь нужно что-то особенное… Лично у меня термин nerd ассоциируется с чем-нибудь бинарным; как насчет поздравлений, основанных на 0 и 1?
Spoon
Начнем с классики. Brainfuck — язык на все случаи жизни; и бинарный диалект у него тоже есть. В Spoon команды BF заменяются на последовательности нулей и единиц, составляющие префиксно-свободный код, так что их даже не нужно разделять пробелами. Следующий код на BF, выводящий «Happy Nerd New Year!»,
++++++++++[>+>++>+++>++++>+++++>++++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>+++++++++++ +>+++++++++++++<<<<<<<<<<<<<-]>>>>>>>>--------.>>---.>>--------..>---------.<<<<<<<<<--------.>>>>++ ++++.>>>---------.>++.<-.<<<<<<<.>>>>.>>>+.>+++++.<<<<<<<<.>>>>>-.>>.<.>>-----.<<<<<<<<+.
эквивалентен коду на Spoon
1111111111001000101010110101110101111010111110101111110101111111010111111110101111111110101111111111 0101111111111101011111111111101011111111111110110110110110110110110110110110110110110000011010010010 0100100100100100000000000000000000000000010100100100000000000010100100100000000000000000000000000010 1000101001000000000000000000000000000000101001101101101101101101101101100000000000000000000000000101 0010010010010111111001010010010010000000000000000000000000000001010010110010100110000010100110110110 1101101101100101001001001001000101001001001010010100101111100101001101101101101101101101100101001001 00100100100000010100100100010100110010100100100000000000000000010100110110110110110110110111001010
но, согласитесь, последний выглядит гораздо бинарнее.
Whirl
Автор языка описывает его как «головокружительный», и я не могу не согласиться с этой характеристикой. Программы на этом языке строго бинарны, но, в отличие от Spoon, нулями и единицами кодируются не сами команды, а система переключения между ними. В Whirl 24 команды, которые расположены на двух кольцах — математическом и операционном. Нули и единицы управляют вращением колец (т.е. сменой текущей команды на кольце), переключением между кольцами и активацией выполнения текущей команды. Механическая реализация интерпретатора выглядела бы примерно так:
Все это довольно запутанно (так, например, ноль либо переключает текущее кольцо, либо меняет его направление вращения в зависимости от предыдущего символа), но, как ни странно, язык сравнительно популярен и развивается не только его автором. Так, некий Aviad Ben Dov написал генератор кода на Whirl, которым я и воспользовалась для создания программы, выводящей «congrats»:
0011111100110011110011111001111000001110011111000111001111000110011100111111000111110001111000111110 0111100000111001111100011100111100011001110001001111100110000000000000000000000000000000111110001001 1111001100011111000110011111001111001100111100111110011110000011100111110001110011110001100111000100 1111100110001111100000010001111100011000001111001100111100111110011110000011100111110001110011110001 1001110001001111100110000000000000000000000000000000111110000000111001111100011000111110000000000000 0000000000000000011110011111001111000010001111100111001110001100011100011000111000110001110011111100 0111110001111000111110011110000011000111000001110001110011111000000000000000000000000000001111100011 1100011111000111100000100010011001111001111110011111000111100011111001111000001110011111000111001111 0001100111000100111110011000000011111000001111100010001001100111100111111001111100011110001111100111 1000001110011111000111001111000110011100010011111001100011111000001111100010001001100111100111111001 1111000111100011111001111000001110011111000111001111000110011100010011111001100000000000000011111000 1111000111110001111000001000100110011110011111100111110001111000111110011110000011100111110001110011 1100011001110001001111100110000000000000000000111110000011111000100010011001111001111110011111000111 1000111110011110000011100111110001110011110001100111000100111110011000000000000000000000000000000000 0000001111100011110001111100011110000010001001100111100111111001111100011110001111100111100000111001 1111000111001111000110011100010011111001100000000000000000000000000011111000001111100010001001100111 1001111110011111000111100011111001111000001110011111000111001111000110011100010011111001100000000000 0000000000001111100000111110001000100
01_
Этот язык не вполне бинарный, он требует использования и других символов, но нули и единицы все еще несут основную смысловую нагрузку, а для вывода текстового сообщения их более чем достаточно.
h=01001000011000010111000001110000011110010010000001001110011001010111001001100100001000000100111001 10010101110111001000000101100101100101011000010111001000001010.
Правда, текстовое сообщение на этом языке довольно просто раскодировать: последовательность 0 и 1 после знака равенства — это всего лишь бинарные коды символов сообщения, записанные подряд в том же порядке, что в сообщении: 01001000 — 'H', 01100001 — 'a' и т.д. Никаких инверсий битов, никаких обратных порядков символов — даже скучно, но для коллекции пусть будет.
В этот список можно включить и BIT, еще один шедевр от Дэвида Морган-Мара. Этот язык тоже основан на бинарной записи программ, хотя вместо 0 и 1 используются более читабельные ZERO и ONE. Запись и чтение тоже оперируют отдельными битами, поэтому программа, выводящая текстовое сообщение, выглядит как последовательность значительного количества строк вида
LINE NUMBER ONE ONE CODE PRINT ZERO GOTO ONE ZERO ZERO ONE ZERO
В каждой строке указан ее номер (LINE NUMBER ...), выполняемая команда (PRINT ...) и безусловный переход на другую строку (GOTO ...). Но такая программа 1) неинтересна и 2) сложно проверяется ввиду отсутствия авторского интерпретатора. Так что ее я оставляю на откуп богатому воображению читателя.