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, примушені до типу logical, є TRUEненульовими та FALSEнульовими. Просто це which(x)призведе до помилки типу argument to 'which' is not logical, як xі числовий вектор. Тому ми повинні примусити це до логічного. !є логічною функцією заперечення R, яка автоматично примушує до логічного. Застосовуючи його двічі, !!xвиходить вектор TRUEіFALSEіз зазначенням того, які пісуари зайняті. (Альтернативні байти-еквівалентні Приведення до логічного включати логічні оператори &і |і вбудовані команди Tі F, наприклад , F|xабо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сили. (Для тих, хто трохи загубився, в ОП «дискомфорт» визначається як 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