Tìm bên trong của một vòng lặp


14

Bài tập

Cho sơ đồ ASCII của một vòng lặp

ví dụ

....................
......@@@@@.........
......@...@.........
.....@@...@@@@@.....
....@@........@.....
....@........@@.....
....@@@@@@@@@@......
....................
....................

Và một vị trí trên vòng lặp

ví dụ

(7,1)

Bạn phải tìm bên trong và bên ngoài vòng lặp

ví dụ

00000000000000000000
00000011111000000000
00000011111000000000
00000111111111100000
00001111111111100000
00001111111111100000
00001111111111000000
00000000000000000000
00000000000000000000

Thông số kỹ thuật

  • Bạn có thể lấy đầu vào cho sơ đồ dưới dạng một chuỗi được phân tách bằng dòng mới hoặc tương đương rõ ràng

  • Bạn sẽ nhận được tọa độ trên vòng lặp (0 hoặc 1 được lập chỉ mục) như là một phần của đầu vào của bạn. Bạn có thể đặt nguồn gốc của bạn tại bất cứ nơi nào bạn muốn. Bạn có thể thực hiện việc này phối hợp (<row>, <column>), (<column>, <row>)hoặc là vị trí tuyến tính trên chuỗi. Bạn có thể nhận được những dữ liệu này trong bất kỳ phương pháp hợp lý. Tất cả các ký tự trên vòng lặp sẽ giống với ký tự tại chỉ mục đó.

  • Đầu ra ưa thích là một mảng 2 chiều của các giá trị trung thực và giả, tuy nhiên các chuỗi 1và được 0phân tách bằng các dòng mới hoặc bất kỳ tương đương rõ ràng nào của hai giá trị sau được chấp nhận. Bên trong và bên ngoài phải có các giá trị thật khác nhau nhưng không quan trọng cái nào là cái nào.

  • Một vòng lặp được định nghĩa là một nhóm các ký tự sao cho chúng đều là cùng một ký tự ( ví dụ@ ) và do đó mọi ký tự trong vòng lặp đều có đường dẫn đến ký tự gốc (Ký tự ở tọa độ đầu vào) chỉ đi qua cùng một ký tự ký tự (hình học Taxicab Không có đường chéo ).

  • Bên trong là tất cả các vòng lặp và các vị trí không thể chạm tới cạnh của sơ đồ mà không vượt qua vòng lặp.

  • Bên ngoài là mọi nơi khác

  • Đây là

Các trường hợp thử nghiệm

Dán


Chúng ta cũng có thể lấy tọa độ là tọa độ tuyến tính trong chuỗi?
flawr

@flawr Bạn có thể.
Đăng Rock Garf Hunter

Chúng ta có được phép lấy sơ đồ làm ma trận các ký tự không, sth. như [['.', '.'],['.', '@']]thay vì một chuỗi với dòng mới?
hbaderts

@hbaderts Đó là một tương đương rõ ràng
Post Rock Garf Hunter

1
@WheatWizard Cảm ơn trường hợp thử nghiệm bổ sung! Tuy nhiên, tôi khuyên bạn nên đặt chúng vào một đoạn trích hoặc trong một ý chính / pastebin, để làm cho thử thách được giải mã hơn một chút =)
flawr

Câu trả lời:


6

MATLAB, 163 159 146 78 byte

function m=f(m,y,x);[~,i]=bwfill(m~=m(y,x),x,y,8);m=m*0;m(i)=1;m=bwfill(m,'h')

Cảm ơn @ rahnema1 cho -66 byte !!!

Bây giờ nó hoạt động trên Thử trực tuyến! NHƯNG một vài điều chỉnh là cần thiết, vì MATLAB và Octave không hoàn toàn tương thích.

Giải trình

Đầu tiên chúng ta tạo một hình ảnh nhị phân chỉ che dấu tất cả các ký tự bằng với ký tự ban đầu. Sau đó, chúng tôi xác định thành phần được kết nối mà nhân vật ban đầu là.

% determine the connected component that is contains initial character

[~,i]=bwfill(m~=m(y,x),x,y,8);     % i contains the indices of the connected component
m=m*0;m(i)=1;                      % create an image of the connected component

Sau đó, chúng tôi tạo một hình ảnh của thành phần được kết nối đó và áp dụng điền vào tất cả các "lỗ hổng" trong hình ảnh.

m=bwfill(m,'h')

Tôi nghĩ rằng để chơi golf Octave tốt hơn nên bạn có thể giảm nó xuống ít nhất 72 byte
rahnema1

@ rahnema1 Tôi đã bắt đầu trong MATLAB, vì vậy tôi sẽ không thay đổi bài đăng này ngay bây giờ, nhưng cảm ơn vì lời đề nghị =)
flawr

5

MATLAB: 67 byte

function A=f(A,r,c),A=bwlabel(A==A(r,c),4);A=imfill(A==A(r,c),'h');

Một vài cảnh báo:

  • A được coi là một mảng ký tự.
  • Các chỉ số trong MATLAB dựa trên 1, với các hàng được lập chỉ mục đầu tiên. Giả định những thay đổi này sẽ được thực hiện cho đầu vào hàm (ví dụ: ví dụ câu hỏi sẽ được gọi là output = f(A,2,8)).
  • bwlabelimfilllà một phần của Hộp công cụ xử lý ảnh.

1
Chào mừng đến với codegolf!
rahnema1

@ rahnema1: Thật ngạc nhiên khi tôi không đến thăm sớm hơn, vì tôi đã chơi golf trên SO trước khi trang này ra đời.
gnovice
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.