Marching Squares là một thuật toán từ đồ họa máy tính, được sử dụng để khôi phục các isocontours 2D từ một lưới các mẫu (xem thêm, người anh lớn của nó Marching Cubes cho cài đặt 3D). Ý tưởng là xử lý từng ô của lưới một cách độc lập và xác định các đường viền đi qua ô đó dựa trên các giá trị ở các góc của nó.
Bước đầu tiên trong quy trình này là xác định các cạnh được kết nối bằng các đường viền, dựa trên việc các góc nằm trên hay dưới giá trị của đường viền. Để đơn giản, chúng tôi sẽ chỉ xem xét các đường viền dọc theo giá trị 0
, sao cho chúng tôi quan tâm đến việc các góc là dương hay âm. Có những trường hợp để phân biệt:24 = 16
Nguồn hình ảnh: Wikipedia
Việc xác định màu trắng và màu đen không thực sự quan trọng ở đây, nhưng chắc chắn nói rằng màu trắng là dương và màu đen là âm tính. Chúng tôi sẽ bỏ qua các trường hợp một trong những góc là chính xác 0
.
Các điểm yên ngựa (trường hợp 5 và 10) cung cấp thêm một chút khó khăn: không rõ đường chéo nào nên được sử dụng chỉ bằng cách nhìn vào các góc. Điều này có thể được giải quyết bằng cách tìm trung bình của bốn góc (tức là xấp xỉ giá trị trung tâm) và chọn các đường chéo sao cho các đường viền tách trung tâm khỏi các góc với dấu ngược lại. Nếu trung bình là chính xác 0
, một trong hai trường hợp có thể được chọn.
Thông thường, 16 trường hợp này được lưu trữ đơn giản trong một bảng tra cứu. Điều này rất tốt cho hiệu quả, nhưng tất nhiên, chúng tôi muốn mã là ngắn hơn ở đây. Vì vậy, nhiệm vụ của bạn là thực hiện bước tra cứu này và in một đại diện ASCII của vụ án với càng ít mã càng tốt.
Các thách thức
Bạn được cung cấp các giá trị của bốn góc (số nguyên khác không) theo thứ tự cố định mà bạn chọn. Sau đó, bạn nên tạo bố cục chính xác của các đường viền, giải quyết chính xác các trường hợp điểm yên.
Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).
Đầu vào có thể được thực hiện trong bất kỳ định dạng chuỗi hoặc danh sách thuận tiện.
16 trường hợp sẽ được thể hiện trong nghệ thuật ASCII bằng một trong các khối 5x5 sau:
o---o o---o o---o
| | | | | | |
| | |---| | | |
| | | | | | |
o---o o---o o---o
o---o o---o o---o o---o
|/ | | \| | | | |
| | | | | | | |
| | | | |\ | | /|
o---o o---o o---o o---o
o---o o---o
|/ | | \|
| | | |
| /| |\ |
o---o o---o
Bạn không được in bất kỳ khoảng trắng hàng đầu hoặc dấu, nhưng bạn có thể in một dòng mới tùy chọn.
Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.
Các trường hợp thử nghiệm
Các trường hợp kiểm tra giả định rằng đầu vào được đưa ra theo thứ tự trên cùng bên trái , trên cùng bên phải , dưới cùng bên trái , dưới cùng bên phải . Các trường hợp thử nghiệm được trình bày trong 9 nhóm, một nhóm tương ứng với mỗi 9 đại diện được đưa ra ở trên (theo cùng một thứ tự, bắt đầu từ ô trống, kết thúc bằng hai điểm yên ngựa).
[1, 2, 1, 3]
[-9, -2, -2, -7]
[4, 5, -1, -2]
[-1, -2, 3, 4]
[7, -7, 7, -7]
[-5, 5, -5, 5]
[1, -6, -4, -1]
[-2, 3, 3, 4]
[-1, 6, -4, -1]
[2, -3, 3, 4]
[-1, -6, 4, -1]
[2, 3, -3, 4]
[-1, -6, -4, 1]
[2, 3, 3, -4]
[3, -8, -9, 2]
[-3, 8, 9, -2]
[8, -3, -2, 9]
[-8, 3, 2, -9]
Ngoài ra, các trường hợp kiểm tra sau đây có thể trả về một trong hai điểm yên ngựa (sự lựa chọn của bạn):
[1, -4, -2, 5]
[-1, 4, 2, -5]