TL; DR : Giải quyết thử thách đặc biệt này, mô phỏng robot, bằng cách bước lên tất cả các miếng đệm màu trắng và tránh các miếng đệm màu xám. Bạn có thể bước lên một miếng trắng bất kỳ số lần, miễn là bạn bước trên mỗi miếng trắng ít nhất một lần. Các giải pháp trong các ngôn ngữ như Befunge với con trỏ lệnh 2D cũng sẽ được chấp nhận, nhưng H đi kèm với chương trình uHerbert và thông số kỹ thuật ngôn ngữ của nó được đưa ra dưới đây. Bạn không cần chương trình uHerbert để giải quyết vấn đề này, nhưng nó giúp việc kiểm tra giải pháp của bạn dễ dàng hơn rất nhiều.
Đây là những gì mức độ trông như thế nào. Đây là một lưới các ô 25x25, trong đó robot và mỗi miếng trắng và xám chiếm một ô. Robot ban đầu hướng lên trên.
Bối cảnh trên uHerbert
Herbert là một mô phỏng robot mà tôi gặp lần đầu tiên trong thử thách lập trình IGF (Lễ hội trò chơi độc lập) trực tuyến vào năm 2008. Trong một thời gian dài, tôi đã thất vọng vì tôi không thể thử thách các thử thách sau khi cuộc thi thực sự kết thúc. May mắn thay, một người khác hẳn đã đọc được suy nghĩ của tôi và mã hóa chương trình nhỏ bé này: uHerbert (còn gọi là mu-Herbert hoặc micro-Herbert).
H (Thông số kỹ thuật ngôn ngữ)
Chương trình này là một mô phỏng robot, nhưng cũng đóng vai trò phiên dịch cho ngôn ngữ lập trình H chỉ phục vụ cho việc di chuyển robot.
Có ba hướng dẫn:
- S: robot bước một ô về phía trước
- L: robot quay trái 90 độ tại chỗ
- R: robot quay đúng 90 độ
Có ba tính năng lập trình tiêu chuẩn theo ý của bạn: hàm, tham số và đệ quy. Hai loại tham số khác nhau được hỗ trợ.
Thông số số
g(A):sslg(A-1)
Ở đây, g là một hàm có một tham số số. Đây là mã tấm nồi hơi; theo cách này, bạn có thể viết chương trình thực tế của mình bằng cách gọi hàm của bạn và truyền một đối số:
g(4)
Điều này sẽ gọi hàm của bạn 4 lần và đệ quy sẽ tự động chấm dứt khi tham số của bạn A
đạt giá trị bằng 0:
g(4) = sslg(4-1) = sslg(3) = sslsslg(2) = sslsslsslg(1) = sslsslsslssl
Các thông số chức năng
Bạn cũng có thể sử dụng các tham số chức năng, về cơ bản chỉ cần tái tạo các hướng dẫn mà bạn truyền vào:
f(A):rAlA
Vì vậy, nếu bạn gọi hàm này và chuyển các hướng dẫn, nó sẽ đánh giá:
f(ss) = rsslss
f(sslssr) = rsslssrlsslssr
Cú pháp khác
Các hàm có thể có nhiều hơn một tham số và chúng cũng có thể có cả hai loại. Họ có thể thay thế không có tham số. Sau đây là cả hai chức năng hợp lệ:
j:ssss
k(A,B):Ajjjk(A,B-1)
Như bạn có thể thấy, hàm j không có tham số và hàm k lấy cả hai loại tham số. A là một tham số chức năng và B là một tham số số, như được mô tả ở trên.
Đệ quy vô hạn
Đệ quy vô hạn cũng được cho phép, nhưng chỉ có thể được bắt đầu một lần và chấm dứt hiệu quả khi bạn bước lên miếng đệm trắng cuối cùng (mà không phải bước trên bất kỳ miếng đệm màu xám nào):
m:sslssrm
Giải quyết điều kiện
Mục đích là để robot bước lên tất cả các miếng đệm màu trắng, và tránh bước lên bất kỳ miếng đệm màu xám nào. Các miếng đệm trắng có thể được dẫm lên bất kỳ số lần nào, miễn là mỗi lần được dẫm lên ít nhất một lần. Robot có thể bước lên bất kỳ điểm nào trong lưới mà nó có thể chạm tới (một số cấp có tường chắn và ở cấp độ này, các miếng đệm màu xám đóng vai trò như một rào chắn).
Câu đố hiển thị trước đó có sẵn trên trang web ở trên từ level_pack2.zip và được gọi là level3.txt . Cả chương trình uHerbert và gói cấp độ vẫn có sẵn từ liên kết trên cho đến ngày hôm nay (trang web đã được lưu trữ nhưng công cụ lưu trữ vẫn lưu trữ nó), nhưng chúng không bắt buộc phải có giải pháp.
Tôi muốn xem giải pháp ngắn nhất có thể theo mã golf. Các giải pháp trong các ngôn ngữ khác H sẽ không được chấp nhận là hợp lệ. (Chắc chắn sẽ rất thú vị khi xem một giải pháp ví dụ bằng ngôn ngữ như Befunge nơi con trỏ lệnh di chuyển trên lưới 2D, nhưng mỗi lần đánh gôn bằng mã nguyên tử, chỉ có thể đưa ra các lệnh H cho điểm chính xác. Con trỏ lệnh có thể được coi là ví dụ như vị trí của robot.) Một giải pháp hợp lệ là một trong đó robot bước trên tất cả các miếng đệm trắng (mỗi miếng ít nhất một lần) và không giẫm lên bất kỳ miếng đệm màu xám nào. Bước vào các phần khác của lưới là tốt nhưng trong câu đố đặc biệt này, bạn không thể làm điều đó mà không bước lên một tấm đệm màu xám. Vị trí bắt đầu của robot không thể thay đổi.
Tôi cũng cần lưu ý rằng các giải pháp nhảy đến một ô không liền kề sẽ không được chấp nhận. Điều này là không thể đối với robot trong mô phỏng và sẽ không đại diện cho một giải pháp hợp lệ. H không cho phép điều này. Vì vậy, một giải pháp hợp lệ phải là một trong những bước duy nhất. Đối với mỗi ô trong lưới, chỉ có bốn ô liền kề: các ô trực giao với nó (bên trên, bên dưới và bên trái và bên phải). Điều này tất nhiên sẽ không cho phép các bước chéo, nhưng bởi vì bạn chỉ có thể tăng theo 90 độ, nên các bước chéo thậm chí không thể.
Nếu robot được cung cấp một lệnh yêu cầu nó di chuyển vào một rào chắn hoặc bên ngoài lưới, kết quả về cơ bản là "derp" - robot chạm vào tường và giữ nguyên vị trí, và con trỏ lệnh di chuyển đến hướng dẫn tiếp theo ( hướng dẫn về cơ bản là bỏ qua).
Lưu ý về kích thước giải pháp
Khi bạn mở cấp độ này trong chương trình, bạn sẽ nhận thấy rõ ràng có thể giải quyết bằng 13 byte. Tôi hoàn toàn bối rối về việc làm thế nào là có thể, và tò mò muốn xem những người khác có thể đến gần như thế nào. Giải pháp ngắn nhất của tôi là 30 byte bằng H. Nếu có ai muốn tôi đăng nó, tôi sẽ, nhưng tôi muốn xem các giải pháp khác trước khi đăng bài của tôi. Chương trình cũng cung cấp cho bạn một số điểm, nhưng điểm số không liên quan đến câu hỏi này. Giải pháp của bất kỳ điểm số sẽ được chấp nhận.
Có vẻ như chương trình uHerbert không tính dấu ngoặc đơn hoặc dấu hai chấm là một phần của chương trình của bạn (bạn sẽ thấy điều này khi nó đếm số byte của bạn). Vì vậy, đối với mục đích của câu hỏi này, trong ngôn ngữ H, dấu ngoặc đơn và dấu hai chấm sẽ không được tính là byte đối với giải pháp của bạn vì chúng chủ yếu là dấu phân cách và hoàn toàn là cú pháp chứ không phải là ngữ nghĩa.