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


12

Bạn có lời khuyên chung nào cho việc chơi golf ở Befunge? Tôi đang tìm kiếm những ý tưởng có thể được áp dụng cho các vấn đề về golf nói chung ít nhất là cụ thể đối với Befunge (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.


Tôi không chắc chắn nếu điều này nên được đổi thành Befunge nói chung, nhưng Befunge 93 ít lý tưởng hơn cho việc chơi golf hơn 98.
Justin

6
Chúng tôi đã có một chủ đề Befunge 93 gần đây , nhưng tôi nghĩ tốt hơn là nên khái quát hóa chủ đề này thay thế. Điều đó sẽ ổn chứ? (và có thể đánh dấu các mẹo nào phù hợp với phiên bản nào, giống như các mẹo của Python cho biết chúng có phải là Python 2 / Python 3 cụ thể hay không)
Sp3000

Câu trả lời:


9

Khi sử dụng vòng lặp nhiều dòng, hãy cố gắng sử dụng càng nhiều vòng càng tốt:

>1234....v
^        <

đấu với

>1234v
^....<

7

Cần bỏ một giá trị sau một điều kiện (ví dụ vì đường dẫn khác phụ thuộc vào giá trị, nhưng đường dẫn này không)? Thay vì sử dụng >$hoặc $<, hãy ủng hộ thực tế là bạn biết giá trị thật của biến và _thay vào đó sử dụng để thay đổi hướng và ngăn xếp pop.

Thí dụ

'* : v           >$ .. @          Prints number in binary followed by the original
                                  decimal number.
     > :2%\2/ :!#^_ \.

bị biến thành

'* : v           _  .. @          Since we know that the topmost value on the stack
                                  will be 0, we combine `>$` into `_`.
     > :2%\2/ :!#^_ \.

6

Đừng quên rằng 0luôn luôn trên ngăn xếp. Ví dụ, điều này có nghĩa là, với một ngăn xếp trống, gtương đương 00gptương đương với 000p.


5

Nếu bạn cần đẩy một số lớn hơn 15, hãy sử dụng 'để tìm nạp giá trị ASCII của ký tự tiếp theo:

'*

để đẩy 42 chứ không phải:

4a*2+

Hoặc, 67*cũng hoạt động
Doorknob

4
@Doorknob Có lẽ tôi nên chọn một số nguyên tố để hiểu rõ hơn, nhưng 42 là một con số tuyệt vời.
Justin

2
Lưu ý rằng mẹo này chỉ áp dụng cho Befunge-96 trở lên. Befunge-93 không hỗ trợ 'hướng dẫn.
James Holdiness

4

Thay vì sử dụng |, yêu cầu một dòng khác (thường có nhiều khoảng trắng thừa), hãy thử sử dụng j. Ví dụ:

01-`j@more code here

sẽ dừng lại nếu số trên cùng của ngăn xếp là âm và tiếp tục khác đi. Nếu bạn cần nhiều nhân vật, sử dụng n*jở đâu nlà số ký tự mà bạn cần khi giá trị truyền cho j0. Thí dụ:

01-`4*j01-*more code

mà sẽ phủ nhận một số âm.


Lưu ý rằng mẹo này chỉ áp dụng cho Befunge-96 trở lên. Befunge-93 không hỗ trợ jhướng dẫn.
James Holdiness

4

Trong Befunge-93, nếu điều đầu tiên bạn đẩy lên ngăn xếp là một chuỗi, bạn thường có thể thoát khỏi việc trích dẫn mở đầu. Ví dụ này:

"!iH",,,@

có thể được đơn giản hóa để này:

!iH",,,@

Hãy thử trực tuyến!

Điều đang xảy ra là trình thông dịch trước tiên cố gắng thực thi các ký tự trong chuỗi không trích dẫn. Việc !thực hiện không phải là vô hại , và iHkhông phải là hướng dẫn hợp lệ, vì vậy chúng bị bỏ qua (mặc dù trên một số triển khai bạn có thể nhận được cảnh báo).

Khi "gặp phải, đó được coi là bắt đầu của chuỗi, nhưng vì không có trích dẫn kết thúc, nó bao bọc tất cả các cách xung quanh sân chơi cho đến khi "gặp phải lần thứ hai. Những gì kết thúc được đẩy lên ngăn xếp là thế này:

,,,@  ···72 spaces···  !iH

Vì chúng tôi chỉ quan tâm đến một vài nhân vật cuối cùng, mặc dù vậy, không có vấn đề nào khác. Vì vậy, sau khi trích dẫn, cuối cùng chúng tôi cũng có thể thực hiện ba ,lệnh, viết ra thông báo và @lệnh thoát ra.

Lưu ý rằng điều này thường không hoạt động trong Befunge-98, vì một hướng dẫn không được nhận dạng sẽ khiến trình thông dịch phản ánh thay vì bỏ qua nó.


Thay vào đó, trong Befunge-98, bạn có thể đặt chuỗi yêu cầu ở cuối dòng, như vậy; ",,,@!iH. Lưu ý rằng Pyfunge thêm một không gian bổ sung, trong khi FBBI thì không.
Jo King

@JoKing Tôi không muốn đề xuất rằng, vì, như bạn đã chỉ ra, hành vi này khác với người phiên dịch tiếp theo. Và ngay cả khi nó có vẻ hoạt động, nó không nhất quán (lưu ý thêm không gian trong FBBI trong trường hợp này ), do đó, rất có thể đó là một lỗi có thể cuối cùng đã được sửa.
James Holdiness

Hmm ... Tôi nghĩ rằng không gian thực sự có thể là một phần của đặc điểm kỹ thuật. Tôi nhớ đọc ở đâu đó rằng nhiều không gian sẽ bị bỏ qua và được tính là một không gian duy nhất. Ví dụ trong cả PyFunge và FBBI. FBBI dường như đệm từng dòng theo chiều dài của dòng dài nhất trong khi PyFunge thêm vào các khoảng trắng thừa.
Jo King

Bạn nói đúng - thông số kỹ thuật nói rằng nhiều khoảng trắng trong một chuỗi nên được coi là một khoảng trắng. Trong thực tế, quy tắc đó được đề xuất cụ thể để giải quyết vấn đề quấn dây trong một sân chơi vô hạn (vì vậy PyFunge rõ ràng là AFAIC chính xác). Nhưng mô tả của thuật toán gói là hơi mở để giải thích, vì vậy tôi có thể hiểu tại sao một số triển khai có thể làm những việc khác nhau. Nhưng điểm mấu chốt là đây là một vấn đề khá phức tạp và tôi nghĩ nó sẽ được đề cập tốt hơn như là một mẹo riêng dành riêng cho Befunge-97/98.
James Holdiness

4

Trong Befunge-93, thường có thể thuận lợi khi làm phẳng một vòng lặp thành một dòng duy nhất, với phần vòng lặp của mã được thực thi theo cả hai hướng.

Ví dụ, hãy xem xét mã dưới đây, xuất ra chữ cái atám lần:

"a"9>1-:#v_@
    ^\,:\<

Điều này có thể làm phẳng được làm phẳng thành một dòng bằng cách xen kẽ chuỗi vòng lặp với hướng dẫn cầu ( #):

"a"9>1#\-#,:#:>#\_@

Hãy thử trực tuyến!

Nếu bạn chỉ nhìn vào các ký tự không phải khoảng trắng, bạn có thể có ấn tượng rằng nó dài hơn bản gốc. Nhưng một khi bạn tính đến nguồn cấp dữ liệu và phần đệm bổ sung cần thiết trong phiên bản hai dòng, bạn thực sự sẽ tiết kiệm được bốn byte.

Trong trường hợp cụ thể này, mã được nén hơn nữa bằng cách lưu ý rằng chuỗi đó :#:có thể được thay thế đơn giản bằng :.

"a"9>1#\-#,:>#\_@

Hãy thử trực tuyến!

Trong thực tế, bất cứ khi nào bạn có cùng một lệnh được lặp lại ở hai bên của một #lệnh, bạn có thể đơn giản hóa nó thành chỉ một lệnh, vì vậy đây là điều bạn nên luôn luôn chú ý khi làm phẳng một vòng lặp.

Để hiểu cách thức hoạt động của nó, nó có thể giúp viết ra chuỗi vòng lặp hai lần, một lần với tất cả các ký tự theo sau #bị loại bỏ (nghĩa là những gì xảy ra khi thực hiện từ trái sang phải) và một lần với các ký tự trước khi #xóa (nghĩa là thực hiện từ phải sang trái ).

"a"9>1#\-#,:>#\_@
    >1  -  :>  _      ; executing left to right
    >  \  ,:  \_      ; executing right to left

Bây giờ bạn có thể thấy rõ làm thế nào điều này khớp với phiên bản hai dòng gốc của mã.


3

Đầu ra bằng mã thoát, trong đó đây là một hình thức đầu ra được phép. Nếu thử thách yêu cầu bạn in một số, bạn có thể lưu một byte bằng cách kết thúc chương trình qthay vì.@


2
Lưu ý rằng mẹo này chỉ áp dụng cho Befunge-98 trở lên. Trong các phiên bản trước của Befunge, qhướng dẫn có chức năng khác (chế độ hàng đợi) hoặc không được hỗ trợ.
James Holdiness

3

Trong Befunge-93, lệnh nhập ký tự ( ~) thường có thể được sử dụng làm lối tắt cho -1, vì đó là giá trị mà nó trả về trên EOF.

Ví dụ, mã dưới đây sẽ xuất -1:

~.@

Hãy thử trực tuyến!

Điều này không được khuyến nghị trong mã sản xuất, vì khi chạy trong môi trường tương tác, chương trình sẽ tạm dừng và chờ người dùng nhập liệu. Và rõ ràng nếu người dùng nhập dữ liệu nào đó, kết quả sẽ không còn là -1.

Điều đó nói rằng, quy tắc trên PPCG là một chương trình có thể giả sử một luồng đầu vào trống và đó là cách nó thường được chạy trên TIO .

Cũng lưu ý rằng bạn không nhất thiết bị cấm sử dụng thủ thuật này chỉ vì chương trình của bạn cần đọc thứ gì đó từ luồng đầu vào. Bạn chỉ cần đảm bảo rằng bạn xử lý đầu vào của mình trước, sau đó tất cả các lần sử dụng trong tương lai ~sẽ trả về -1.


2

Sử dụng hướng của IP khi xử lý _hoặc |, thay vì sử dụng một ký tự phụ cho !.

Ví dụ thực tế (từ bài đăng này ):

#v~
,>:!#@_

Có thể đổi thành

#v~
:<,_@#

2

Đừng quên rằng 0kkhông thực hiện hướng dẫn tiếp theo. Điều này có nghĩa là thay vì làm:

;some boolean test;!jv;code if false;
       ;code if true;<

Bạn có thể lưu một nhân vật bằng cách làm

;some boolean test;kv;code if false;
      ;code if true;<

Lưu ý rằng mẹo này chỉ áp dụng cho Befunge-98 trở lên. Các phiên bản trước của Befunge không hỗ trợ khướng dẫn.
James Holdiness

1

Đừng quên kđiều hành. Thay vì "!dlroW olleH",,,,,,,,,,,,@, làm "!dlroW olleH"bk,@. Lưu ý rằng khiện các hoạt động trên các tế bào rằng đó là tại9k,sẽ in không 9 lần nhưng 10; 9 lần với k, và một lần với ,.


1
Lưu ý rằng mẹo này chỉ áp dụng cho Befunge-98 trở lên. Các phiên bản trước của Befunge không hỗ trợ khướng dẫn.
James Holdiness

1

Khi đẩy các số nhỏ lên ngăn xếp, bạn có thể dễ dàng tìm ra đủ dễ dàng để 45*có được bạn 20, và 67*sẽ có được bạn 42. Tuy nhiên, khi nói đến số lượng lớn hơn, bạn thực sự cần một chương trình có thể tính toán đại diện hiệu quả nhất cho bạn.

Tùy chọn dễ nhất cho việc này là giao diện trực tuyến của Mike Schworer cho BefunRep . Bạn chỉ cần nhập một số và nó sẽ tạo ra một đại diện Befunge tương đương. Nó không phải lúc nào cũng tối ưu nhất, nhưng nó đủ gần và gần như chắc chắn sẽ tốt hơn bất cứ thứ gì bạn có thể nghĩ ra bằng tay.

Hệ thống trực tuyến được giới hạn ở các số trong phạm vi 0 đến 16777215, vì vậy nếu bạn cần bất cứ thứ gì lớn hơn thế, bạn sẽ muốn tải xuống tiện ích BefunRep độc lập và tự mình chạy các phép tính.

Nếu bạn đang lập trình trong Befunge-98, một lựa chọn khác cần xem xét là Fungify . Nói chung, nó không tối ưu như BefunRep, nhưng đối với một số số thấp hơn, trong đó các chữ số hex và ký tự trích dẫn đơn có hiệu quả nhất, đôi khi nó có thể mang lại kết quả tốt hơn.


Khi đẩy số lượng nhỏ trong Befunge 98, bạn sẽ sử dụng '. Ví dụ 42:'*
Justin

@Justin Tôi đã đề cập rằng trong đoạn cuối, nhưng toàn bộ vấn đề của mẹo này là bạn không cần biết nhiều thủ thuật để tạo số nếu bạn chỉ sử dụng một công cụ để làm điều đó cho bạn.
James Holdiness
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.