Pull to refresh

Реализация алгоритма Евклида на Shakespeare

Reading time4 min
Views6.6K
Как известно, сейчас существует довольно много эзотерических языков программирования, среди которых имеется небезызвестный Brainfuck.
В этой статье речь пойдёт о языке Shakespeare, который разработали Джон Аслауд и Карл Хассельстром. Целью создания этого языка является маскировка кода программы под пьесы Уильяма Шекспира. Поскольку программа Hello, world! уже разобрана в документации и имеет довольно объёмный вид, то мы попытаемся написать на нём довольно простой алгоритм Евклида для нахождения наибольшего общего делителя двух целых чисел.

Общая часть


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

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

Заглавие программы, которое выполняет роль подобно ключевому слову program в Паскале, и не несёт никакой смысловой нагрузки. Далее идёт перечень лиц, которые участвуют в программе. Всё, что мы здесь объявим, и будет далее нашими переменными. Единственным ограничением на имя переменной является то, что это обязательно должно быть имя персонажа из пьесы Шекспира.
Как и любая пьеса, эта программа делится на акты и сцены, которые занумерованы римскими цифрами. Акты и сцены играют роль меток для переходов, как условных, так и безусловных.

В этом языке роль кирпича играют существительные и прилагательные. При этом существительное имеет значение 1 или -1 в зависимости от того, имеет ли это существительное положительный или отрицательный смысл. В трансляторе этого языка содержатся словари, чтобы правильно определять смысл существительного. Каждое прилагательное, добавленное спереди к существительному, увеличивает его в 2 раза. С помощью этих знаний мы уже можем получить числа, которые являются степенью двойки, и противоположные им.
Для того, чтобы получить другие числа, используютя ключевые слова sum и difference. Кроме того, чтобы узнать значение переменной, которую мы хотим получить, мы можем использовать ключевое слово thyself. Например, число 6 можно получить, например, следующим способом:

You are brave charming hero. You are as good as the sum of cute pony and thyself
В этом способе число 6 представляется как 4 + 2. Слова hero и pony принимают значения 1, поскольку им придаётся положителньый смысл. Соответственно, brave charming hero представляется как 1 * 2 * 2 = 4. Второе предложение разбивается на сумму числа 2, чему соответствует cute pony, и значения переменной, на которое указывает ключевое слово thyself.
В переводе на любой язык программирования указанный фрагмент кода будет выглядеть примерно так:
X = 4;
X = 2 + X;


Для ввода и вывода в этом языке используются следующие фразы:


  • Listen to your heart — данная команда приписывает переменной введённое число.
  • Open your mind — данная команда приписывает переменной числовой код введённого символа (т. е. на '0' значение переменной будет равно 48)


Абсолютно аналогичным образом записываются фразы для вывода: Open your heart и Speak your mind, и теперь внимательному читателю не составит труда понять, что делает каждая из этих фраз.

В качестве условного оператора используются фразы, которые задаются в виде вопроса. Здесь уже играет роль распределение прилагательных на хороший и плохой смысл.
Например, вопрос: «Am I happier than you?» повлечёт за собой сравнение, является ли значение переменной, которая задаёт вопрос, больше значения её собеседника. Если мы бы хотили сравнить на равенство, то можно было бы спросить «Am I as good as you» и использовать частицу «not» для инверсии сравнения.

Конечно же, в стороне не остался многими упоминаемый и многими ненавидимый оператор перехода, который записывается в виде «Let us return to» или «Proceed to», за которым следует указание сцены или акта, в который следует перейти.

Наконец, закончим общую часть, рассмотрением важных ключевых слов: Enter, Exit и Exeunt, которые показывают, какие переменные доступны в текущие моменты времени.
Enter принимает в качестве параметров имена переменных через запятую, или разделённые словом «and», делая их доступными
Exit принимает в качестве параметра имя только одно переменной, делая её недоступной.
Exeunt принимает в качестве параметров те же параметры, что и Enter, делая соответствующие переменные недоступными, либо никаких параметров; в этом случае становятся недоступными все переменные.

Кроме того, все переменные должны быть объявлены в начале программы.

Алгоритм Евклида


Сначала напомним себе алгоритм Евклида на привычном нам языке, например, С
while (x != y)
 if (x > y)
  x = x - y;
else
  y = y - x;


Составим основной костяк нашей программы, а именно, переменные и основные команды. Любые художественные вставки останутся за читателем.

Итак, прежде всего, нам надо выбрать, какие персонажи будут участвовать в нашей пьесе. Я возьму, к примеру, Гамлета и Ромео.

Итак, что у нас будет в Dramatis Personae:
Romeo, a young man.
Hamlet, a woeful prince to be compared

Всё, что после запятой в данной секции программы расценивается как комментарий.

Теперь приступим к составлению кода. У нас несколько возможностей ветвления. Две сцены создаются, поскольку мы будем туда переходить по условию.
Act I: The Face
Scene I: Comparison
[Enter Prince Hamlet]
Hamlet:
Listen to your heart!
[Exit Prince Hamlet]
[Enter Romeo]
Romeo:
Listen to your heart!
[Enter Prince Hamlet]
Hamlet:
Let us proceed to scene II
Scene II: The Duel
Romeo:
Am I not as good as you?
Hamlet:
If so, let us proceed to scene III.
Romeo:
Speak your heart!
[Exeunt]

Scene III: Hamlet Dishonoured
Romeo:
Am I better than you?
If so, thou art as bold as difference between thyself and Romeo!
Am I better than you?
If so, let us proceed to scene II.
Am I better than you?
If not, let us proceed to scene IV.

Scene IV: Romeo Deceased
Hamlet:
Am I braver than you?
If so, thou art as bold as difference between thyself and Hamlet!
Am I braver than you?
If so, let us proceed to scene II



Заключение


Итак, в этой статье мы познакомились с довольно занятным эзотерическим языком, код которого похож на пьесы великого английского драматурга Уильяма Шекспира. На этом всё.
Tags:
Hubs:
Total votes 12: ↑12 and ↓0+12
Comments5

Articles