Задача №1836
Автор: Т. Г. Пшеницын
Явления: язык программирования
Язык: Шекспир / NA_Шекспир /
Условие
В отличие от естественных языков, которые используются для общения людей, языки программирования используются для передачи команд человека компьютеру. Каждый язык программирования включает в себя словарь команд и правила составления программы. Чтобы компьютер «понял», что от него хотят, человек должен придумать четкий алгоритм действий, а потом записать его с помощью имеющихся команд в соответствии с правилами языка программирования. Полученный текст — программа — передается компьютеру; после этого текст анализируется, обрабатывается, и компьютер выполняет команды человека. Пример простейшего языка программирования — калькулятор: к примеру, если мы хотим вычислить сумму чисел 123 и 456, мы вводим в него «программу» (выражение) 123 + 456, после чего она анализируется компьютером, выполняется, и калькулятор возвращает число 579.
Существует большое количество языков программирования, широко использующихся на практике: C++, C#, Python, R и многие другие. Отметим, что многие команды в каждом из этих языков представляют собой обычные слова английского языка (например, if, while, for). Иногда языки программирования, однако, придумывают не для промышленного использования, а для развлечения. Одним из таких языков программирования является язык Shakespeare ‘Шекспир’. По словам разработчиков этого языка, цель его создания — сделать так, чтобы текст программы был красивым и воссоздавал дух произведений Шекспира. Как следствие, программа на языке Shakespeare оформляется как пьеса, а команды этого языка являются репликами персонажей Шекспира.
Ниже приведена программа на языке Shakespeare и перевод ее текста на русский язык.
Программа | Перевод |
Romeo and Juliet: arithmetic of love.
Romeo, Son to Montague.
Juliet, Daughter to Capulet.
Tybalt, Nephew to Lady Capulet.
Friar Laurence, a Franciscan.
Act I: Differences between Montagues and Capulets.
Scene I: Romeo and Juliet’s conversation. [Enter Romeo and Juliet]
Juliet:
You are as noble as a rich Lord! Open your heart!
Romeo:
You are as beautiful as the sum of a lovely small blossoming white rose and the sum of a tiny gentle yellow flower and death! Open your heart!
[Exit Juliet]
Scene II: Romeo and Tybalt’s altercation. [Enter Tybalt]
Romeo:
You big purple cowardly pig! Open your heart!
Tybalt:
You are as miserable as the sum of a little fatherless coward and a leech! Open your heart!
[Exeunt]
Act II: Sum of Montagues and Capulets.
Scene I: The wedding. [Enter Romeo and Juliet]
Juliet:
You are as charming as the sum of myself and the sum of an amazing old King and a trustworthy hero! Open your heart!
[Exit Juliet]
[Enter Friar Laurence]
Romeo:
You are as good as the sum of a large rich mighty kingdom and Hell! Open your heart!
Friar Laurence:
You the sum of thyself and a cursed handsome ___A___! Open your heart!
[Exit Friar Laurence]
Scene II: The happy ending. [Enter Juliet]
Romeo:
______________B______________.
[Exeunt] | Ромео и Джульетта: арифметика любви.
Ромео, сын Монтекки.
Джульетта, дочь Капулетти.
Тибальт, племянник жены Капулетти.
Брат Лоренцо, монах-францисканец.
Акт I: Различия между Монтекки и Капулетти.
Сцена I: Разговор Ромео и Джульетты. [Входят Ромео и Джульетта]
Джульетта:
Ты благороден, как богатый Господин! Излей свою душу!
Ромео:
Ты прекрасна, как сумма чудесной маленькой цветущей белой розы и суммы крошечного нежного жёлтого цветка и смерти! Излей свою душу!
[Джульетта уходит]
Сцена II: Перебранка Ромео и Тибальта. [Входит Тибальт]
Ромео:
Ты, большая фиолетовая трусливая свинья! Излей свою душу!
Тибальт:
Ты ничтожен, как сумма маленького труса, не имеющего отца, и пиявки! Излей свою душу!
[Уходят]
Акт II: Сумма Монтекки и Капулетти.
Сцена I: Свадьба. [Входят Ромео и Джульетта]
Джульетта:
Ты очарователен, как сумма меня и суммы восхитительного старого Короля и героя, заслуживающего доверия! Излей свою душу!
[Джульетта уходит]
[Входит брат Лоренцо]
Ромео:
Ты хорош, как сумма большого богатого могущественного королевства и ада! Излей свою душу!
Брат Лоренцо:
Ты, сумма себя и проклятого привлекательного ___! Излей свою душу!
[Брат Лоренцо уходит]
Сцена II: Счастливый конец. [Входит Джульетта]
Ромео:
___________________________.
[Уходят] |
В результате работы программы компьютер поочередно вывел следующие 8 чисел:
2
23
-8
-5
29
__C__
25
48 |
Задание 1. Заполните пропуск C, написав вместо него число, которое выведет программа в процессе своей работы.
Задание 2. Каким из слов можно заполнить пропуск A: angel ‘ангел’ или devil ‘дьявол’?
Задание 3. Заполните пропуск B предложением на языке Shakespeare, которое состоит не более чем из 10 слов.
Задание 4. Почему, если убрать из сцены I акта II строчку [Exit Juliet] ‘Джульетта уходит’, компьютер выдаст сообщение об ошибке и не будет корректно выполнять программу?
Примечание 1. Знание как английского языка, так и программирования для решения задачи не требуется.
Примечание 2. Названия пьесы, актов и сцен, а также описания персонажей играют декоративную роль в программе и не влияют на ход ее работы.
Решение
Основные правила языка Shakespeare таковы:
- В начале программы (после названия пьесы) вводятся персонажи. Персонажи могут хранить в себе («запоминать») целые числа.
- Название пьесы, описания персонажей из списка действующих лиц (Son to Montague ‘сын Монтекки’, a Franciscan ‘монах-францисканец’), названия актов и сцен не влияют на работу программы (как было сказано в примечании к условию).
- В рамках работы программы есть понятие «сцена действия». На сцене в каждый момент времени должны находиться не более двух персонажей. Добавление персонажа X на сцену осуществляется командой [Enter X] ‘Входит X’, вывод со сцены — командой [Exit X] ‘X уходит’. Если необходимо добавить сразу двух персонажей X и Y, можно написать [Enter X and Y] ‘Входят X и Y’; если необходимо увести всех персонажей со сцены, можно написать [Exeunt] ‘Уходят’.
- Чтобы закодировать в языке Shakespeare число, являющееся степенью двойки (то есть число вида 1, 2, 4, 8, 16, 32, ...), сначала выбирается любое существительное с «положительной окраской» (king ‘король’, hero ‘герой’, Lord ‘Господин’ и т. п.); эти существительные сами по себе кодируют число 1. После этого к существительному можно присоединить несколько прилагательных; каждое прилагательное умножает текущее значение числа на два. Например, lovely small blossoming white rose ‘чудесная маленькая цветущая белая роза’ передает число 16: rose ‘роза’ равно 1, а каждое из прилагательных умножает результат на 2, всего 4 раза: 2×2×2×2×1 = 16. Если же изначально берется существительное с «отрицательной окраской» (coward ‘трус’, leech ‘пиявка’, Hell ‘ад’ и т. п.), то в результате будет передаваться отрицательное число (существительные сами по себе в таком случае несут значение −1). Так, big purple cowardly pig ‘большая фиолетовая трусливая свинья’ кодирует число −2×2×2×1 = −8.
- Если необходимо получить число, не являющееся степенью двойки, используется операция суммы — выражение the sum of X and Y ‘сумма X и Y’, которое складывает значения X и Y; при этом X или Y сами могут быть выражениями вида the sum of ... and ... (это прокомментировано в одной из подсказок).
- Чтобы персонаж Y сохранил в себе значение N, он должен быть на сцене вместе с каким-то персонажем X, и X должен произнести следующую реплику:
X:
You are as ... as N! ‘Ты ..., как N!’ (на месте многоточия может стоять любое прилагательное)
Или более коротко:
X:
You N! ‘Ты, N!’
После этой реплики персонаж Y «запомнит» число N, переданное ему, и будет хранить его в себе, пока в какой-нибудь другой, более поздней реплике ему не передадут новое число.
- Чтобы вывести значение, переданное персонажу Y, на экран, персонаж X должен добавить в свою реплику Open your heart! ‘Излей свою душу!’
- Местоимения апеллируют к значениям, которые к моменту произнесения реплики хранятся в персонажах. Так, персонаж X в присутствии персонажа Y может использовать местоимения myself ‘меня’ или thyself ‘тебя’, тем самым обращаясь к собственному значению или к значению Y соответственно. Например, если Ромео хранит в себе число 10 и произносит в реплике выражение the sum of myself and a rose ‘сумма меня и розы’, то он передает тем самым своему собеседнику число 10 + 1 = 11.
Разберем некоторые части программы-пьесы с точки зрения описанных выше правил:
1. В первой реплике Джульетта передает Ромео значение 2 (Lord ‘Господин’ имеет положительную окраску, к нему добавляется одно прилагательное) и просит его вывести его на экран.
2. Во второй реплике Ромео передает Джульетте значение 2×2×2×2×1 + 2×2×2×1 + (−1) = 23.
3. В первой реплике второго акта Джульетта передает Ромео значение 23 + 2×2×1 + 2×1 = 29. Число 23 появляется, когда Джульетта говорит the sum of myself and ... ‘сумма меня и ...’, апеллируя к переданному ей ранее значению.
4. Во второй реплике второго акта Ромео передает брату Лоренцо число 2×2×2×1 + (−1) = 7.
5. В третьей реплике второго акта брат Лоренцо обращается к Ромео и передает ему число the sum of thyself and a cursed handsome A ‘сумма тебя [то есть Ромео; к моменту данной реплики последний хранит в себе число 29] и проклятого [×2] привлекательного [×2] A’. Вместо A должно стоять существительное, которое определяет знак второго слагаемого. Так как программа выдала число 25, слагаемое должно быть отрицательным (29−4 = 25), значит, на месте A должно стоять слово c отрицательной окраской: devil.
6. В последней реплике как минимум должны присутствовать слова you, open, your, heart — значит, нам нужно шестью словами передать значение 48. Легко понять, что это не получится сделать, если использовать запись через прилагательные и существительные; однако мы можем пользоваться местоимениями и ссылаться на уже сохраненные значения! В Ромео сейчас записано число 25, в Джульетту — число 23; их сумма равна 48. Значит, подходит ответ You the sum of myself and thyself. Open your heart! ‘Ты, сумма меня и тебя! Излей свою душу!’.
Отметим, что ответ, в котором значения Ромео и Джульетты складываются вместе, прекрасно подходит и для счастливого завершения нашей пьесы (в отличие от мрачной концовки в оригинале Шекспира).
Cэр Фредерик Лейтон «Примирение Монтекки и Капулетти» (1855)
Осталось ответить на вопрос задания 4. Ответ ясен из логики работы программы: одновременно на сцене может находиться не более двух персонажей, поскольку программа должна однозначно определять, к кому обращена речь в реплике; если же Джульетта не уйдет со сцены, то в следующей реплике Ромео будет непонятно, обращается ли он к брату Лоренцо или к ней.
Комментарии