R,83 76 67字节
刚意识到我可以省去几个字节,而不必费心检查候选小便池是否为空。非空小便池将始终返回Inf不适值,因此在计算过程中将它们排除在外。另外,仅使用直接索引而不是replace,因此它更短但更不美观。
x=scan()
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
x
说明
x=scan()
我们从stdin读取当前状态,并将其称为x。我们假设输入是1s和0s 的序列,由空格或换行符分隔。出于解释的目的,假设我们输入1 0 0 0 0 0 1。
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
我们将x特定索引的值替换为1。介于两者之间的所有内容都在[ ]找出最佳索引。
由于现有的小便池是不可变的,因此我们无需考虑它们之间的距离。我们只需要考虑小便池和可能的小便池之间的距离。因此,我们确定了被占用的小便池的索引。我们使用which一个函数来返回逻辑向量的索引TRUE。R中的所有数字,如果强制为type logical,则均为TRUE非零和FALSE零。简单地这样做which(x)会导致类型错误argument to 'which' is not logical,就像x数值向量一样。因此,我们必须迫使它具有逻辑性。!是R的逻辑取反函数,该函数自动强制为逻辑。对其应用两次,!!x得出向量为TRUE和FALSE指示哪些小便池已被占用。(逻辑上的等效于字节的强制转换涉及逻辑运算符&和|以及内建的T和F,例如F|xor T&x等。!!x看起来更令人惊叹,因此我们将使用它。)
which(!!x)
与配对seq(x),将返回从1到的长度的整数序列x,即所有小便池位置(因此要考虑所有可能的位置)。
seq(x)
现在我们有了被占用的小便池1 7和空的小便池的索引1 2 3 4 5 6 7。我们将`-`减法函数传递给该outer函数以获取“外部减法”,即所有小便池和被占用的小便池之间的距离的以下矩阵:
[,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),`-`)
我们将其提升为-2力量。(对于在OP中有些迷路的人,“不适”定义为1 / (distance(x, y) * distance(x, y)),简化为1/d(x,y)^2,即d(x,y)^-2。)
outer(seq(x),which(!!x),`-`)^-2
取矩阵中每一行的总和。
rowSums(outer(seq(x),which(!!x),`-`)^-2)
获取最小值的索引,即最佳小便池。如果有多个最小值,则返回第一个(即最左边的)值。
which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))
而且,我们拥有最佳小便池的指标。我们在这个指数在替换值x用1。在1111作为输入的情况下,我们替换哪个都无所谓,我们仍然会有一个有效的输出。
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
返回修改后的输入。
x