Mẹo chơi gôn bằng ngôn ngữ 2D


18

Bạn có lời khuyên chung nào cho việc chơi golf trong các ngôn ngữ lập trình 2 chiều? Tôi đang tìm kiếm các mẹo có thể áp dụng cho các vấn đề về golf-golf và dành riêng cho các ngôn ngữ lập trình 2D, nhưng không cụ thể cho bất kỳ ngôn ngữ nào (Các phản hồi như "xóa nhận xét" và "sử dụng Mthao tác" không phải là câu trả lời).

Xin vui lòng gửi một lời khuyên cho mỗi câu trả lời.


Không nên đặt câu hỏi này trên Meta?
Ông Lister

2
Có một meta câu hỏi có liên quan ở đây: những gì kích thước của một chương trình 2D? Khu vực được che chăn? Diện tích thân tàu lồi? Diện tích của hình chữ nhật thẳng hàng chứa trục? Tất cả có thể là các biện pháp tốt hơn so với một số dạng kích thước ASCII.
MSalters

@MrLister Mẹo câu hỏi là về chủ đề cho trang web chính. Nếu bạn nhìn bạn có thể thấy rằng chúng tôi có rất nhiều câu hỏi dưới thẻ mẹo.
Phù thủy lúa mì

@MSalters Giống như mọi độ dài ngôn ngữ lập trình khác được đo bằng byte. Một số nhà thiết kế ngôn ngữ cho phép các ngôn ngữ 2D được sắp xếp theo các cách khác nhau, như Hexagony hoặc Cubix, và tùy theo chúng.
Thuật sĩ lúa mì

Câu trả lời:


19

Tránh các khoảng trống ngang

Thông thường, mã sẽ để lại khoảng trống lớn của khoảng trắng ở phía bên trái của chương trình, như vậy.

abc
  d
  e

Điều này thêm 4 byte, khi điều này có thể tránh được bằng cách căn trái.

cde
b
a

Nếu bạn cần sử dụng những khoảng trống lớn của khoảng trắng, hãy thử làm cho chúng thẳng đứng, thay vì ngang.

########
#      #
#      #
#      #

đấu với

####
#
#
#
#
#
#
####

11

Sử dụng một chiều khi có thể

Thông thường, các chương trình đơn giản hơn có thể được viết trên một dòng duy nhất. Ví dụ, chương trình mèo cổ điển có thể là:

>iv
^o<

Nhưng người ta có thể lạm dụng hành vi gói và thực hiện điều này:

io

Hoặc, trong các ngôn ngữ không có hành vi gói như vậy:

> ?oi<

(Giả sử ?không bật.) Trong trường hợp ngôn ngữ không gói, một vòng lặp rõ ràng thường tốt hơn.

Với lệnh nhảy

Trong các ngôn ngữ 2D có lệnh nhảy và lệnh nhảy có điều kiện, một chương trình có thể trông như thế này:

abc >de?v;
    ^hgf<

Điều này cũng có thể là:

abc de?!;hgf04&

(nếu !là tấm bạt lò xo, và &nhảy đến vị trí)


Chẳng phải ví dụ thứ ba của bạn làm ioiioiioiv.v.?
ASCII - chỉ

@ ASCII-chỉ thực sự nó làm. Giáo sư.
Conor O'Brien

1
Bạn có thể nên nói những gì một số lệnh ít thường xuyên làm. Ví dụ tôi không biết io;phải làm gì và tất cả những gì tôi biết là ?không bật. Có vẻ như đây là những lệnh cá, nhưng tôi không nghĩ chúng rất chuẩn.
Thuật sĩ lúa mì

2
Trong một số ngôn ngữ 2D không có lệnh bỏ qua có điều kiện (như Labyrinth), bạn cũng có thể thường xuyên viết các chương trình đơn dòng lặp bằng cách kết thúc có điều kiện chương trình với số chia cho 0.
Martin Ender

10

Trả về vận chuyển là byte quá

Càng ít 2D bạn có thể làm cho nó, tốt hơn. Một sự trở lại vận chuyển là một no-op khác. Không bỏ qua các mẹo từ chỉ @ATaco và @ ASCII, hãy thử và giữ kích thước Y nhỏ nhất có thể.

Điều này

###
####
########

tốt hơn

###
###
###
##
#
#
#
#

Vận chuyển trở lại không phải luôn luôn byte. \n(nguồn cấp dữ liệu) là dòng kết thúc được sử dụng thường xuyên trong văn bản được căn trái trên các hệ thống POSIX, mặc dù Windows và Mac OS (tiền macOS) sử dụng kết hợp \n(nguồn cấp dữ liệu) và \r(trả lại dòng).
wizzwizz4

9

DRY (Đừng lặp lại chính mình)

Mặc dù trừu tượng hóa với các chức năng thường dài hơn trong Code Golf, nhưng nó thực sự có thể giúp ích cho các ngôn ngữ 2D. Cố gắng làm lại mã của bạn để nó có thể sử dụng lại cùng một đoạn mã, nhập / thoát mã với hai nhánh thực thi khác nhau.


8

Đường xen kẽ

Thông thường trong ngôn ngữ 2D có một IP di chuyển theo các lệnh điều hướng. Vì các không gian bị lãng phí byte, nên hầu như luôn hiệu quả hơn để sắp xếp lại chương trình để nó di chuyển gần bên trái càng thường xuyên càng tốt, tiết kiệm nhu cầu cho các không gian đệm không cần thiết.


2

Sử dụng gương

Gương đôi khi có thể được sử dụng trong hai đường dẫn cùng một lúc (mỗi đường dẫn bật ra khỏi một phía của gương). Điều này có vẻ không hữu ích, nhưng nó có thể cho phép bạn sắp xếp lại chương trình của mình hoặc nếu bạn có nhiều nếu thay đổi hướng, chúng có thể được thay thế bằng ít gương hơn.


2

Ghi nhớ thành ngữ

Dưới đây là một vài "thành ngữ" làm một số việc nhất định, tùy thuộc vào bản chất của ngôn ngữ.

Mã giả tuyến tính

Nếu việc tạo mã động là bắt buộc, thì có thể sử dụng mô hình mã giả tuyến tính:

v
\"line 1"
\"line 2"
.
.
\"line N"

Giả sử \vcó nghĩa là những gì họ thường làm.

Vòng lặp vô hạn

Trong hầu hết tất cả các ngôn ngữ 2D, ><là một vòng lặp vô hạn, không thể phá vỡ. Nếu, vì một số lý do, bạn cần phải làm điều này, đây là cách tốt nhất, mặc dù nó trông đẹp như thế nào:

>v
^<

Trong thực tế, nếu bạn tạo mã của mình thành 1-liner , bạn chỉ có thể sử dụng ^hoặc v, như vậy:

i?vo;

Điều này vsẽ gửi IP cho chính nó, bao quanh. Bạn vẫn có thể sử dụng phương pháp này trong mọi trường hợp trong đó một lệnh định hướng trỏ đến một loạt các lệnh tương đối (tương đối).

Khung quine

Thông thường, các ngôn ngữ có khung chuỗi / trích dẫn có thể có một câu hỏi như thế này:

<quote><generate "><output stack><terminate>

Đối với> <>, điều này sẽ giống như:

":1-r>o<#

Ngoại trừ điều này thoát với một lỗi là chấm dứt. Nó có lẽ là ngắn nhất > <> quine , hoặc, ít nhất, là ngắn nhất mà tôi đã tìm thấy.


Điều này thực sự không giống như một mẹo.
Phù thủy lúa mì

@WheatWizard Tôi giữ chúng lại với nhau vì việc tách chúng ra ít có ý nghĩa với tôi, là tất cả các thành ngữ bố cục chương trình phổ biến.
Conor O'Brien

Tại sao bạn có <trong> <> quine?
Jo King

@JoKing Tôi không chắc lắm lol
Conor O'Brien

Ngoài ra, "kết thúc ở phía sai. Mẹo hay là nếu không, tôi đã sử dụng khuôn khổ chung đó trong rất nhiều câu trả lời của mình
Jo King
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.