Nén chương trình Befunge


17

Befunge là ngôn ngữ lập trình bí truyền 2 chiều. Ý tưởng cơ bản là các lệnh (một ký tự) được đặt trên lưới 2 chiều. Dòng điều khiển đi ngang qua lưới, thực hiện các lệnh mà nó đi qua và thay đổi hướng khi chạm vào một mũi tên ( >^<v). Các lệnh được dựa trên ngăn xếp; thấy danh sách này . Xem thêm http://esolangs.org/wiki/Befunge .

Thông số kỹ thuật cho Befunge-98 có sẵn.

Vấn đề

Viết chương trình biến đổi chương trình Befunge thành biểu diễn nhỏ gọn hơn. Ví dụ, chương trình sau in 0:

>   0   v

>   @   .

^       <

Trong trường hợp này, nó có thể được nén mà không thay đổi hành vi của chương trình bằng cách xóa các hàng khoảng trắng, để cung cấp

>0v
>@.
^ <

Các phép biến đổi phức tạp hơn có thể xoay hoặc phản chiếu các chuỗi lệnh và loại bỏ các lệnh điều khiển luồng không cần thiết để thu gọn chương trình. Ví dụ, với chương trình này:

>12345v
      6
v....7<
.
.
.
@

bạn có thể nhét phần cuối của chương trình vào lỗ:

>12345v
>...@ 6
^....7<

Ví dụ đầu tiên, chương trình nhỏ gọn nhất có thể là

>0.@

Bạn có thể sử dụng bất kỳ biến đổi nào miễn là chương trình đầu ra cho kết quả tương tự.

Chương trình đầu vào

Các chương trình đầu vào là các chương trình Befunge-98 hợp lệ.

Bạn có thể cho rằng chương trình đầu vào là xác định. Đó là, nó không sử dụng các lệnh đọc trạng thái bên ngoài: các lệnh đầu vào của người dùng &~, bộ ngẫu nhiên hóa ?, và các lệnh mã tự sửa đổi pg.

Bạn có thể giả sử chương trình đầu vào chấm dứt.

Chấm điểm

Đây không phải là một mã golf, nhưng là một vấn đề để viết một chương trình thực hiện mã golf.

Đầu vào là một tập hợp các trường hợp thử nghiệm (các chương trình Befunge thỏa mãn các hạn chế đầu vào ở trên). Tổng số điểm là tổng số điểm cho các trường hợp kiểm tra.

Điểm cho mỗi trường hợp kiểm tra

Điểm số là diện tích vỏ lồi của các ô không trống trong chương trình đầu ra, trong đó mỗi ô được coi là một hình vuông có bốn góc là các điểm lưới trong mặt phẳng Cartesian. Ví dụ, một chương trình

>   v
 @  <

được điểm 9,5.

Nếu chương trình của bạn không kết thúc trong một khoảng thời gian và bộ nhớ hợp lý trên một đầu vào cụ thể, thì điểm số là của chương trình đầu vào. (Điều này là do bạn có thể thêm một trình bao bọc giới hạn thời gian, làm cho chương trình đầu vào không thay đổi nếu chương trình của bạn không kết thúc kịp thời.)

Nếu chương trình trường hợp thử nghiệm có kết quả khác (hoặc không kết thúc) sau khi xử lý với chương trình của bạn, điểm số là điểm của chương trình đầu vào cộng với hình phạt là 100 điểm.


8
Điều gì để ngăn việc chạy chương trình để hoàn thành và viết chương trình Befunge in cùng một đầu ra?
Keith Randall

5
Được "nhận" và "đặt" được phép? Nếu bạn cho phép "đặt" (mã tự sửa đổi), sẽ khó có thể làm bất cứ điều gì.
Keith Randall

2
Việc thực hiện bắt đầu từ đâu? Góc trên bên trái? Nếu vậy, bạn có thể giải thích đầu ra của ví dụ thứ 2? .có nghĩa là số nguyên đầu ra, nhưng nếu bạn bắt đầu từ trên cùng bên trái, thì không có số nguyên trong ngăn xếp để đầu ra.
elssar

1
@elssar có, .xuất ra một số nguyên. Nhưng ngoài ra, khi không có đủ tham số trên ngăn xếp, befunge giả vờ có đủ số lượng 0 ở đó. Vì vậy, ví dụ thứ hai sẽ xuất ra 000.
daniero

@KeithRandall: Viết chương trình mới có cùng đầu ra chỉ hoạt động đối với các chương trình có đầu ra ngắn. gpkhông được phép (xin lỗi, quên những thứ đó; đã chỉnh sửa).
Ốc cơ khí

Câu trả lời:


12

Tôi đã dành một chuyến đi máy bay dài mã hóa cái này lên. Tôi đã viết một trình biên dịch giả befunge chạy chương trình befunge, trích xuất các khối cơ bản và đặt chúng trong một biểu diễn nhỏ gọn.

Liên kết với chương trình .

Khi chạy trên chương trình 99 chai này:

92+9*                           :. v  <
>v"bottles of beer on the wall"+910<
,:
^_ $                             :.v
            >v"bottles of beer"+910<
            ,:
            ^_ $                     v
>v"Take one down, pass it around"+910<
,:
^_ $                           1-v
                                 :
        >v"bottles of beer"+910.:_          v
        ,:
        ^_ $                          ^
                    >v" no more beer..."+910<
                    ,:
                    ^_ $$ @

Nó tạo ra đầu ra sau:

92+9*:.019+"llaw eht no "v
v  _v# :"bottles of beer"<
>    ,:    v
^  _v#     <
    >$:.019+"reeb f"v
 v _  v#:"bottles o"<
 >     ,:  v
 ^ _  v#   <
      >$019+"dnuo"v
     v"pass it ar"<
     >" ,nwod eno"v
 v _    v#:"Take "<
 >       ,:v
 ^ _    v# <
        >$1-:v
 v _      v# <
 >         :.019+"reeb "v
  v_  v#   :"bottles of"<
  >        ,v
  ^_  v#   :<
      >    $019+"llaw"v
           v" on the "<
           >"reeb fo "v
^  _^#      :"bottles"<
          >019+"...r"v
v  _v#:" no more bee"<
>    ,:    v
^  _v#     <
    >$$@    

Nó thực sự không nhỏ gọn hơn nhiều so với nguồn, nhưng nó có thể sẽ làm tốt hơn trên các chương trình lớn hơn / sparser.

Chương trình được bố trí với một khu vực định tuyến ở bên trái và nội dung khối cơ bản ở bên phải. Một khối cơ bản thường được đặt trong một số hàng chẵn để lối vào và lối ra tiếp giáp với khu vực định tuyến. Ở cuối mỗi khối cơ bản, tiện ích #^_vvà các biến thể, được đặt từ phải sang trái, thực hiện nhánh có điều kiện và tuyến đường chảy vào các cột. Khi bắt đầu mỗi khối cơ bản, các cột này được định tuyến vào các hàng cho khối cơ bản đích.

Ngoài ra, nếu đầu ra ngắn, nó chỉ tạo ra đầu ra rõ ràng, như thế này:

"output">:#,_@

Tôi chưa làm gì để tối ưu hóa các khối cơ bản, chỉ là cách bố trí. Làm.

Vậy các bài kiểm tra ở đâu?


1
liên kết mã nguồn dường như là 500 ngay bây giờ. Máy chủ cấu hình sai?
John Dvorak

1
@JanDvorak: thực sự. Đã sửa.
Keith Randall

1

Sed, 5 ký tự

Vì vậy, ngay cả khi đây không phải là codegolf, đây là một giải pháp sẽ có tỷ lệ điểm mã hóa khá tốt, nhưng không nhất thiết phải là điểm cao.

/^$/d

Nó chỉ đơn giản là loại bỏ các dòng trống.


10
Mã của bạn không đúng! Bạn không thể đơn giản loại bỏ các dòng trống. Tôi không thể viết mã 2d trong bình luận. Nhưng hãy xem xét một trường hợp hướng đi xuống và một chuỗi không đổi được bắt đầu ( "). Mỗi dòng trống trong cách nên được coi là một nhân vật không gian. Nếu chúng tôi in ra chuỗi đó, mã bạn tạo không có khoảng trắng ở đầu ra!
saeedn

3
Nhìn vào mã trong ideone.com/BdcRcf Nó sẽ in b a. Nhưng sau khi bạn rút ngắn, nó sẽ in ba.
saeedn
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.