Câu đố trượt dễ nhận biết nhất là mười lăm câu đố . Nó có một lưới 4 x 4, 15 gạch và một không gian lưới trống. Các gạch chỉ có thể di chuyển vào không gian trống và phải luôn luôn phù hợp với lưới.
Chúng ta hãy định nghĩa một câu đố trượt tổng quát là W rộng hai chiều bằng lưới cao H ( W , H cả hai số nguyên dương) có chứa một số số gạch không được đánh dấu giống hệt nhau (giữa 0 và W × H của chúng) được gắn vào lưới, được sắp xếp trong lưới bất kỳ cách nào (không chồng chéo), với không gian lưới trống lấp đầy phần còn lại của khu vực.
Ví dụ: nếu W và H là 3 và một ô vuông T
và một khoảng trống là E
một trong nhiều cách sắp xếp câu đố có thể là
TTT
TET
EET
Đối với những câu đố này, có 4 động tác có thể xảy ra: đẩy mọi thứ lên , đẩy mọi thứ xuống , đẩy mọi thứ sang trái hoặc đẩy mọi thứ sang phải . 'Di chuyển' theo một số hướng làm cho tất cả các ô di chuyển theo hướng đó càng xa càng tốt cho đến khi chúng chạm vào một ô khác hoặc ranh giới lưới. Đôi khi xô sẽ không thay đổi bố cục của lưới,
Nếu lưới ví dụ bị xô phải, kết quả là
TTT
ETT
EET
Bị bỏ lại kết quả là
TTT
TTE
TEE
Bị đẩy xuống kết quả là
EET
TET
TTT
(lưu ý rằng cả hai bên trái T
di chuyển)
Đẩy lên không thay đổi bố trí lưới trong trường hợp này.
Lưu ý rằng vì các ô không thể phân biệt được nên các câu đố này không có trạng thái 'giải'. Cũng lưu ý rằng một câu đố có thể bắt đầu trong một bố cục không thể quay lại một khi đã tạo ra một xô (ví dụ: một ô ở giữa lưới 3 x 3).
Thử thách
Chỉ sử dụng ASCII có thể in, viết hai khối mã hình chữ nhật, cả hai ký tự M rộng và N ký tự cao (đối với mọi số nguyên dương M , N ). Một khối mã sẽ đại diện cho một ô của câu đố trượt, khối mã khác sẽ đại diện cho một không gian lưới trống.
Sắp xếp hai khối mã này vào lưới W by H sẽ tạo ra một câu đố trượt đại diện cho mã có thể được lưu dưới dạng tệp văn bản và chạy như một chương trình bình thường. Khi chạy, các loại chương trình này sẽ nhắc người dùng thông qua stdin cho một số từ 1 đến 4; 1 là cho lên, 2 xuống, 3 trái, 4 phải . Khi người dùng nhập số và lượt truy cập của họ, chương trình sẽ tính toán làm thế nào để chuyển các ô mã nguồn của nó theo hướng đó và lưu bố cục câu đố mới trong một tệp (một tệp mới hoặc trong cùng một tệp), sau đó chấm dứt.
Quá trình này có thể được lặp lại vô thời hạn với tệp mã câu đố trượt mới được tạo sau mỗi lần xô.
Thí dụ
Giả sử khối mã gạch của tôi trông như thế này
// my
// tile
và khối mã không gian lưới trống của tôi trông như thế này
//empty
//space
( M = 7, N = 2, đây tất nhiên không phải là mã thực tế)
Bất kỳ sự sắp xếp câu đố trượt hợp lệ nào của hai khối này sẽ tạo ra một chương trình bằng ngôn ngữ tôi đang sử dụng có thể được chạy để cho phép người dùng di chuyển theo một số hướng.
Biểu diễn mã của lưới ví dụ là:
// my// my// my
// tile// tile// tile
// my//empty// my
// tile//space// tile
//empty//empty// my
//space//space// tile
Vì vậy, chạy cái này và nhấn 2 (để xuống), sau đó Enter sẽ ghi cái này vào một tệp khác (hoặc cùng một tệp):
//empty//empty// my
//space//space// tile
// my//empty// my
// tile//space// tile
// my// my// my
// tile// tile// tile
Tập tin đó sau đó có thể được chạy và xô theo cùng một cách chính xác.
Ghi chú
Bất kỳ biểu diễn mã nào của câu đố trượt W by H đều có thể chạy được và có thể tự di chuyển đúng cách. Điều này bao gồm tất cả các kích thước lưới từ 1 đến 1 đến một số tối đa hợp lý (2 16 x 2 16 trở lên).
Một chương trình có thể đọc mã nguồn riêng của nó. Không có hạn chế dựa trên quine. Bình luận của bất kỳ loại cũng tốt.
Chương trình phải nhắc cho một hướng để di chuyển ngay cả khi không có gạch để xô hoặc không có gạch có thể bị xô. Lời nhắc chỉ đơn giản là một nơi để nhập số, không yêu cầu tin nhắn.
Bạn có thể cho rằng đầu vào luôn hợp lệ (1, 2, 3 hoặc 4).
Đệm khối mã của bạn với không gian là tốt. Hãy nhớ rằng chúng chỉ có thể được in ASCII, điều này có nghĩa là không có tab và không có dòng mới (bên cạnh các dòng mới giúp hình thành các khối mã).
Nếu ngôn ngữ của bạn không hỗ trợ stdin, hãy sử dụng bất kỳ phương thức nhập liệu nào có vẻ gần nhất.
Bạn có thể yêu cầu một dòng mới ở cuối tệp câu đố mã của bạn. (Hoặc yêu cầu nó không ở đó.)
Làm thế nào bạn đặt tên tập tin mới là không quan trọng.
f.txt
hoặc chỉf
là tốtHai khối mã có thể không giống nhau.
Chấm điểm
Mục tiêu là để làm điều này với kích thước mã nhỏ nhất (đó là lý do tại sao điều này được gắn thẻ mã golf). Bài nộp với diện tích khối mã nhỏ nhất ( M × N ) là người chiến thắng. Tie-breaker đi đến câu trả lời được bình chọn cao nhất.
Liên quan: Mã chạy trò chơi cuộc sống trên chính nó
f.txt
? Đúng.