Поради щодо гольфу в INTERCAL


10

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

Я знаю, що екзотичні мови можуть бути дуже корисними для перемоги в змаганнях з гольфу, але я не бачу тут багато ІНТЕРКАЛ-коду. Чи є у вас поради, які допоможуть людям отримати конкурентоспроможний розмір коду за допомогою INTERCAL? Чи може ця мова коли-небудь бути конкурентоспроможною?

INTERCAL настільки недостатньо використовується, що навіть не має тегу. Так сумно...


Більшість мов не мають або не потребують власних тегів тут, оскільки специфічні для мови проблеми, як правило, не рекомендуються.
Олексій А.

9
Натяк на те, що це може бути не найкращою мовою для гольфу, зі своєї сторінки Вікіпедії:Despite the language's intentionally obtuse and wordy syntax,
isaacg

Відповіді:


2

Видалення пробілів / "шуму" може піти далі, ніж ви могли очікувати

INTERCAL - нечутлива до білого простору мова. На відміну від більшості нечутливих до пробілів мов, однак, нечутливість йде набагато далі, ніж можна було очікувати.

Наприклад, DO NOTце два лексеми, але вони можуть бути записані DONOTбез скарг аналізатора (майже будь-якої широко використовуваної реалізації). (Звичайно, ви також можете писати DON'T, але це не будь-яке тендесне. Хоча читати це може бути і простіше. PLEASEN'TМабуть, важче читати, ніж PLEASE NOTвсе-таки.) Насправді, існує певна дискусія щодо того, чи білий пробіг взагалі щось робить; принаймні один аналізатор INTERCAL дозволяє це навіть усередині числових констант (не те, що дуже корисно при гольфі). Одна річ , щоб мати на увазі, що видалення прогалини з DO READ OUTдає , які можуть ввести в оману деяких старих INTERCAL парсери з - за вбудованогоDOREADOUTDO(хоча їх автори, як правило, вважають це помилкою, і, як правило, зараз він працює у дійсній програмі, не доцільно ставити такий код поблизу синтаксичної помилки, оскільки це може бути набагато складніше розлучати).

Також пам’ятайте, що ви можете перевантажувати символів, щоб заощадити місце. В ASCII ви можете реально зняти це лише з допомогою '.!, але це дуже корисний трюк сам по собі. (Якщо ви не використовуєте масиви, не існує можливості неоднозначності спаркеров, навіть коли всі ваші символи групування однакові, тому для записів для гольфу рекомендується дотримуватися лише 'тих випадків, якщо підписник масиву справді не вимагає ".) представлений в одному байті, використовуючи ?абревіатуру (C-INTERCAL) або латинську-1 для ¥(CLC-INTERCAL), а не три, які потрібні INTERCAL-72.


2

Орієнтуйтеся на те, щоб виконати якомога більше роботи в одній заяві

Ідентифікатори тверджень INTERCAL є досить багатослівними; DOце два символи шуму на кожному висловлюванні, сама назва висловлювання також має тенденцію бути досить довгою, і вам доведеться вводити PLEASEраз у раз, щоб тримати парсер щасливим. (Найкраще, що ви можете зробити, - це співвідношення чотирьох DOдо одиниці PLEASE, тобто ви використовуєте 14 символів в ідентифікаторах на кожні 5 команд.) З іншого боку, синтаксис виразів досить лаконічний (смішний, але лаконічний). Це означає, що часто варто вмонтувати частину вашої програми в єдиний вираз, навіть коли використання декількох висловлювань було б "природнішим" способом робити.

Наприклад, якщо ви хочете призначити #1в .1і #2до .2, замість того , щоб робити це в очевидному INTERCAL-72 чином:

DO.1<-#1DO.2<-#2

настійно варто подумати про перевантаження випадкової змінної, щоб дозволити призначити обидва відразу

DO:1<-#1$#2

:1/!1$.2'кинутим десь раніше в програмі; зауважте, що ця нотація досить просто розміщує INTERCAL-72, тому для роботи вам потрібно буде використовувати сучасний INTERCAL). Це лише трохи довше, навіть якщо ви врахуєте налаштування, і стає коротшим, якщо вам коли-небудь потрібно або можете домовитись про те, щоб одночасно призначати .1та .2більше одного разу.

Це не просто обчислити команди, де працює цей трюк. Якщо вам потрібно двічі сховати змінну, не робіть це так:

DOSTASH.1DOSTASH.1

але ось так:

DOSTASH.1+.1

( +Позначення працює для більшості команд, де це концептуально може мати сенс.)


2

Використовуйте єдиний RESUME для всіх стилів INTERCAL-72, якщо йдеться

Якщо вам потрібно написати еквівалент оператора "якщо", звичайний метод, що використовує код INTERCAL-72, - це NEXTдвічі, а потім зробити обчислений RESUME. (У сучасному коді часто обчислюватися COME FROMбуде краще, але ця порада передбачає, що ваш код надає перевагу NEXT.) Ви майже напевно повинні платити байти за перше NEXT, оскільки він переходить з однієї гілки "якщо" на іншу. Спільний доступ до другого NEXTтакож нетривіальний, якщо у вас є багато висловлювань "якщо", які переходять на те саме місце, побачивши #1. Однак програма RESUMEможе бути де завгодно в програмі (адже контроль збирається залишити її в будь-якому місці).

Є два способи впоратися з цим. Якщо у вас є багато висловлювань "якщо", то, RESUMEймовірно, гарантує одноцифровий номер рядка, щоб ваш другий NEXTвислів був максимально коротким. Якщо можливо, спробуйте зробити його обчисленим, RESUMEщо природним чином відбуватиметься у вашому коді (правда, це складно, оскільки рідко вони з’являються у «нормальному потоці» коду, а не NEXTредагуються); тоді, єдиною вартістю є номер рядка. Вам доведеться використовувати одну булеву змінну для всіх цих NEXTs; тут використовується універсальний консенсус .5, здебільшого тому, що це змінна, яку використовує стандартна бібліотека для булевих повернених значень.

Крім того, можна скористатися недокументованою (технічно недокументованою, тому що я пропустив підказку в документацію INTERCAL, коли помітив) функцію стандартної бібліотеки. Оскільки центральне місце для а RESUMEтак корисне, стандартна бібліотека використовує внутрішнє. Номери рядків в INTERCAL є глобальними (з умовами простору імен, але які можуть бути порушені, якщо ви знаєте, що ви робите), тож ви можете NEXTпотрапити в стандартну внутрішню бібліотеку, якщо хочете, і, зокрема, можна NEXTдо її центрального RESUME-місцезнаходження . Це досить популярно в існуючому коді INTERCAL, що стандартні заміни бібліотеки, як правило, повинні реалізовувати його, щоб уникнути порушення існуючих програм.

Рядок, про який йде мова, є (буквально чи ефективно, залежно від реалізації):

(1001) DO RESUME .5

Основна причина не використовувати це її довгий номер рядка; якщо вам потрібно зробити багато стилів INTERCAL-72, якщо конструкції, то краще використовувати свій власний, щоб надати йому меншу кількість.

Звичайно, ви можете комбінувати техніку, написавши щось подібне

(9)DO(1001)NEXT

що лише незначно довше, ніж

(9)DORESUME.5

і має перевагу, що булеви стають #2і #3(що важче читати, але зазвичай простіше генерувати). Насправді, можливо, варто ввести додатковий код для обробки, #0і #1якщо ви збираєтеся багато іфікувати (але обчислені COME FROM, мабуть, будуть працювати краще в цьому випадку, якщо ваші вимоги не дуже дивні).


2

INTERCAL не визначає пріоритет, але він також не помиляється на неоднозначному пріоритеті

Вираз, як

#1$#2~#3

неоднозначно, і може означати

'#1$#2'~#3

або

#1$'#2~#3'

Специфікація INTERCAL залишає це навмисно незрозумілим, що мається на увазі, і взагалі немає стандарту (хоча C-INTERCAL і CLC-INTERCAL намагаються відповідати один одному у більш простих випадках). Однак, оригінал невірний ; це неоднозначно, і я б не радив використовувати його у виробничому коді (але тоді я б не радив використовувати сам INTERCAL у виробничому коді), але це матиме певне значення у більшості компіляторів.

Іншими словами, можливо, варто просто видалити групування символів і сподіватися, що програма все-таки працює. Більшість інтерпретаторів послідовно розбирають будь-який заданий неоднозначний вираз, тому для кожної пари групуючих символів шанс 1 на 2 є непотрібним; що може призвести до економії. (На жаль, INTERCAL парсери , як правило, досить заплутаним , що нікого немає зовсім впевнений , що правила на насправді є , але , як правило , можна визначити експериментальним шляхом. У найпростіших випадках оператори , як правило, всі вони мають однаковий пріоритет , і мати послідовну асоціативність.)


2

У C-INTERCAL розгляньте скорочення коду з використанням CREATE

CREATEЗаява дозволяє створювати новий синтаксис. Це особливо корисно в гольфі, оскільки дозволяє давати висловлювання короткі назви. Ви також можете використовувати його для ефективного "визначення функції", створивши нового оператора (який має величезну перевагу, що дозволяє йому викликати функцію в середині виразу).

Вартість налаштування тут досить висока, але якщо є конструкція, яку ви багато використовуєте, винайдіть коротший синтаксис для цього, ймовірно, буде хорошою ідеєю.

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