R, 83 76 67 byte
Chỉ cần nhận ra rằng tôi có thể lưu một vài byte bằng cách không bận tâm kiểm tra xem các bồn tiểu của ứng viên có trống không. Bồn tiểu không trống sẽ luôn trả về Infgiá trị khó chịu, vì vậy chúng bị loại trừ trong quá trình tính toán. Ngoài ra, chỉ sử dụng lập chỉ mục trực tiếp chứ không phải replace, vì vậy nó ngắn hơn nhưng kém thanh lịch.
x=scan()
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
x
Giải trình
x=scan()
Chúng tôi đọc trạng thái hiện tại từ stdin và gọi nó x. Chúng tôi giả định rằng đầu vào là một chuỗi các 1s và 0s được phân tách bằng dấu cách hoặc dòng mới. Đối với mục đích giải thích, giả sử chúng ta nhập liệu 1 0 0 0 0 0 1.
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
Chúng tôi thay thế một giá trị xtại một chỉ mục cụ thể bằng 1. Mọi thứ giữa [ ]là tìm ra chỉ số tốt nhất là gì.
Vì các bồn tiểu hiện tại là bất biến, chúng ta không cần phải xem xét khoảng cách giữa chúng. Chúng ta chỉ cần xem xét khoảng cách giữa các bồn tiểu bị chiếm đóng và cái mới có thể. Vì vậy, chúng tôi xác định các chỉ số của bồn tiểu chiếm. Chúng tôi sử dụng which, một hàm để trả về các chỉ số của một vectơ logic TRUE. Tất cả các số trong R, khi bị ép buộc gõ logical, là TRUEnếu khác không và FALSEnếu không. Đơn giản chỉ cần làm which(x)sẽ dẫn đến một lỗi loại argument to 'which' is not logical, như xlà một vectơ số. Do đó chúng ta phải ép buộc nó hợp lý. !là hàm phủ định logic của R, tự động cưỡng chế logic. Áp dụng nó hai lần !!x, mang lại một vectơ TRUEvàFALSEchỉ ra những bồn tiểu nào bị chiếm đóng. (Alternative byte tương đương coercions để logic liên quan đến việc khai thác hợp lý &và |và các lệnh nội trú Tvà F, ví dụ F|xhay T&xvà vân vân. !!xVẻ thán nhiều hơn như vậy chúng tôi sẽ sử dụng.)
which(!!x)
Điều này được ghép nối với seq(x), trả về chuỗi số nguyên từ 1đến chiều dài x, tức là tất cả các vị trí tiết niệu (và do đó tất cả các vị trí có thể xem xét).
seq(x)
Bây giờ chúng ta có các chỉ số của các bồn tiểu bị chiếm đóng của chúng ta: 1 7và các bồn tiểu trống rỗng của chúng ta 1 2 3 4 5 6 7. Chúng ta chuyển `-`, hàm trừ, đến outerhàm để lấy "phép trừ bên ngoài", là ma trận khoảng cách sau đây giữa tất cả các bồn tiểu và bồn tiểu bị chiếm đóng:
[, 1] [, 2]
[1,] 0 -6
[2,] 1 -5
[3,] 2 -4
[4,] 3 -3
[5,] 4 -2
[6,] 5 -1
[7,] 6 0
outer(seq(x),which(!!x),`-`)
Chúng tôi nâng điều này lên -2sức mạnh thứ. (Đối với những người bị mất một chút, trong OP, "sự khó chịu" được định nghĩa là 1 / (distance(x, y) * distance(x, y)), đơn giản hóa 1/d(x,y)^2, nghĩa là d(x,y)^-2.)
outer(seq(x),which(!!x),`-`)^-2
Lấy tổng của mỗi hàng trong ma trận.
rowSums(outer(seq(x),which(!!x),`-`)^-2)
Lấy chỉ số của giá trị nhỏ nhất, tức là nước tiểu tối ưu. Trong trường hợp có nhiều giá trị nhỏ nhất, giá trị đầu tiên (tức là ngoài cùng bên trái) được trả về.
which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))
Và voilà, chúng tôi có chỉ số của nước tiểu tối ưu. Chúng tôi thay thế giá trị tại chỉ số này xbằng 1. Trong trường hợp 1111là đầu vào, chúng ta không thay thế cái nào, chúng ta vẫn có đầu ra hợp lệ.
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
Trả lại đầu vào sửa đổi.
x