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


10

Bạn có lời khuyên chung nào cho việc chơi golf ở Forth (và bản sao của nó)? Tôi đang tìm kiếm những ý tưởng có thể được áp dụng cho các vấn đề về mã golf nói chung ít nhất là cụ thể đối với Forth (ví dụ: "xóa bình luận" không phải là một câu trả lời).

Câu trả lời:


3

Tránh các vòng lặp rõ ràng bằng mọi giá

Forth có hai cấu trúc lặp, x y do... loop, và ít được biết đến hơn [begin]... [until] x yở đâu xylà các giá trị cho giới hạn và chỉ mục, hoặc các điều kiện cần lưu ý, tương ứng.

Đây là rất chậm, rất nhiều từ (haha) và nói chung khá bloaty, vì vậy chỉ sử dụng chúng nếu bạn cần.

Thay vào đó, giống như một ngôn ngữ chức năng phù hợp (thực sự là Forth), người ta nên thích đệ quy hơn các vòng lặp rõ ràng vì nó có xu hướng ngắn hơn và sử dụng ngôn ngữ tốt hơn.


3

Để lại rác

Các chương trình không bắt buộc phải an toàn.

Thay vào đó, họ có thể để lại thêm rác trên ngăn xếp nếu nó giúp bạn tiết kiệm byte. Trong Forth, "giá trị trả về" đang để lại thứ gì đó trên đầu ngăn xếp. Có thể không có vấn đề gì bạn có rác bên dưới ngăn xếp đó trừ khi bạn sử dụng đệ quy và độ sâu ngăn xếp.


2

Forth có rất nhiều từ dựng sẵn thú vị, nhiều từ này hữu ích cho việc tạo ra các loại thuật toán được tìm thấy trên PPCG.

Một ví dụ xấu nhưng minh họa cho điều này là các từ để tăng ( 1+) và giảm ( 1-). Họ lưu một byte qua việc viết 1 +để tăng đỉnh của ngăn xếp.

Ngoài ra, đây là một danh sách tiện dụng gồm nhiều từ (có thể không phải tất cả) được tìm thấy trong các bản phân phối hiện đại như thế nào gforth.


1

Xem chồng

Khi viết mã của bạn, hãy chú ý đến những gì xảy ra trên ngăn xếp ở mỗi lệnh. Tôi thường vẽ nó ra khi tôi đi, như vậy:

6       6
7       7 6
* DUP   42 42

Khi bạn đi như thế này, bạn có thể tìm thấy nó dễ dàng hơn để nhận biết khi bạn có thể tận dụng ngăn xếp hoạt động như ROT, -ROT, 2DUP, 2OVER, vv ...


1

Hãy thử sử dụng các từ đôi ô khác nhau

Điều này bao gồm số học hai ô , bitwise , so sánh số và các từ thao tác ngăn xếp . Số nguyên tế bào kép cũng tính.

  • Áp dụng một khoảng thời gian trên một chữ nguyên (ví dụ 1.) cho một chữ hai ô. Đối với các số nhỏ, điều đó có nghĩa là đẩy thêm một số 0 với chi phí chỉ bằng một byte.
  • m+= 0 d+~ = under+(không chính xác, vì có thể xảy ra tràn.)
  • d2*d2/có thể được sử dụng để trích xuất / đẩy một bit từ một từ.
  • a b c d d= = = a c = b d = and
  • a b c d d<> = = a c <> b d <> or
  • Nói rằng sao chép hai số cùng một lúc, ví dụ như 2dup, 2over, 2tuckcó một cơ hội tốt để giành chiến thắng qua các biến địa phương.

0

(cụ thể của gforth) Sử dụng ngăn xếp dấu phẩy động riêng biệt

gforth có một ngăn xếp riêng cho các số dấu phẩy động. Ngay cả khi bạn chỉ xử lý các số nguyên, việc giảm tải một số công việc và lưu trữ vào ngăn xếp FP có thể dẫn đến tổng thể mã ngắn hơn, bằng cách tránh thao tác ngăn xếp rõ ràng hoặc sử dụng các hoạt động cụ thể của FP không có sẵn trên ngăn xếp chính. Quay trở lại ngăn xếp FP cũng là một tùy chọn hoàn toàn hợp lệ (trừ khi nhiệm vụ là trả về boolean).

  • Các hoạt động liên quan đến FP (số học, thao tác ngăn xếp) thường tốn thêm một byte mỗi ( ftiền tố, như trong f+, fdupv.v.). Số chữ FP cũng tốn thêm một byte (postfix e, như trong 1e), nhưng một số số có thể buộc hoặc thậm chí lưu một byte (ví dụ 1e3thay vì 1000).
  • Một số hoạt động bị thiếu trên ngăn xếp FP, có lẽ là đau đớn nhất 1+1-.
  • Các hoạt động độc đáo của ngăn xếp FP bao gồm f**(sức mạnh), falog(sức mạnh của 10) fsqrtvà các hoạt động khác nhau, log, lượng giác liên quan đến lượng giác.
  • Bạn có thể di chuyển số giữa ngăn xếp chính và FP thông qua s>f(đơn sang phao), f>s(nổi sang đơn), d>f(gấp đôi để nổi), f>d(thả nổi thành gấp đôi). Đôi khi, các biến thể "nhân đôi" có thể được sử dụng để sản xuất hoặc tiêu thụ thêm một số không.
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.