Код
#подборки

Программирование на эмодзи. 5 забавных языков

О скольких из них слышали вы? Зовём познакомиться и даже попрограммировать на каждом.

Полина Суворова для Skillbox

Локаджит Тикаятрай

(Lokajit Tikayatray)


об авторе

Архитектор решений в IT-компании из списка Fortune 100. Любимым занятием называет свою работу. Старается учиться чему-то полезному каждый день.


Изображение: Prawny / Pixabay.com

Кто бы мог подумать, что наши любимые смайлики могут сгодиться на что-то посерьёзнее оживления чатов? Однако ж нашлись таланты, которые придумали целые языки программирования на эмодзи и эмотиконах.

Большинство из них относятся к эзотерическим языкам — эсолангам (от англ. esolang), но разобраться в них проще, чем во многих других эсолангах.

Эзотерические языки плохо подходят для решения бизнес-задач. Их создают, чтобы доказать саму возможность реализации какой-то идеи («подтвердить концепцию», от англ. proof of concept), а то и вовсе шутки ради.

примечание переводчика

Эсоланг может быть даже своего рода произведением искусства. Например, программа на Piet выглядит как абстрактный рисунок. Язык этот назван в честь Пита Мондриана — одного из родоначальников абстрактной живописи.

О самых сложных эсолангах читайте в другой моей статье. В этой же речь пойдёт о пяти таких, в которых можно применять эмодзи:

1) Emoji;

2) Emojicode;

3) Emoji-gramming;

4) EmojiCoder;

5) Emotinomicon.

Emoji

Это эсоланг на основе стека. Эмодзи здесь отвечают за команды (токены), которые этим самым стеком управляют. И их не так уж много, а все остальные символы токенами не считаются.

Вот так на Emoji вывести на экран строку «Hello, World!»

💬  Hello, World! 💬➡

Команда (токен) 💬 читает все символы до следующего 💬 и помещает их в стек, а токен выводит на экран его содержимое.

Вот результат:

Выполнено с помощью tio.run. Скриншот: Локаджит Тикаятрай / levelup.gitconnected.com

Описание всех токенов языка Emoji:

💬 Считывает строку до следующего символа 💬 и помещает её в стек
⛽ Считывает строку до следующего символа 🚘 и помещает её в стек (эти конструкции могут быть вложенными, в них можно хранить функции)
➡ Выводит на экран содержимое стека
🚲 Помещает в стек логическое значение True («истина»)
🚳 Помещает в стек логическое значение False («ложь»)
🚴 Инвертирует логическое значение в стеке (true преобразуется в false и наоборот)
👫 Складывает два числа из стека
👪 Перемножает два числа из стека
🌊 Вычитает из одного числа в стеке второе число из стека
🍴 Делит одно число в стеке на другое
💸 Делит одно число в стеке на другое и возвращает остаток от деления
💿 Округляет число до ближайшего большего целого
📥 Округляет число из стека до ближайшего меньшего целого
📤 Округляет число из стека до ближайшего большего целого
🐂 Переводит число в шестнадцатеричный вид
🔢 Преобразует строку в число
👬 Проверяет два числа на равенство
🐣 Проверяет, что одно число меньше другого
🐔 Проверяет, что одно число больше другого
🔚 Извлекает логическое значение из стека. Если оно равно false, пропускает код до следующего символа 🐧.
🔙 Если при предыдущей команде 🔚 код не был пропущен, пропускает код до следующего 🐧.
🔃 Берёт две строки из стека. Интерпретирует первую как команду и выполняет её. Дальше проверяет второй логический параметр, и если он равен true, выполняет как команду вторую строку из стека. Затем всё повторяется
👥 Дублирует содержимое стека
🔣 Возвращает числовой код символа
🔍 Возвращает символ по его числовому коду
📲 Принимает два параметра-объекта, создаёт новую переменную и считает второй параметр её именем, а первый — её значением
📱 Принимает один параметр-объект и возвращает значение из переменной с именем, равным этому параметру
📃 Возвращает длину строки (или массива) из стека
✂ Принимает строку и два числа. Возвращает подстроку, начиная с символа с номером, равным первому числу (включительно), и заканчивая символом с номером, равным второму числу (не включая сам этот символ)
🏃 Вычисляет выражение в строке
📚 Создаёт пустой массив
📌 Берёт массив и объект и добавляет этот объект в конец массива. Ничего не возвращает, так что если вам нужен этот изменённый массив, сохраните его в переменную до вызова команды
🔑 Принимает массив (или строку) и индекс. Возвращает значение элемента с этим индексом
🔀 Меняет местами два элемента в стеке
🔊 Преобразует все символы строки к верхнему регистру
🔉 Преобразует все символы строки к нижнему регистру
Источник: gist.github.com

Позапускать свои программы на Emoji можно здесь.

Emojicode

Emojicode — это объектно-ориентированный язык. Программировать на нём забавно, потому что в коде можно использовать эмодзи.

Это ещё и строго типизированный язык с первоклассной поддержкой классов.

Этот авторский каламбур означает, что в Emojicode запросто можно создавать и использовать классы.

Создатель языка ненавидит ошибки типа NPE (null pointer exception) — они возникают при попытке обратиться к объекту, которому не присвоено значение. Поэтому в Emojicode каждую переменную экземпляра класса (instance variable) нужно сразу инициализировать, чтобы не словить ошибку при компиляции.

А это фрагмент кода для вывода строки «Hello, World!» на этом языке:

🏁 🍇
 😀 🔤Hello, World!🔤❗️
🍉 

И результат выполнения:

Выполнено с помощью tio.run. Скриншот: Локаджит Тикаятрай / levelup.gitconnected.com

Официальная документация по Emojicode здесь, а попрограммировать на нём можно тут.

Emoji-gramming

Emoji-gramming — ещё один эсоланг с эмодзи. В нём всего 25 переменных и четыре команды — те и другие представлены эмодзи.

Константы в Emoji-gramming задаются символами-сердечками:

💔 — это 0

💜 — это 1

💕 — это 2

💞 — это 4

💖 — это 8

Символ микрофона (🎤) отвечает за поток входных данных, а громкоговоритель (📢) обозначает вывод на экран. Выглядит логично, правда? 😃

Ниже — код на Emoji-gramming, который выводит на экран «Hello, World!»:

😊🕐💖
😇🕐🕐
😊🕑🕐
😇🕑🕑
😊🕒🕑
😇🕒🕒
😊♈💖
😇♈🕒
😊📢♈
😊♈💜
😇♈💞
😇♈🕑
😇♈🕒
😊📢♈
😊♉💞
😇♉💖
😇♉🕑
😇♉🕒
😊📢♉
😊📢♉
😊♊💜
😇♊💕
😇♊💞
😇♊💖
😇♊🕑
😇♊🕒
😊📢♊
😊♈💞
😇♈💖
😇♈🕑
😊📢♈
😊📢🕑
😊♈💜
😇♈💕
😇♈💞
😇♈🕐
😇♈🕒
😊📢♈
😊📢♊
😊♈💕
😇♈🕐
😇♈🕑
😇♈🕒
😊📢♈
😊📢♉
😊♈💞
😇♈🕑
😇♈🕒
😊📢♈
😊♈💜
😇♈🕑
😊📢♈
😊♈💖
😇♈💕
😊📢♈
Источник: gist.github.com

А вот и результат:

Выполнено с помощью tio.run. Скриншот: Локаджит Тикаятрай / levelup.gitconnected.com

EmojiCoder

EmojiCoder создали Джереми и Сара Натансон (Jeremy Nathanson, Sarah Nathanson). Это эзотерический язык, в котором и команды, и их аргументы записываются в виде эмодзи.

В языке есть эмодзи-обозначения для нуля и единицы. Остальные символы кодируются их комбинациями.

🌚=0
🌝=1 

Чтобы понять, как интерпретировать комбинацию (символ это из набора ASCII или же число), перед ней добавляют модификатор — тоже в виде эмодзи:

🔡: Символ ASCII с кодом от 0 до 255
🔢: Целое число от 0 до 255

Возьмём, например, такую последовательность: 🌚🌝🌚🌚🌝🌚🌚🌚, или 01001000 в двоичном виде.

Если поставить перед ней 🔢, то это будет просто целое число 72. А если указать 🔡, то уже символ с кодом 72 (по таблице ASCII), то есть латинская заглавная буква H.

Примечание переводчика

Как из нулей и единиц вдруг получилось 72?

В обычной жизни мы имеем дело с числами в десятичной системе счисления: они получаются из комбинаций десяти цифр от нуля до девяти. Каждое число можно представить в виде суммы произведений его цифр с десяткой в степени, которая зависит от разряда, где стоит цифра (первый разряд справа считается нулевым).

Например: 72 = 7*101 + 2*100, а 372 = 3*102 +7*101+2*100.

Если ограничиться только двумя цифрами (0 и 1), получим двоичную систему счисления. В ней число представляется точно так же, только вместо степеней десятки — степени двойки.

Вот так: 01001000 = 0*27 + 1*26 + 0*25 + 0*24 + 1*23 + 0*22 + 0*21 + 0*20 = 0 + 64 + 0 + 0 + 8 + 0 + 0 + 0 = 72.

Для вывода на экран в EmojiCoder применяется эмодзи «Машущая рука» (👋). Каждую команду нужно писать на новой строке.

Теперь мы знаем всё, чтобы вывести на экран строку «Hello, World!»:

👋🔡🌚🌝🌚🌚🌝🌚🌚🌚 //Печатает символ H
👋🔡🌚🌝🌝🌚🌚🌝🌚🌝 //Печатает символ e
👋🔡🌚🌝🌝🌚🌝🌝🌚🌚 //Печатает символ l
👋🔡🌚🌝🌝🌚🌝🌝🌚🌚 //Печатает символ l
👋🔡🌚🌝🌝🌚🌝🌝🌝🌝 //Печатает символ o
👋🔡🌚🌚🌝🌚🌝🌝🌚🌚 //Печатает символ запятой (,)
👋🔡🌚🌚🌝🌚🌚🌚🌚🌚 //Печатает пробел
👋🔡🌚🌝🌝🌝🌚🌝🌝🌝 //Печатает символ w
👋🔡🌚🌝🌝🌚🌝🌝🌝🌝 //Печатает символ o
👋🔡🌚🌝🌝🌝🌚🌚🌝🌚 //Печатает символ r
👋🔡🌚🌝🌝🌚🌝🌝🌚🌚 //Печатает символ l
👋🔡🌚🌝🌝🌚🌚🌝🌚🌚 //Печатает символ d
👋🔡🌚🌚🌝🌚🌚🌚🌚🌝 //Печатает символ !

Вот результат:

Выполнено автором с помощью tio.run. Скриншот: Локаджит Тикаятрай / levelup.gitconnected.com

Полный список команд EmojiCoder смотрите здесь.

Emotinomicon

Это стековый язык программирования (как и Emoji, о котором мы говорили выше). В нём можно использовать как эмодзи, так и эмотиконы. Придумал и создал его Конор О’Брайен (Conor O’Brien).

Вот как вывести строку «Hello, World!» на Emotinomicon:

😭!dlroW ,olleH😲⏪⏬⏩

Объясним назначение токенов:

😭 — начало строки
!dlroW ,olleH — строка с обратным порядком символов
😲 — конец строки
⏪ — начало цикла
⏬ — извлекает из стека и выводит на экран очередной символ строки
⏩ — конец цикла

Примечание переводчика

Почему строка набрана задом наперёд?

Потому что для стека действует правило «последним пришёл — первым ушёл». Последним в стек добавили символ H, так что он будет выведен первым, затем e и так далее до символа !.

И, наконец, результат:

Выполнено автором с помощью tio.run. Скриншот: Локаджит Тикаятрай / levelup.gitconnected.com

Поиграйтесь с выводом своих строк. Вот вам удобная среда для выполнения программ на Emotinomicone (нужные эмодзи там всегда под рукой, не приходится копипастить их откуда-то ещё).

Emotifuck

Это эмодзи-диалект эсоланга Brainfuck (в переводе «Вынос мозга»).

Emotifuck написан на языке Rust двумя энтузиастами под никами Romulus10 и Insipx. По словам разработчиков, их язык обладает безопасным доступом к памяти.

Ниже список команд Emotifuck и соответствующие им символы языка Brainfuck:

🔥 — Сдвинуть вправо (>)
💯 — Сдвинуть влево (<)
💩 — Уменьшить на 1 (-) [ну почему они не сделали ЭТО командой вывода ;)]
😂 — Увеличить на 1 (+)
💞 — Вывести (.)
🙏 — Ввести (,)
🌚 — Прыгнуть вперёд ([)
🐸 — Прыгнуть назад (])

примечание переводчика

Под программу на этом языке вначале выделяется 30 000 ячеек, в которых лежат нули. Вдоль множества ячеек перемещается указатель. Команды «сдвинуть вправо» и «сдвинуть влево» двигают этот указатель на одну ячейку вправо или влево, соответственно.

С прыжками вперёд и назад чуть хитрее: они перемещают указатель вперёд (вправо) или назад (влево) до следующего парного символа: для [ парным будет символ ] и наоборот. Причём команда сработает, только если в текущей ячейке будет лежать не ноль.

Код для вывода «Hello, World!» на Brainfuck выглядит так:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

С помощью словарика выше переведём это на Emotifuck и получим:

😂😂😂😂😂😂😂😂🌚🔥😂😂😂😂🌚🔥😂😂🔥😂😂😂🔥😂😂😂🔥😂💯💯💯💯💩🐸🔥😂🔥😂🔥💩🔥🔥😂🌚💯🐸💯💩🐸🔥🔥💞🔥💩💩💩💞😂😂😂😂😂😂😂💞💞😂😂😂💞🔥🔥💞💯💩💞💯💞😂😂😂💞💩💩💩💩💩💩💞💩💩💩💩💩💩💩💩💞🔥🔥😂💞🔥😂😂💞

Вот и всё, ребята! 🤗

Если заинтересовались темой

Документацию и дополнительные материалы ищите тут:


Изучайте IT на практике — бесплатно

Курсы за 2990 0 р.

Я не знаю, с чего начать
Научитесь: Профессия Python-разработчик Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована