Поради щодо гольфу в мові програмування Шекспіра


43

Які загальні поради щодо гольфу в мові програмування Шекспіра? Я шукаю ідеї, які можна застосувати до проблем із гольф-кодом і які також принаймні дещо специфічні для SPL (наприклад, "видалити коментарі" - це не відповідь).

Будь ласка, опублікуйте одну пораду за кожну відповідь.


17
Я не впевнений, що ви можете грати в SPL. SPL настільки багатослівний, що мені майже здається, що для цього питання потрібен тег тролінгу коду. : P
Олексій А.

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

@RodolfoDias: чутливий? Я думаю, ти є резидентом Шекспіра, вченим в PPCG.
Олексій А.

8
@AlexA. Що може не бути хорошою справою: це просто означає, що я досить дементований, щоб спробувати зрозуміти SPL :-)
Rodolfo Dias

@AlexA. Sp може це зробити ...
Conor O'Brien

Відповіді:


18

(Ну ... оскільки це моя прийнята мова 1 , я відчуваю, що я зобов'язаний щось тут додати)

Використовуйте короткі імена змінних

Так, так, так, це досить стандартно для коду-гольфу, ви просто використовуєте одноіменні назви змінних, тут немає ніяких новин. Або є? Тому що голови, які створили SPL, були досить дурними, щоб не допустити жодної назви змінних їхньої мови: вони повинні походити з п'єс Шекспіра, що, з точки зору довжини символів, є болем у королівському туші, - але, якщо ви кодуєте в SPL , ви це вже знаєте. Тож моя порада полягала б у тому, щоб, наприклад, використовувати замість архієпископа Кентерберійського персонажа символи з короткими іменами, як-от Ajax , Ford , Page або Puck .

Це все, що я маю, боюся.


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, інакше вам все одно потрібне значення "є"
  • Повернемося до -> Повернемося
  • Будьте X [оп], ніж Y? -> Бути X [op] Y?
  • Ви [оп] X і Y -> Ви [op] ofX Y
  • [Exeunt] -> (видалено повністю)

Легенда:

  • Xі Yє константами на зразок cat, Iабоyou
  • [op]такі операції, як nicer,the sum of
  • * означає, що ви можете видалити розділові знаки, якщо це останнє речення п’єси

Якщо я натрапляю на інших, я додаю його до списку.

Для додаткової довідки, ось найкоротший заголовок для запуску програми:

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

Спробуйте в Інтернеті!

Додайте Сторінку та Форда як додаткові символи, якщо потрібно.


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 листів: Ахілл, Беатріче, Бенедік, Бенволіо, Клавдій, Корделія, Крессіда, Догбрі, Дон Джон, Фальстаф, Гертруда, Гермонія, Ізабелла, Лісандр, Меркуціо, Монтег, Перикл, Полоній, Помпей, Просперо, Розалінд, Стефано
    • 9 листів: Агамемнон, Антіох, Автолік, Бальтазар, Брабантіо, Кассандра, Клеопатра, Корнелій, Деметрій, Дездемона, Дональбайн, Дон Педро, Фердинанд, Франциска, Іполіт, король Джон, король Лір, Ліхоріда, Себастьян, Привид, Валентин, Вінчен
    • 10 листів: Андромаха, Кімберлайн, Фортінбрас, брат Іоанн, король Генріх
    • 11 листів: Марк Антоній
    • 12 листів: Доктор Кай, Кінг Річард, Леді Капулет, Леді Макбет, Леді Макдуфф, Принц Генрі, Королева Елінор
    • 13 листів: Джон з Гонта, Юлій Цезар, леді Монтег, господиня Форд, Господиня Сторінка
    • 14 листів: брат Лоранс, аптекар
    • 15 листів: Христофор Слай, Октавій Цезар
    • 17 листів: Іван Ланкастер, коханка перестала, герцог Міланський
    • 18 листів: Герцог Венеції
    • 24 листи: Ігумен Вестмінстерський
    • 28 листів: Архиєпископ Кентерберійський
    • Якщо вам дійсно потрібно більше, вам неодмінно варто розглянути можливість використання стека кожного символу.

Зауважте, що символи з кількома словами можуть опускати будь-які пробіли після свого імені (від підказки користувача202729 ), тому вони переважніші для символів, що мають лише одне слово
Jo King,

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 Дивіться оновлення.
користувач202729

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 sos. Це може бути корисно уникнути повторень порівнянь!
Джо Кінг

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

Вам не потрібно закінчення .або !.

Спробуйте в Інтернеті!

Це також можна використовувати перед a [. (спасибі 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 байти на twice2, оскільки 2 використання - bigце 8 байт (з пробілом) і twiceстановить лише 6 байт.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.