Slime Khuôn mẫu có thể đếm!


10

Lý lịch

Slime khuôn là tuyệt vời. Nếu bạn đặt chúng trên một bề mặt có nguồn thức ăn, chúng sẽ trải gân để tìm thức ăn, sau đó chúng tạo thành một mạng lưới kết nối giữa các nguồn. Trong thử thách này, bạn sẽ mô phỏng một khuôn chất nhờn tìm kiếm thức ăn. Hơn nữa, khuôn đặc biệt này sẽ dừng lại khi nó tìm thấy đủ.

Đầu vào

Đầu vào của bạn sẽ là một danh sách Lcác tọa độ số nguyên 2D ở định dạng gốc của ngôn ngữ của bạn và một số nguyên không âm N. Danh sách Lđược đảm bảo không trùng lặp, nhưng nó có thể không được sắp xếp. Đầu vào Nlà từ 0 đến chiều dài L, bao gồm.

Danh sách Lđại diện cho một bộ tọa độ cho các nguồn thực phẩm. Ví dụ, danh sách

[(0,0),(2,-1),(3,1),(0,4),(5,5)]

có thể được giải thích trực quan như

     o
o


   o
o
  o

Đầu ra

Đầu ra của bạn là một danh sách Ktọa độ số nguyên 2D không trùng lặp khác trên cùng định dạng với đầu vào. Nó đại diện cho mạng được hình thành bởi khuôn chất nhờn và nó sẽ đáp ứng các điều kiện sau:

  • Các giao điểm LKcó kích thước chính xác N.
  • Tập hợp Kđược kết nối như một tập hợp con của lưới số nguyên (thông qua các điều chỉnh trực giao hoặc đường chéo).
  • Nếu bất kỳ tọa độ nào Kbị loại bỏ, nó không còn thỏa mãn hai điều kiện đầu tiên.

Lưu ý rằng nếu N = 0, đầu ra phải là một danh sách trống.

Một ví dụ về đầu ra chấp nhận được cho danh sách trên LN = 4sẽ là

[(0,0),(0,1),(0,2),(0,3),(0,4),(1,4),(2,4),(3,3),(3,2),(3,1),(3,5),(4,5),(5,5)]

có thể được hình dung như

   xxO
Oxx
x  x
x  x
x  O
O
  o

trong đó mỗi Ođại diện cho một tọa độ trong cả hai LK, và mỗi xđại diện cho một tọa độ trong Knhưng không phải trong L. Các đầu ra khác cũng được chấp nhận và "gân" không phải là ngắn nhất có thể. Ví dụ, đây cũng là một giải pháp chấp nhận được:

   xxOxx
Oxx     x
  x    x
 x    x
x  o x
O   x
  Ox 

Quy tắc

Cả đầu vào và đầu ra phải là danh sách, không phải là tập hợp hoặc các kiểu dữ liệu khác. Các tọa độ có thể là danh sách hoặc bộ dữ liệu. Bạn có thể thay đổi thứ tự của hai đầu vào nếu cần.

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.

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

Chương trình của bạn sẽ hoạt động trên các danh sách này cho tất cả các giá trị áp dụng của N.

[]
[(2,3)]
[(0,0),(1,0),(0,1),(1,1)]
[(0,0),(2,-1),(3,1),(0,4),(5,5)]
[(0,0),(1,0),(2,0),(3,0),(0,3),(1,3),(2,3),(3,3)]
[(0,0),(1,0),(2,0),(3,0),(0,3),(1,3),(2,3),(3,3),(0,1),(0,2),(3,1),(3,2),(8,1),(8,2),(-5,1),(-5,2)]
[(0,0),(20,0),(15,15),(-10,4),(-10,3),(0,-5),(7,6),(7,7),(8,8),(9,8),(10,-2),(-1,12),(-3,10)]
[(0,0),(1,0),(2,0),(3,0),(5,0),(6,0),(7,0),(0,9),(1,9),(2,9),(3,8),(4,9),(5,10),(6,10),(7,9),(3,3),(4,4),(5,5)]

Hình dung:

===
o
===
oo
oo
===
     o
o     


   o  
o     
  o   
===
oooo


oooo
===
     oooo     
o    o  o    o
o    o  o    o
     oooo     
===
                         o     


         o                     

       o                       

                  oo           
                 o             
                 o             

o                              
o                              


          o                   o

                    o          


          o                    
===
     oo 
ooo o  o
   o    


     o  
    o   
   o    


oooo ooo

Câu trả lời:


3

CJam, 77 95 byte

Tôi nghĩ rằng điều này có thể được chơi golf nhiều hơn một chút, nhưng ở đây đi:

q~$<_{{:X;]{[X\]z::-~mhW*}$~:Y{_)Y1{_@=X@=}:B~-g-{+__X=!\}:C~1B=!&}g{_(Y0B-g-\C0B=!&}g}*]_&}L?p

Đầu vào đi như thế nào N <Array of coordinate array>. Ví dụ:

4 [[0 0] [1 5] [2 1] [0 3] [5 0] [5 5]]

Đầu ra:

[[0 5] [1 5] [0 4] [0 3] [0 0] [0 2] [0 1] [1 1] [2 1]]

Thuật toán :

Thuật toán khá dễ dàng và đi như sau:

  • Sắp xếp mảng tọa độ đầu vào. Điều này làm cho các tọa độ được sắp xếp đầu tiên theo hàng và sau đó theo cột.
  • Bây giờ chúng tôi chọn đầu tiên N điểm
  • Bây giờ chúng tôi giảm trên những Nđiểm này . Điểm đến là điểm cuối cùng và nguồn là điểm đóng đến điểm cuối cùng đó.
  • Sau đó, chúng tôi bắt đầu với điểm trên cùng bên trái, đi bên phải (hoặc bên trái) cho đến khi nó ở trên hoặc ngay trên điểm tiếp theo.
  • Sau đó, chúng tôi đi xuống để đạt đến điểm tiếp theo.
  • Nó được đảm bảo rằng sẽ không có điểm chưa được phát hiện còn lại đến điểm trên trong cùng một hàng. Điều này đảm bảo rằng chúng tôi không chạm vào bất kỳ điểm nào khác mà người được chọn N. Chọn điểm đóng cũng đảm bảo rằng quy tắc thứ hai được giữ đúng.

Dùng thử trực tuyến tại đây

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.