Советы по игре в гольф в Brachylog


19

Brachylog - это язык, который в последнее время начинает играть заметную роль в коде-гольфе (и только что получил серьезное обновление с более кратким синтаксисом). Как и у Пролога, у него есть преимущество в том, что он часто может решить проблему (обычно с помощью грубой силы) просто на основе достаточно точного описания того, как выглядит проблема, что означает, что при правильном вызове он часто сопоставим с лучшие языки игры в гольф (и, как известно, время от времени побеждают Желе).

Какие у вас есть советы по игре в гольф (например, написание самых коротких программ в) Brachylog? В основном это совет, специфичный для Brachylog, а не совет, применимый к широкому кругу языков. (Советы по игре в гольф на декларативных языках в целом могут быть уместны здесь, в зависимости от того, сколько приложений они будут использовать для языков, отличных от брахилога, хотя см. Также Советы по игре в гольф в Прологе .)

Ответы:


4

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

Brachylog имеет множество специальных синтаксических случаев, чтобы сделать его две специальные переменные ?(входной / левый параметр) и .(выходной / правый параметр) более подходящими для использования. Это означает, что если вам не нужен доступ к предикату ?и ., но нужно использовать переменные, вы часто можете сохранять байты, создавая вложенный предикат, чтобы использовать его ? и ..

В качестве простого примера рассмотрим программу, которая выглядит следующим образом:

… A … ∧A … B … B …

Это довольно распространенная форма для более длинной программы; в конце концов, есть много пробелов, которые могут содержать что угодно. Предположим, что у нас нет необходимости ?или .внутри центра три пробела. Тогда мы могли бы переписать это так:

… { … & … . … } …

Здесь вложенный предикат ?выполняет роль Aи .выполняет роль B. Мы можем заметить, что этот байт короче исходного кода; изменение AABBв {?.}не имеет изменений с точки зрения байтов, но это позволило нам упростить ∧?аббревиатуру &.

Связанный трюк состоит в том, чтобы изменить

∧. … ?∧

в

~{ … }

(что на один байт короче), хотя учтите, что почти всегда дешевле заставить вызывающего абонента обмениваться аргументами (если только предикат не вызывается как минимум из трех разных мест в программе, что редко встречается в Brachylog).


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.