Hintergrund
Wenn es um die verfügbaren Urinale geht, besagt die Badezimmeretikette, dass das nächste zu füllende Urinal das sein sollte, das die totalen Beschwerden minimiert. Die totale Unbehaglichkeitsgleichung wird durch den folgenden Satz von Gleichungen gegeben:
dist (x, y) = linearer Abstand zwischen der Person x und der Person y in Urinaleinheiten. Unbehagen (x) = Summe (1 / (dist (x, y) * dist (x, y))) für alle Personen y ohne Person x total_Discomfort = Summe (Unbehagen (x)) für alle x
Ein ausführlicheres Dokument, das sich mit einem ähnlichen (nicht exakt gleichen) Problem befasst, finden Sie hier: (Vielen Dank an @Lembik, der mich auf dieses erstaunliche Whitepaper aufmerksam gemacht hat!)
Input-Output
Bei Eingabe eines leeren und eines vollen Urinals geben Sie den resultierenden Satz Urinale mit der Hinzufügung einer Person aus. Wenn für eine Position ein Gleichstand besteht, sollten die Urinale von links nach rechts gefüllt werden. Die Ausgabe sollte dasselbe Format haben wie die Eingabe.
- Wenn ein Fall mit vollem Urinal vorliegt, geben Sie die Eingabe zurück.
- In der Eingabe ist immer mindestens ein Urinal definiert.
Testfälle
EINGANG -> AUSGANG 1000001 -> 1001001 101010101 -> 111010101 100 -> 101 00000 -> 10000 1111111 -> 1111111 0100 -> 0101 101000 -> 101001
Regeln
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes. Standard-Schlupflöcher sind verboten.
0100
und101000
in den Testfällen (einige Regex-basierte Ansätze arbeiten an den tatsächlichen Testfällen, aber nicht an denen, die noch behandelt werden sollten)Antworten:
Jelly ,
13-12BytesProbieren Sie es online! oder Überprüfen Sie alle Testfälle.
Erläuterung
quelle
MATL ,
191817 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle (leicht modifizierter Code).
Erläuterung
Es reicht aus, die Entfernung von jeder potenziellen neuen Position zu den bereits besetzten zu berechnen. Die verbleibenden Entfernungen hängen nicht von der möglichen neuen Position ab und bilden so einen konstanten Term, der ignoriert werden kann.
Nehmen wir
[1 0 0 0 0 0 1]
als Beispiel die Eingabe .quelle
JavaScript (ES6), 89 Byte
Ausgabe durch Ändern des Eingabearrays.
quelle
R
837667 BytesIch 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
Inf
unangenehmen Wert, sodass sie bei der Berechnung ausgeschlossen werden. Außerdem wird nur die direkte Indizierung verwendetreplace
, sodass sie kürzer, aber weniger elegant ist.Erläuterung
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 von1
s und0
s ist. Nehmen wir zum Zwecke der Erklärung an, wir geben ein1 0 0 0 0 0 1
.Wir ersetzen einen Wert für
x
einen 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
which
eine Funktion, um die Indizes eines logischen Vektors zurückzugeben, die sindTRUE
. Alle Zahlen in R sind, wenn sie zur Eingabe gezwungenlogical
werden,TRUE
ungleich Null undFALSE
null. Wenn Sie dies einfach tun,which(x)
wird ein Typfehler ausgegebenargument to 'which' is not logical
, ebensox
wie 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!!x
einen Vektor vonTRUE
undFALSE
Anzeige, welche Urinale belegt sind. (Alternative Byte-äquivalent Nötigungen zu logisch beinhalten die logischen Operatoren&
und|
und die builtinsT
undF
, zum BeispielF|x
oderT&x
und so weiter.!!x
Blicke mehr exclamatory so wir verwenden werden.)Dies ist gepaart mit
seq(x)
, wodurch die ganzzahlige Folge von1
zu der Länge vonx
, dh allen Urinalstellen (und damit allen möglichen Stellen, die zu berücksichtigen sind) zurückgegeben wird.Jetzt haben wir die Indizes unserer belegten Urinale:
1 7
und unserer leeren Urinale1 2 3 4 5 6 7
. Wir übergeben`-`
die Subtraktionsfunktion an dieouter
Funktion, 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:Wir erheben dies zur
-2
Macht. (Für diejenigen, die ein wenig verloren sind, wird im OP "Unbehagen" definiert als1 / (distance(x, y) * distance(x, y))
, was vereinfacht1/d(x,y)^2
, dhd(x,y)^-2
.)Nimm die Summe jeder Zeile in der Matrix.
Ermitteln Sie den Index des kleinsten Werts, dh des optimalen Urinals. Bei mehreren kleinsten Werten wird der erste (dh der ganz linke) zurückgegeben.
Und voilà, wir haben den Index des optimalen Urinals. Wir ersetzen den Wert bei diesem Index in
x
durch1
. Bei1111
as-Eingaben spielt es keine Rolle, welche wir ersetzen, wir haben immer noch eine gültige Ausgabe.Gibt die geänderte Eingabe zurück.
quelle
PHP, 135 Bytes
Ich bin mir sicher, dass es einen wesentlich schnelleren Weg gibt, aber ich habe einen verschwommenen Kopf und kann mir keinen vorstellen!
Alter Code
Der Code ohne Verkleinerung:
quelle
Python 3
223222165 BytesOkay, ich weiß, das ist nicht die schönste Antwort da draußen, und ich bin sicher, es kann einiges runtergespielt werden, aber ich habe nur rumgespielt und gesehen, was ich tun kann
Die Tipps zu Whitespace und Komparatoren finden Sie unter mbomb007. Außerdem habe ich festgestellt, dass mein Online-Zeichenzähler alle Tabs in Leerzeichen umgewandelt hat, sodass die Anzahl viel geringer ist als ursprünglich
Überarbeitete Leerzeichen anzeigen:
Original:
Dies setzt voraus, dass eine Zeichenfolge von 1 und 0 übergeben wird,
"10001"
und gibt eine Zeichenfolge zurück"10101"
Bearbeiten: Geändert
1/float((j-i)**2)
zufloat((j-i)**-2)
quelle
!='1'
kann sein<'1'
und=='1'
kann sein>'0'
. Bedenken Sie auch diesen TippPython 3,
574471347 BytesDaran werde ich wahrscheinlich noch weiter arbeiten, wenn man bedenkt, dass die andere Python-Lösung wie ein Fünftel von dieser ist: [.
Nun, das ist jetzt viel besser, da ich gelernt habe, dass Sie einzelne Leerzeichen verwenden können.
quelle
Python,
165163158147141140139 Bytesquelle
if"1"*len(p)==p:return p
, um ein Byte zu speichern