Советы по игре в гольф в 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.