Piet

Đề bài

Mô tả

Piet là một ngôn ngữ lập trình bí truyền (esoteric) nổi tiếng, trong đó chương trình được biểu diễn bằng các khối điểm ảnh (pixel) nhiều màu. Trong bài này ta dùng một tập luật đơn giản hóa của Piet.

Chương trình là một ảnh chữ nhật gồm các điểm ảnh có màu hoặc màu đen. Màu của mỗi điểm ảnh là một chữ số từ 0 đến 9, trong đó 0 là màu đen. Một khối là một hình chữ nhật gồm các điểm ảnh cùng màu (khác đen). Bảo đảm rằng mọi nhóm điểm ảnh cùng màu liên thông đều tạo thành khối chữ nhật. Các điểm ảnh đen có thể tạo thành hình dạng bất kỳ.

Con trỏ lệnh (IP) gồm ba thành phần:

  • Con trỏ khối (BP): khối màu hiện tại (không có khái niệm điểm ảnh hiện tại bên trong khối).
  • Con trỏ hướng (DP): chỉ về một trong bốn hướng trái, phải, lên, xuống.
  • Bộ chọn khối (CP): chỉ về bên trái hoặc bên phải so với hướng DP; theo giá trị tuyệt đối, CP lệch so với DP 90 độ ngược chiều kim đồng hồ (trái) hoặc thuận chiều kim đồng hồ (phải).

Ban đầu BP chỉ về khối chứa điểm ảnh góc trên bên trái, DP chỉ sang phải, CP chỉ sang trái.

Một bước biến đổi trạng thái IP như sau. Bộ thông dịch tìm cạnh xa nhất của khối hiện tại theo hướng DP. Trong các điểm ảnh tạo nên cạnh đó, chọn điểm ảnh xa nhất theo hướng CP. Sau đó BP thử di chuyển từ điểm ảnh này sang điểm ảnh kế tiếp theo hướng DP:

  • Nếu điểm ảnh kế tiếp thuộc một khối có màu, khối đó trở thành khối hiện tại, DP và CP giữ nguyên.
  • Nếu điểm ảnh kế tiếp là màu đen hoặc nằm ngoài chương trình, BP giữ nguyên nhưng DP và CP thay đổi: nếu CP đang chỉ sang trái thì đổi sang phải (DP giữ nguyên); nếu CP đang chỉ sang phải thì đổi sang trái và DP quay 90 độ thuận chiều kim đồng hồ.

Bảo đảm rằng BP không bao giờ chỉ về khối đen (điểm ảnh góc trên bên trái không phải màu đen).

Cho một chương trình Piet, hãy xác định màu của khối hiện tại sau n bước thông dịch.

Dữ liệu vào

  • Dòng đầu chứa hai số nguyên mn: số dòng của ảnh và số bước thông dịch.
  • m dòng tiếp theo mô tả các dòng của chương trình; tất cả có cùng độ dài, gồm các ký tự chữ số 09. Ký tự đầu tiên của dòng đầu tiên khác 0.

Dữ liệu ra

  • Màu (một chữ số) của khối hiện tại sau n bước.

Ràng buộc

  • 1m50
  • 1n5·107
  • Mỗi dòng có độ dài từ 1 đến 50 ký tự.

Ví dụ

Input Output Giải thích
2 10
12
43
1 Sau bước 1 khối 2 thành hiện tại và giữ vậy thêm hai bước. Sau bước 4 BP sang khối 3, sau bước 7 sang khối 4, và sau bước 10 BP quay lại khối 1.
3 12
1423
6624
6625
6 Sau 12 bước con trỏ dừng ở khối màu 6.
5 9
10345
23456
34567
45678
56789
5 Ô góc trên trái là khối 1; ô bên phải nó là khối màu đen 0, buộc DP/CP đổi ngay từ bước đầu.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 GO groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0