Lời khuyên cho việc chơi golf trong khoảng trắng


14

Bạn có lời khuyên chung nào cho việc chơi golf trong Whitespace? Tôi đang tìm kiếm những ý tưởng có thể áp dụng cho các vấn đề về golf-code và ít nhất cũng hơi cụ thể đối với Whitespace (ví dụ: "xóa bình luận" không phải là một 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.


82
Loại bỏ khoảng trắng không cần thiết.
KSFT

1
s / [^ [: space:]] // g
Chấn thương kỹ thuật số

Câu trả lời:


11

Tôi không hoàn toàn chắc chắn liệu đây có phải là một câu hỏi đùa hay không, vì vậy tôi hy vọng tôi không bị chế giễu vì đã nghiêm túc, nhưng ...

Mẹo 1: Không kết thúc chương trình của bạn

Thông số kỹ thuật nói rằng một chương trình nên được kết thúc bằng ba nguồn cấp dữ liệu, [LF][LF][LF]trong đó đầu tiên là điều khiển luồng IMP và hai chương trình tiếp theo là lệnh thoát, nhưng nhiều trình thông dịch sẽ chỉ chạy mã của bạn mà không có kết thúc phù hợp. Tiết kiệm cho bạn 3 ký tự trong bất kỳ chương trình.


6

Mẹo 2: Sử dụng Heap càng ít càng tốt

Tôi đã từng sử dụng Heap rất nhiều để đếm các vòng lặp của mình và như vậy, nhưng nhận ra nó thực sự cực kỳ kém hiệu quả; đầu tiên đẩy một địa chỉ, lấy số hiện tại, lấy / thêm một địa chỉ, đẩy lại địa chỉ, v.v.

Bây giờ tôi chỉ cần đẩy một giá trị trên ngăn xếp để hoạt động như bộ đếm vòng lặp, sau đó sử dụng [Space][LF][Tab]lệnh hoán đổi để quay lại nó khi tôi cần. Nó đòi hỏi rất nhiều công việc trong / xung quanh, nhưng khi bạn nhận được nó thực sự có thể làm giảm số lượng char của bạn.


5

Sử dụng địa chỉ heap tùy ý

Nhiều thông dịch viên cho phép bạn đọc / ghi vào các địa chỉ heap tùy ý thay vì bắt đầu từ 0 hoặc 1 và đếm lên. Bạn có thể nhân đôi giá trị ngăn xếp hiện có (3 byte) để sử dụng làm địa chỉ thay vì đẩy một giá trị mới (tối thiểu 4 byte)


+1. Lưu ý rằng điều này chỉ áp dụng cho các địa chỉ heap không âm. Vì vậy, nếu đỉnh của ngăn xếp là một số nguyên âm, bạn không thể sử dụng nó làm địa chỉ heap.
Kevin Cruijssen


5

Hạ tất cả các ký tự xuống một lượng cố định và thêm nó ngay trước khi in trong một vòng lặp

Tín dụng cho @LukStorms , người sử dụng một cách tiếp cận tương tự trong câu trả lời của mình cho thử thách Hello World .

( STNđược sử dụng cho Space, Tab và New-line tương ứng.)

Đẩy các giá trị cho các chữ cái luôn là 11 byte (tức là đẩy giá trị 65 cho ký tự 'A' là SSSTSSSSSTN; đẩy giá trị 122 cho ký tự 'z' là SSSTTTTSTSN). Khi bạn muốn xuất số lượng lớn văn bản, điều này có thể tốn kém. Thay vào đó, bạn có thể hạ thấp giá trị của tất cả các ký tự bạn muốn in theo một lượng cố định, sau đó trong vòng lặp để in chúng thêm số lượng cố định này.

Điều này có thể được thực hiện với mã sau đây (giả sử giá trị cố định là 100 trong trường hợp này):

  1. Đẩy tất cả các giá trị cho các ký tự (trừ số tiền cố định 100) theo thứ tự ngược lại
  2. NSSN (Tạo một Nhãn_0; về cơ bản bắt đầu vòng lặp)
    1. SSSTTSSTSSN (Đẩy số tiền cố định 100)
    2. TSSS (Thêm hai giá trị trên cùng của ngăn xếp với nhau)
    3. TNSS (Pop và in giá trị chính xác bây giờ dưới dạng ký tự)
    4. NSNN (Chuyển đến Label_0; chuyển đến lần lặp tiếp theo của vòng lặp)

Điều này sẽ dừng chương trình có lỗi ( được cho phép theo meta ) ngay khi nó cố gắng thực hiện Thêm ( TSSS) mà không có gì thêm trên ngăn xếp. Tôi đã sử dụng điều này để đánh golf câu trả lời này của tôi (xem mục 5 và 6 trong số những điều tôi đã làm để giảm số lượng byte ).

Việc số lượng cố định 100 có phải là cách tiếp cận ngắn nhất hay không phụ thuộc vào những gì bạn đang in. Ví dụ @LukStorm đã sử dụng 107 trong câu trả lời Hello World của anh ấy.

Lưu ý rằng sao chép giá trị trên cùng ( SNS) cho hai trong số các ký tự liền kề (như lin Hello) hoặc sao chép giá trị từ một vị trí khác vẫn có thể được sử dụng ngoài điều này để đánh gôn nhiều byte hơn.


4

Nhảy đến các nhãn không xác định kết thúc chương trình (trong một số phiên dịch)

Điều này bắt đầu có được vào hành vi cụ thể thực hiện, nhưng tôi tin rằng điều này được cho phép .

TIO (và có thể là các thông dịch viên khác? Không hoạt động trên ideone ít nhất) sẽ dừng thực thi khi một nỗ lực được thực hiện để chuyển đến một nhãn không tồn tại. Nếu bạn cần thực hiện một phép so sánh để thoát ra khỏi vòng lặp, điều này cho phép bạn lưu byte bằng cách không khai báo nhãn break. (Xem bình luận của tôi về In văn bản vô hình để biết ví dụ.)


4

Giá trị 0 có thể được khai báo là một số không có chữ số nhị phân

Hướng dẫn về khoảng trắng đề cập rằng các số có thể là bất kỳ số lượng bit / chữ số nhị phân nào. Điều này có nghĩa là một số không có bit (ngoài bit dấu yêu cầu) là biểu diễn hợp lệ của giá trị 0. [Space][Space][Space][LF][Space][Space][Space][Space][LF]cả hai đều đẩy giá trị 0 lên ngăn xếp nhưng trước đây ngắn hơn một byte.


0

Sao chép số nguyên trước có thể ngắn hơn tạo số nguyên mới

( STNđược sử dụng cho Space, Tab và New-line tương ứng.)

STS+ Đối số số có thể được sử dụng để Sao chép mục thứ n trên ngăn xếp (được đưa ra bởi đối số) lên trên cùng của ngăn xếp . Điều này trong một số trường hợp có thể được sử dụng để lưu byte.

Ví dụ, trong câu trả lời này của tôi, tôi đã giải thích trong mục thứ 4 của Những điều tôi đã làm để hạ thấp số byte theo cách sao chép giá trị thứ nhất (0 chỉ mục) ( STSSTN) ngắn hơn so với việc đẩy 12 để tạo ký tự 'p' ( SSSTTSSN) trong một phần "pop"của đầu ra. (LƯU Ý: Tôi sử dụng giá trị 12 thay vì 112 cho ký tự 'p', vì tôi đã áp dụng mẹo khác này để giảm tất cả các giá trị theo một mức cố định, chúng tôi thêm trước khi in các ký tự trong vòng lặp .)

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.