Malbolge: Programming from Hell

в 18:07, , рубрики: КодоБред, Песочница, Программирование, языки программирования, метки: ,

Доброе время суток, Хабраобщество.

Страдал я в свое время ерундой, отслеживая появление разных эзотерических языков программирования и попался мне небезызвестный всем нам Malbolge. Вот собственно о нем я и хочу поведать. Ну, начнем-с.

А начнем с того, что пресловутый BrainFuck даже рядом не лежал — такой этот Malbolge крутой и сложный. Первый код на этом языке был написан не людьми, а другой программой, написаной на Lisp, и то только через два года после появления этого языка.
Но поговорим об аде программировании на Malbolgе. Во-первых, он работает в троичной системе счисления, что немаловажно, для разумения того кода, который должен быть вписан в интерпритатор.

В Malbolge есть три регистра: a, c и d. Регистр c – регистр кода, используемый в качестве указателя на текущую команду. Регистр d – регистр данных, используемый для управления данными. Регистр a – аккумулятор, также используемый некоторыми командами для манипуляции данными.

В Malbolge есть 8 команд. Машина определяет, какую команду выполнять, следующим образом: к значению ячейки с адресом c ([c]) прибавляется значение c, а в качестве команды выступает остаток от деления этого числа на 94, если [C] не входит в диапазон от 33 до 126 включительно.

А вот собственно список команд:

  • j D = [D] Сдвигает указатель данных в ячейку, на которую указывало его прошлое значение
  • i C = [C] Сдвигает указатель инструкций в ячейку, на которую указывало его прошлое значение
  • * A = [D] = ROTATE([D]) Циклически сдвигает значение в ячейке, на которую указывает D, на один трит вправо. Попутно это значение записывается в A.
  • p A = [D] = CRAZY(A, [D]) Применяет операцию crazy к значению регистра A и ячейки, на которую указывает D.
  • / A = INPUT Читает один символ из потока ввода и сохраняет его в A.
  • < PRINT A Выводит на печать символ с ASCII-кодом A mod 256.
  • v STOP Завершить выполнение программы.
  • o NOP Команда, которая не делает ничего (единственная допустимая).

После выполнения каждой инструкции она шифруется операцией Crazy.
Операция является аналогом побитовых операций — она применяется к двум соответствующим цифрам.

Операция crazy:

CRZ                     2-я цифра
                                0 	1	2
1-я цифра 	        0  	1	0	0
                        1  	1	0	2
                        2   	2	2	1

После того, как инструкция выполнена, она перводится специальной таблицей:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~
5z]&gqtyfr$(we4{WP)H-Zn,[%3dL+Q;>U!pJS72FhOA1CB6v^=I_0/8|jsb9m<.TVac`uY*MK'X~xDl}REokN:#?G"i@

С основами мы с горем пополам разобрались, пришло время писать код.

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

Эта программа выводит Hello, world:

(=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk**hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@986543W10/.R,+O<

и эта тоже:

('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>

На этом, собственно, и все. А если вам все же удастся написать хоть что-то на Malbolge обязательно мне сообщите — хочу сфотографироватся вместе с гением.

Автор: samaranin

Источник

Поделиться

* - обязательные к заполнению поля