R, 83 76 67 bytes
Me acabo de dar cuenta de que puedo guardar varios bytes sin molestarme en verificar si los urinarios candidatos están vacíos. Los urinarios no vacíos siempre devolverán un Infvalor de incomodidad, por lo que se excluyen en el curso del cálculo. Además, solo usa la indexación directa en lugar de hacerlo replace, por lo que es más corto pero menos elegante.
x=scan()
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
x
Explicación
x=scan()
Leemos el estado actual de stdin y lo llamamos x. Suponemos que la entrada es una secuencia de 1s y 0s separados por espacios o saltos de línea. A los fines de la explicación, digamos que ingresamos 1 0 0 0 0 0 1.
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
Reemplazamos un valor de xen un índice particular con 1. Todo lo que hay entre ellos [ ]es averiguar cuál es el mejor índice.
Como los urinarios existentes son inmutables, no necesitamos considerar las distancias entre ellos. Solo necesitamos considerar las distancias entre los urinarios ocupados y el posible nuevo. Entonces determinamos los índices de los urinarios ocupados. Usamos which, una función para devolver los índices de un vector lógico que son TRUE. Todos los números en R, cuando están obligados a escribir logical, son TRUEdistintos de cero y FALSEsi son cero. Simplemente hacerlo which(x)dará como resultado un error de tipo argument to 'which' is not logical, como xes un vector numérico. Por lo tanto, tenemos que obligarlo a lógico. !es la función de negación lógica de R, que coacciona automáticamente a lógica. Aplicando dos veces, !!xproduce un vector de TRUEyFALSEindicando qué urinarios están ocupados. (Coacciones alternativos byte equivalente a lógica implican los operadores lógicos &y |y las órdenes internas Ty F, por ejemplo, F|xo T&xy así sucesivamente. !!xApariencia más exclamatoria por lo que vamos a utilizar.)
which(!!x)
Esto se combina con seq(x), que devuelve la secuencia de enteros 1a la longitud de x, es decir, todas las ubicaciones de urinarios (y, por lo tanto, todas las ubicaciones posibles a considerar).
seq(x)
Ahora tenemos los índices de nuestros urinarios ocupados: 1 7y nuestros urinarios vacíos 1 2 3 4 5 6 7. Pasamos `-`, la función de resta, a la outerfunción para obtener la "resta externa", que es la siguiente matriz de distancias entre todos los urinarios y los urinarios ocupados:
[, 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),`-`)
Elevamos esto al -2poder th. (Para aquellos que están un poco perdidos, en el OP, "incomodidad" se define como 1 / (distance(x, y) * distance(x, y)), lo que se simplifica 1/d(x,y)^2, es decir d(x,y)^-2).
outer(seq(x),which(!!x),`-`)^-2
Tome la suma de cada fila en la matriz.
rowSums(outer(seq(x),which(!!x),`-`)^-2)
Obtenga el índice del valor más pequeño, es decir, el urinario óptimo. En el caso de múltiples valores más pequeños, se devuelve el primero (es decir, el más a la izquierda).
which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))
Y voilà, tenemos el índice del urinario óptimo. Reemplazamos el valor en este índice xcon 1. En el caso de 1111como entrada, no importa cuál reemplacemos, todavía tendremos una salida válida.
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
Devuelve la entrada modificada.
x