Lời khuyên cho việc chơi golf ở Brachylog


19

Brachylog là một ngôn ngữ bắt đầu nổi lên trong môn đánh gôn gần đây (và vừa nhận được một bản cập nhật lớn với cú pháp terser). Giống như Prolog, nó có lợi thế là nó thường có thể giải quyết một vấn đề (thường là thông qua lực lượng vũ phu) chỉ từ một mô tả đủ chính xác về vấn đề trông như thế nào, một tính năng có nghĩa là ở một thách thức phù hợp, nó thường có thể so sánh với ngôn ngữ chơi golf hàng đầu (và đã được biết đến để đánh bại Jelly theo thời gian).

Bạn có lời khuyên nào cho việc chơi golf (tức là viết các chương trình ngắn nhất có thể vào) Brachylog? Điều này chủ yếu là tìm kiếm lời khuyên dành riêng cho Brachylog, chứ không phải là lời khuyên áp dụng cho nhiều ngôn ngữ. (Lời khuyên về việc chơi golf trong các ngôn ngữ khai báo nói chung có thể có khả năng phù hợp ở đây, tùy thuộc vào số lượng ứng dụng mà chúng sẽ phải sử dụng cho các ngôn ngữ khác ngoài Brachylog, mặc dù cũng xem Mẹo chơi golf trong Prolog .)

Câu trả lời:


4

Khai thác các biến vị ngữ lồng nhau để tạo các biến mới

Brachylog có rất nhiều trường hợp cú pháp đặc biệt để tạo hai biến đặc biệt của nó, ?(tham số đầu vào / bên trái) và .(tham số đầu ra / bên phải), sử dụng. Điều này có nghĩa rằng nếu bạn không cần phải truy cập vào vị của bạn ?., nhưng làm cần thiết để biến sử dụng, bạn có thể thường tiết kiệm byte thông qua việc tạo ra một vị lồng nhau để sử dụng ?..

Ví dụ đơn giản, hãy xem xét một chương trình giống như thế này:

… A … ∧A … B … B …

Đây là một hình dạng khá phổ biến cho một chương trình dài hơn; Rốt cuộc, có rất nhiều khoảng trống có thể chứa bất cứ thứ gì. Giả sử chúng ta không có nhu cầu ?hoặc .bên trong trung tâm ba khoảng trống. Sau đó chúng ta có thể viết lại nó như thế này:

… { … & … . … } …

Ở đây, vị ngữ lồng nhau ?đang phục vụ vai trò của Anó và nó .đang phục vụ vai trò của B. Chúng ta có thể quan sát rằng đây là một byte ngắn hơn mã gốc; thay đổi AABBthành {?.}không có thay đổi về byte, nhưng điều này cho phép chúng tôi đơn giản hóa ∧?thành chữ viết tắt &.

Một mẹo liên quan là thay đổi

∧. … ?∧

đến

~{ … }

(ngắn hơn một byte), mặc dù lưu ý rằng hầu như luôn luôn rẻ hơn để khiến người gọi trao đổi các đối số thay vào đó (trừ khi vị từ được gọi từ ít nhất ba vị trí khác nhau trong chương trình, điều hiếm thấy ở Brachylog).


3

Phân chia độ dài 2 vị ngữ bên trong metapredicates

Điều này được giải thích tốt nhất bằng ví dụ. Để loại bỏ các yếu tố đầu tiên và cuối cùng của danh sách, chúng tôi chặt đầu và cắt nó:

bk

Nếu chúng tôi muốn thực hiện thao tác này trên mọi thành phần của danh sách, chúng tôi có thể sử dụng thao tác bản đồ:

{bk}ᵐ

Tuy nhiên, đó là một byte ngắn hơn để chia vị ngữ thành hai và ánh xạ từng phần riêng biệt:

bᵐkᵐ

Thủ thuật tương tự có thể được sử dụng với khá nhiều phép ẩn dụ:

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

Lưu ý rằng đối với một số phép ẩn dụ, như , không có cách nào có mục đích chung để chia nó thành hai phần, nhưng dù sao cũng có thể tìm thấy một phép phân tách hoạt động cho nhiệm vụ cụ thể mà bạn đang làm.


3

Truyền danh sách trống vào chuỗi trống

Đôi khi, khi làm việc với các chuỗi, thuật toán chúng tôi sử dụng có thể thống nhất những gì chúng tôi muốn với danh sách trống [], khi chúng tôi muốn có chuỗi trống "".

Chúng ta có thể truyền danh sách trống vào chuỗi trống bằng cách sử dụng ,Ẹ, nối thêm chuỗi trống vào biến bên trái của nó (đây là cách khai thác theo cách ,được triển khai).

Điều này cũng có lợi ích là nó không làm gì nếu biến trái là một chuỗi. Vì vậy, nếu chương trình của bạn là

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

Sau đó

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

sẽ làm việc theo cách bạn muốn.


2

Phần tử đơn chạy trong một danh sách

Hãy xem xét đoạn trích này:

ḅ∋≠

Nếu đầu vào là một danh sách hoặc chuỗi, đầu ra được hợp nhất với một danh sách con / chuỗi con có độ dài 1 không phải là một phần của chuỗi các phần tử bằng nhau dài hơn. Nó chia danh sách thành các khối có các phần tử bằng nhau và tìm thấy một khối có các phần tử khác nhau. Để có được các yếu tố chính thay vì danh sách đơn, hãy giải hquyết đến cùng. Tôi sử dụng cấu trúc này ở đây với ođể tìm một nhân vật mà chỉ xảy ra một lần trong chuỗi đầu vào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.