Mã một câu đố mã trượt!


12

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 WH là 3 và một ô vuông Tvà một khoảng trống là Emộ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 Tdi 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.txthoặc chỉ flà tốt

  • Hai 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ó


Vì vậy, chương trình cần phải hoạt động khi chỉ có không gian trống và không có khối gạch (và ngược lại)?
grc

@grc Có cho câu hỏi đầu tiên của bạn và hãy nhớ rằng nó vẫn cần phải nhắc về giá trị xô ngay cả khi hoàn toàn trống hoặc đầy. Không có khối không thể giống hệt nhau. Tôi đoán nếu họ là bạn có thể yêu cầu có một câu trả lời khá tầm thường. Vì vậy, tôi sẽ đề cập đến điều đó.
Sở thích của Calvin

Tôi có thể chỉ định tên của tệp nguồn gốc không?
frageum

@feersum Thích bạn có thể cho rằng nó luôn luôn f.txt? Đúng.
Sở thích của Calvin

Không phải codeblocks luôn luôn là 1 dòng sao? Các codeblocks nhiều dòng có vẻ thực sự phức tạp đối với tôi và các ngôn ngữ 2D có lẽ không hỗ trợ cho việc ghi tệp.
Def

Câu trả lời:


5

TECO , 153

Khối trống:

0T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Khối ngói:

1T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Chương trình, tự sửa đổi tại chỗ, phải được lưu trong một tệp có tên x. Nó có thể được chạy thông qua lệnh tecoc mung x.. Dấu chấm là quan trọng; không có nó, TECO đã cố gắng tìm một tệp có tên x.tec. Các dòng mới phải được trình bày.

Hạn chế ASCII có thể in được là một chút khó khăn cho điều này, vì ngôn ngữ sử dụng nhiều ký tự không thể in được. Hầu hết trong số chúng có thể được thay thế bằng chuỗi hai byte bắt đầu bằng dấu mũ, nhưng "Escape" (ASCII 27) là một ký tự "không thể giải thích được", vì vậy để có được nó, tôi phải đặt giá trị ASCII của nó vào một chuỗi và thực hiện nó Do đó, 4 byte EBx<Esc>phát nổ thành @^Ux#EBx#27@:^UX##Mx.

Điều này có thể được giảm đáng kể, đặc biệt là bằng cách chia chương trình thành hai phần, lưu trữ chúng dưới dạng chuỗi và chỉ chạy nếu cả hai đều có mặt.

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.