Советы по игре в гольф на языке программирования Шекспира


43

Какие общие советы у вас есть для игры в гольф на языке программирования Шекспира? Я ищу идеи, которые могут быть применены к задачам кода-гольфа и которые, по крайней мере, несколько специфичны для SPL (например, «удалить комментарии» - это не ответ).

Пожалуйста, оставьте один совет за ответ.


17
Я не уверен, что вы можете играть в гольф SPL. SPL настолько многословен, что я почти чувствую, что этот вопрос нуждается в теге троллинга кода. : P
Алекс А.

Вы просто не можете играть в гольф SPL. По крайней мере, насколько я знаю о шексперианских знаниях ...
Родольфо Диас

@RodolfoDias: Слабый? Я думаю, что вы являетесь резидентом Шекспира на PPCG.
Алекс А.

8
@AlexA. Что может и не быть хорошей вещью: это просто означает, что я достаточно сумасшедший, чтобы попытаться понять SPL :-)
Родольфо Диас

@AlexA. Sp может сделать это ...
Конор О'Брайен

Ответы:


18

(Ну ... так как это мой принятый язык 1 , я чувствую, что обязан что-то здесь добавить)

Используйте короткие имена переменных

Да, да, да, это довольно стандартно для code-golf, вы просто используете имена переменных длиной в одну букву, здесь нет новостей. Или есть? Потому что парни, которые создали SPL, были достаточно дурацкими, чтобы не допустить какого-либо имени для переменных их языка: они должны происходить из пьес Шекспира, что, с точки зрения длины символа, является болью в королевской туше - но, если вы кодируете в SPL Вы уже знаете это. Поэтому я бы посоветовал использовать персонажей с короткими именами, таких как Аякс , Форд , Пейдж или Пак , вместо архиепископа Кентерберийского .

Боюсь, это все, что у меня есть.


1 - так как мои навыки Java эквивалентны таковым у новорожденного.



13

(после предыдущего я просто вспомнил несколько вещей)

Тщательно выбирайте код

Пример, чтобы попытаться объяснить, что это значит.

Ajax:
 You are as warm as a big red rich fair cute bold cat!

а также

Ajax:
 Thou art as blossoming as an embroidered trustworthy bottomless peaceful charming handsome chihuahua!

дать точно такой же результат, то есть заставить говорящего персонажа принять значение 64 (поскольку, если вы читаете мою долгую битву с SPL , вы знаете, что обе строки эквивалентны 2 * 2 * 2 * 2 * 2 * 2 * 1); тем не менее, первый имеет 59 байтов, а второй имеет байтовый счет 107.

Тем не менее, никто не будет настолько безумен, чтобы принять участие в состязании по с SPL, так что ...


10
Не могли бы вы использовать одно и то же прилагательное несколько раз в описании? Например a big big big big big big cat, сохранить еще 4 байта? Я знаю, что это разрушает артистизм ... но в конце концов это кодовый гольф. ;)
DLosc

@DLosc, из того, что я видел, ничто не запрещает тебе это делать. Итак ... ты лучший игрок в гольф, чем я ^ _ ^
Родольфо Диас

1
Гм. Не называй Роберта Фрейзера безумным. codegolf.stackexchange.com/a/69360/43394
wizzwizz4

12

Любая римская цифра является действительным номером сцены

Это означает, что вместо:

Scene I
Scene II
Scene III
Scene IV
Scene V

Ты можешь сделать:

Scene L
Scene I
Scene C
Scene X
Scene V

является Dдействительной римской цифрой? IIRC, это 500 (но я не уверен, что он действителен в SPL)
Джузеппе

@Giuseppe Я не понимаю, почему ты не просто проверяешь это, но официальный переводчик SPL поддерживает M, C, D, X, L, I и V.
NieDzejkob

10

Удалить ненужные слова

Посмотрите на это (вставка новых строк и пробелов для удобства чтения):

Puck:You is a big big cat!
     Open your heart!
Ajax:Be you worse than I?
     If so, let us return to Scene V!
     If not, you is a cat.
     You is the sum of I and the sum of a cat and you
     Speak thy mind!
     [Exeunt]

Выглядит довольно гольф, а? Вот еще более урезанная неразборчивая форма:

Puck:You big big cat!
     Open heart!
Ajax:Be you worse I?
     If so, let us Scene V!
     If not, you cat.
     You is the sum of I the sum of a cat you
     Speak mind!

Для справки вот список легко удаляемых слов из кода:

  • Говори своим умом -> Говори своим
  • Открой свое сердце -> Открой сердце *
  • Слушай свое сердце -> Слушай
  • Открой свой разум -> Открой свой разум *
  • Ты кот -> Ты кот *
    • Относится только к константам, таким как big cat, в противном случае вам все еще нужно «есть»
  • Давайте вернемся к -> Давайте
  • Будь Х [оп], чем Y? -> Будь Х [оп] У?
  • Вы [оп] из X и Y -> Вы [оп] из X Y
  • [Exeunt] -> (удалено полностью)

Условные обозначения:

  • Xи Yявляются постоянными, как cat, Iилиyou
  • [op]Являются ли операции, как nicer,the sum of
  • * означает, что вы можете удалить пунктуацию, если это последнее предложение пьесы

Если я найду другие, я добавлю их в список.

Для дополнительной информации вот кратчайший заголовок для запуска программы:

,.Ajax,.Puck,.Act I:.Scene I:.[Enter Ajax and Puck]

Попробуйте онлайн!

При необходимости добавьте Page и Ford в качестве дополнительных символов.


1
Если вам нужно еще больше символов, есть список здесь
NieDzejkob

: | полосатый
только ASCII

6

Используйте короткие слова

Итак, вот они:

  • Используйте aвместо anили the, кроме выражений the sum ofи аналогичных, так как они не будут работать с a.
  • Используйте am, beили isвместо areили art.
  • Используйте Iвместо meили myself.
  • Используйте youвместо thee, thou, thyselfили yourself.
  • Используйте bigдля прилагательных.
  • Используйте catдля положительных чисел.
  • Используйте pigдля отрицательных чисел.
  • Используйте zeroдля нуля.
  • Используйте worseдля A < B(вместо smallerили punier).
  • Используйте nicerдля A > B(вместо better, bigger, fresher, friendlierили jollier).
  • Имена персонажей:
    • 4 буквы: Аякс, Форд, Пейдж, Шайба
    • 5 букв: Эгей, Елена, Юлия, Лучио, Мопса, Париж, Пинч, Приам, Риган, Робин, Ромео, Тимон, Тит, Венера, Альт
    • 6 букв: Адонис, Эгейон, Алонсо, Анджело, Артур, Банко, Бьянка, Брут, Цицерон, Доркас, Дункан, Эмилия, Фентон, Гамлет, Геката, Гектор, Елена, Гермиа, Имоджен, Джульетта, Леннокс, Оберон, Оливия, Орсино Порция, Таиса, Турио, Тибальт
    • 7 букв: Адриана, Эмилия, Агриппа, Антонио, Капулетта, Кассий, Клаудио, Диониса, Эскал, Гонерил, Горацио, Леонато, Лучана, Макбет, Макдуф, Малкольм, Мариана, Миранда, Октавия, Офелия, Орландо, Отелло, Пантино Публий, Мелкий, Шейлок, Стройный, Солинус, Тесей, Титания, Троил, Улисс
    • 8 букв: Ахилл, Беатрис, Бенедик, Бенволио, Клавдий, Корделия, Крессида, Кизил, Дон Джон, Фальстаф, Гертруда, Гермония, Изабелла, Лизандер, Меркуцио, Монтегю, Перикл, Полоний, Помпей, Просперо, Розалинд, Стеф, 8 букв
    • 9 букв: Агамемнон, Антиох, Автолик, Бальтазар, Брабанцио, Кассандра, Клеопатра, Корнелиус, Димитрий, Дездемона, Дональбейн, Дон Педро, Фердинанд, Франциска, Ипполита, король Иоанн, Король Лир, Лихорида, Себастьян, Призрак, Валентин, V
    • 10 букв: Андромаха, Cymberline, Fortinbras, монах Иоанн, король Генрих
    • 11 букв: Марк Антоний
    • 12 букв: доктор Гай, король Ричард, леди Капулет, леди Макбет, леди Макдафф, принц Генри, королева Элинор
    • 13 букв: Джон Гонт, Юлий Цезарь, леди Монтегю, госпожа Форд, госпожа Пейдж
    • 14 писем: монах Лоуренс, Аптекарь
    • 15 букв: Кристофер Слай, Октавий Цезарь
    • 17 писем: Джон Ланкастер, Госпожа Овердонд, Миланский Герцог
    • 18 букв: герцог Венеции
    • 24 письма: аббат Вестминстера
    • 28 писем: архиепископ Кентерберийский
    • Если вам действительно нужно больше, вам определенно следует рассмотреть возможность использования стека каждого символа.

Обратите внимание, что многословные символы могут опускать любые пробелы после своего имени (из подсказки пользователя 202729 ), поэтому они предпочтительнее символов с одним словом
Джо Кинг,

5

«Давайте вернемся к сцене X» можно использовать, даже если персонаж, с которым разговаривают, находится вне сцены. Так что вместо:

Puck:Am I as fat as the sum of a big big big big big big cat and a cat?
Ajax:If not,let us return to scene III.
[Exit Puck]
[Enter Page]
Ajax:You is a big big big big big big cat.

Ты можешь сделать:

Puck:Am I as fat as the sum of a big big big big big big cat and a cat?
[Exit Puck]
[Enter Page]
Ajax:If not,let us return to scene III.You is a big big big big big big cat.

5

Удалить лишние пробелы

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

  • the sum of
  • let us
  • the ghost( как это ) (но кто бы использовал этот персонаж в любом случае)
  • if soи if not(удалить ,после этого и не нужно добавлять пространство Пример:. if solet usact I)
  • listen to(так listen tothyработает, вот так )
  • и в основном любые многословные токены .

Примечание. Это не работает с интерпретатором Perl . Вероятно, это просто непреднамеренный эффект, вызванный синтаксическим анализом Flex. «Стандартный язык» не ясно об этом.


Время вернуться и отредактировать некоторые из моих ответов ... Очень хорошая находка!
Джо Кинг

Это ошибка в токенизаторе или это поведение определено в языке?
Cœur

2
@ Cœur Смотрите обновление.
user202729

5

Вам не нужно переключать людей в условных выражениях.

Например,

Ajax:Is you better than the sum of a fat fat fat fat cat and a fat cat?
Puck:If so,let us return to Scene I.

длиннее чем

Ajax:Is you better than the sum of a fat fat fat fat cat and a fat cat?If so,let us return to Scene I.

1
Упс. крепления.
Оливер Ни

4

Вместо вычитания добавьте константы

You is the difference between I and a big cat.

длиннее чем

You is the sum of I and a big pig.

4

Прыжки могут быть короче

Вы можете использовать, return toдаже если сцена впереди, и наоборот. На самом деле, переводчику даже не важно, пропустите ли вы его полностью. Это означает, что эти три утверждения на 100% эквивалентны:

Let us proceed to Scene X.
Let us return to Scene X.
Let us Scene X.

Джо Кинг ( codegolf.stackexchange.com/a/164394/76162 ) обнаружил, что «Давайте сцена X» достаточно.
Эд Винн

@ EdWynn приятно знать. Я переписал ответ, чтобы включить это.
NieDzejkob


4

Используйте только одну сцену

Обычно вы не можете повторно использовать первую сцену акта, так как она всегда имеет [Enter Ajax and Puck]первое. Однако вы можете предвосхитить это, [Exeunt]чтобы иметь возможность повторно использовать первую сцену пьесы. [Exeunt]на один байт короче, чем объявление новой сцены, а переход к действию на два байта меньше, чем переход к сцене.

Например: простая программа для кошек

,.Ajax,.Page,.Act I:.Scene I:.[Enter Page and Ajax]Scene V:.Ajax:Open mind!Speak thy!Let usScene V!

Попробуйте онлайн!

Для того, чтобы:

,.Ajax,.Page,.Act I:.Scene I:.[Exeunt][Enter Page and Ajax]Ajax:Open mind!Speak thy!Let usAct I!

Попробуйте онлайн!


3

Используйте более короткие слова

Примеры:

Thyи thyselfкороче yourи yourself.

Isкороче чем are.

и больше...


3

Используйте умные условия

Например, не используйте

Ajax:Are you as good as or better than me?If so,let us return to Scene I.

Скорее,

Ajax:Are you worse than me?If not,let us return to Scene I.

3

If (so|not) не нужно сразу следить за сравнением.

Am I as big as you?You big big big big big cat.If so, you is the sum of you and a big big cat.

4
Фактически, результаты сравнения сохраняются в виде флага и могут использоваться повторно при переходах между сценами или в течение нескольких If soсекунд. Это может помочь избежать повторяющихся сравнений!
Джо Кинг

2

Используйте константы для хранения больших чисел

Например, если у вас есть

Ajax:You is a fat fat fat fat fat fat fat fat fat fat cat!
Puck:You is the sum of thyself and a fat fat fat fat fat fat fat fat fat fat cat
Ajax:You is the sum of the difference of me and thyself and a fat fat fat fat fat fat fat fat fat fat cat!

Вы можете просто объявить другого человека на вершине

Ford,a fat fat fat fat fat fat fat fat fat fat cat.

и измените свой код на

Ajax:You is Ford.
Puck:You is the sum of thyself and Ford.
Ajax:You is the sum of the difference of me and thyself and Ford.

8
Официальный переводчик не поддерживает объявление таких констант.
NieDzejkob

2

Gotos - не единственные команды, которые можно использовать с If (so|not)

Am I as big as you?If so,you is the sum of you and a big big cat.If not,you is the sum of you and twice I.

2

Все новые строки игнорируются

,.Ajax,.Puck,.Page,.Act:.Scene:.[Enter Ajax and Puck]Ajax:You Puck.[Exeunt]

2

Используйте <или >вместо==

Не применимо к любой ситуации, но это немного короче:

Шайба == Аякс

Puck:Is I as bad as you?

Шайба <Аякс или шайба> Аякс

Puck:Is I worse you?
Puck:Is I nicer you?

4 байта короче для обоих!


2

Вам не нужен конец .или !.

Попробуйте онлайн!

Это также может быть использовано до [. (спасибо jimmy23013)

,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:You cat[Exeunt]

Примеры:

  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:You cat
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Open mind[Exeunt]

Не работает в:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](сразу после Scene {number}:) (однако это работает, я не знаю почему)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (и более короткие варианты)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (и более короткие варианты)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(только после того, как пустой Recall, Recall xили Recall@т.п. работ)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(без mind)

Это не работает в некоторых ситуациях, когда вы уже удалили слово, например, Speak thyилиLet us Scene I
Джо Кинг,

2

Используйте «дважды» и свойство распределения

Вместо того:

You is the sum of a big big big big cat a big big big cat.

Использование:

You is twice twice twice the sum of a big cat a cat.

Это экономит 2 байта на каждый, twiceтак как 2 использования bigсоставляют 8 байтов (с пробелом) и twiceтолько 6 байтов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.