R 83 76 67 Bytes
Ich habe gerade festgestellt, dass ich mehrere Bytes einsparen kann, indem ich nicht nachprüfe, ob die Kandidatenurinale leer sind. Nicht leere Urinale liefern immer einen Infunangenehmen Wert, sodass sie bei der Berechnung ausgeschlossen werden. Außerdem wird nur die direkte Indizierung verwendet replace, sodass sie kürzer, aber weniger elegant ist.
x=scan()
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
x
Erläuterung
x=scan()
Wir lesen den aktuellen Stand von stdin und nennen ihn x. Wir gehen davon aus, dass die Eingabe eine durch Leerzeichen oder Zeilenumbrüche getrennte Folge von 1s und 0s ist. Nehmen wir zum Zwecke der Erklärung an, wir geben ein 1 0 0 0 0 0 1.
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
Wir ersetzen einen Wert für xeinen bestimmten Index durch 1. Alles, was dazwischen [ ]liegt, ermittelt den besten Index.
Da die vorhandenen Urinale unveränderlich sind, müssen wir die Abstände zwischen ihnen nicht berücksichtigen. Wir müssen nur die Abstände zwischen den besetzten und den möglichen neuen Urinalen berücksichtigen. Also bestimmen wir die Indizes der besetzten Urinale. Wir verwenden whicheine Funktion, um die Indizes eines logischen Vektors zurückzugeben, die sind TRUE. Alle Zahlen in R sind, wenn sie zur Eingabe gezwungen logicalwerden, TRUEungleich Null und FALSEnull. Wenn Sie dies einfach tun, which(x)wird ein Typfehler ausgegeben argument to 'which' is not logical, ebenso xwie ein numerischer Vektor. Wir müssen es daher auf logisch zwingen. !ist die logische Negationsfunktion von R, die automatisch zu logisch zwingt. Wenn Sie es zweimal anwenden, erhalten Sie !!xeinen Vektor von TRUEundFALSEAnzeige, welche Urinale belegt sind. (Alternative Byte-äquivalent Nötigungen zu logisch beinhalten die logischen Operatoren &und |und die builtins Tund F, zum Beispiel F|xoder T&xund so weiter. !!xBlicke mehr exclamatory so wir verwenden werden.)
which(!!x)
Dies ist gepaart mit seq(x), wodurch die ganzzahlige Folge von 1zu der Länge von x, dh allen Urinalstellen (und damit allen möglichen Stellen, die zu berücksichtigen sind) zurückgegeben wird.
seq(x)
Jetzt haben wir die Indizes unserer belegten Urinale: 1 7und unserer leeren Urinale 1 2 3 4 5 6 7. Wir übergeben `-`die Subtraktionsfunktion an die outerFunktion, um die "äußere Subtraktion" zu erhalten, bei der es sich um die folgende Matrix von Abständen zwischen allen Urinalen und den belegten Urinalen handelt:
[, 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),`-`)
Wir erheben dies zur -2Macht. (Für diejenigen, die ein wenig verloren sind, wird im OP "Unbehagen" definiert als 1 / (distance(x, y) * distance(x, y)), was vereinfacht 1/d(x,y)^2, dh d(x,y)^-2.)
outer(seq(x),which(!!x),`-`)^-2
Nimm die Summe jeder Zeile in der Matrix.
rowSums(outer(seq(x),which(!!x),`-`)^-2)
Ermitteln Sie den Index des kleinsten Werts, dh des optimalen Urinals. Bei mehreren kleinsten Werten wird der erste (dh der ganz linke) zurückgegeben.
which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))
Und voilà, wir haben den Index des optimalen Urinals. Wir ersetzen den Wert bei diesem Index in xdurch 1. Bei 1111as-Eingaben spielt es keine Rolle, welche wir ersetzen, wir haben immer noch eine gültige Ausgabe.
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
Gibt die geänderte Eingabe zurück.
x