Поради щодо гольфу в Брахілогу


19

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

Які поради для гольфу (тобто написання найкоротших можливих програм у) Брахілог? Це здебільшого шукає поради, яка є характерною саме для Брахілогів, а не поради, що застосовуються до широкого кола мов. (Поради щодо гольфу на декларативних мовах взагалі можуть бути тут доречними, залежно від того, скільки додатків вони матимуть для інших мов, ніж брахілог, хоча див. Також Поради щодо гольфу в Прологу .)

Відповіді:


4

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

У Brachylog є безліч спеціальних синтаксичних випадків, щоб зробити дві спеціальні змінні ?(параметр "введення / ліворуч") і .(параметр "вихід / правий") використовуватись більш просто. Це означає, що якщо вам не потрібно отримувати доступ до свого предиката ?та ., але вам потрібно використовувати змінні, ви можете часто зберігати байти, створюючи вкладений предикат, щоб використовувати його ? та ..

Як простий приклад, розгляньте програму, яка виглядає приблизно так:

… A … ∧A … B … B …

Це досить поширена форма для більш тривалої програми; зрештою, існує велика кількість прогалин, які можуть містити що завгодно. Припустимо, нам не потрібні три проміжки ?або .всередині центру. Тоді ми могли б переписати це так:

… { … & … . … } …

Тут вкладений присудок ?виконує роль A, а його .виконує роль B. Ми можемо спостерігати, що це байт коротший від початкового коду; зміна AABBна {?.}не має змін у байтах, але це дозволило нам спростити ∧?до абревіатури &.

Пов'язаний трюк - змінити

∧. … ?∧

до

~{ … }

.


3

Розділити довжину-2 предикати всередині метапредмет

Це найкраще пояснити на прикладі. Щоб видалити перший та останній елементи списку, обезголовляємо та ножем:

bk

Якщо ми хотіли виконати цю операцію на кожному елементі списку, ми можемо використовувати операцію з картою:

{bk}ᵐ

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

bᵐkᵐ

Цей же трюк може бути використаний з досить декількома метапрогнозами:

{bk}ᵐ  →  bᵐkᵐ
{bk}ˢ  →  bˢkˢ
{bk}ᶠ  →  bᶠkˢ
~{bk}  →  ~k~b

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


3

Закидання порожнього списку в порожній рядок

Іноді, працюючи з рядками, алгоритм, який ми використовуємо, може уніфікувати те, що ми хочемо, із порожнім списком [], коли ми швидше хочемо порожній рядок "".

Ми можемо привести порожній список до порожнього рядка за допомогою ,Ẹ, який додає порожню рядок до її лівої змінної (це використання способу ,реалізації).

Це також має перевагу в тому, що він нічого не робить, якщо ліва змінна є рядком. Отже, якщо ваша програма є

{  
   some predicate that should always output a string, 
   but actually outputs [] instead of "" in specific cases
}

Потім

{
  some predicate that should always output a string, 
  but actually outputs [] instead of "" in specific cases
},Ẹ

буде працювати так, як ви хочете.


2

Одноелемент працює у списку

Розглянемо цей фрагмент:

ḅ∋≠

Якщо вхід - це список або рядок, то висновок уніфікований з підспілом / підрядком довжиною 1, який не є частиною більш тривалого пробігу рівних елементів. Він розбиває список на блоки рівних елементів і знаходить блок, елементи якого всі різні. Щоб отримати самі елементи замість одиночних списків, торкніться hдо кінця. Я використав цю конструкцію , тут з , oщоб знайти символ , який зустрічається тільки один раз в рядку введення.

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