Einführung
Die Hausdorff-Distanz misst die Differenz zwischen zwei Teilmengen eines metrischen Raums. Intuitiv ist ein metrischer Raum nur ein Teil mit einer eingebauten Distanzfunktion. In dieser Herausforderung werden wir natürliche Zahlen mit der gewöhnlichen Distanz verwenden d(a, b) := abs(a - b)
. Der Hausdorff-Abstand zwischen zwei nicht leeren endlichen Mengen A
und B
ist gegeben durch
max(max(min(d(a, b) for b in B) for a in A),
max(min(d(a, b) for a in A) for b in B))
in Python-ähnlicher Notation. Die Hausdorff-Distanz kann berechnet werden, indem man das Element findet, A
für das die Distanz zum nächsten Element von B
maximal ist, und das Element, B
für das die Distanz zum nächsten Element von A
maximal ist, und dann das Maximum dieser Distanzen nimmt. Mit anderen Worten, wenn die Hausdorff-Distanz ist d
, dann ist jedes Element von A
innerhalb einer Distanz d
von einem Element von B
und umgekehrt.
Eingang
Ihre Eingabe ist eine einzelne Liste von ganzen Zahlen. Es enthält nur die Elemente 0,1,2,3
, die angeben, ob der angegebene Index der Liste weder A
noch B
, nur A
noch B
oder beide A
und enthält B
. Zum Beispiel [0,1,1,0,2,3]
bedeutet die Eingabe , dass A = {1,2,5}
und B = {4,5}
, wenn wir eine 0-basierte Indizierung verwenden (was keinen Unterschied macht, da unsere Metriken übersetzungsinvariant sind).
Ausgabe
Ihre Ausgabe ist die Hausdorff-Distanz zwischen A
und B
; im obigen Beispiel ist es 3
. Wenn einer der Sätze leer ist, ist die Entfernung nicht definiert, und Sie kehren zurück -1
.
Regeln
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Testfälle
[] -> -1
[0] -> -1
[0,1,0] -> -1
[2,0,0,2] -> -1
[0,1,2,3] -> 1
[0,3,3,0,0,0,0,3] -> 0
[1,0,0,1,0,0,1,3,1] -> 7
[1,0,0,0,0,3,0,0,0,0,2] -> 5
[0,1,1,3,1,3,2,1,1,3,0,3] -> 2
[2,2,2,1,2,0,3,1,3,1,0,3] -> 3
[1,3,0,2,0,2,2,1,0,3,2,1,1,2,2] -> 2
[1,0,1,1,2,0,1,2,3,1,0,0,0,1,2,0] -> 4
max(max(min(d(a, b) for b in B) for a in A))
dass es ausreichen sollte. Dies liegt daran, dassd(a,b)
der absolute Wert zurückgegeben wird und daher beide max-Funktionen jedes Mal dieselbe Zahl zurückgeben.A
sehr nahe an einem von istB
, aber es gibt Elemente vonB
sehr weit entferntA
(zum Beispiel, wennA
es eine Teilmenge von istB
). In diesem Fall ist die Kurzformel falsch.Antworten:
CJam,
5352463837 BytesÜbernimmt die Eingabe in STDIN als Array im CJam-Stil:
Hier ist eine Testumgebung, die alle Testfälle in dieses Format konvertiert und den Code darauf ausführt. Obwohl sich die Ergebnisse im Eingabefeld befinden, werden sie vom Code nicht verwendet (entfernen Sie sie, wenn Sie mir nicht vertrauen :)).
Erläuterung
Zuerst analysieren wir die Eingabe, um die beiden Mengen A und B zu erhalten:
Und jetzt finden wir die absoluten Unterschiede und wählen das Maximum der Minuten:
Beachten Sie, dass wir das leere Array, das sich aus der Initiale
0
am Ende des Stapels ergibt, die ganze Zeit beibehalten haben, aber leere Arrays nichts zur Ausgabe beitragen.quelle
CJam,
57 5652 BytesIch denke, das kann ein bisschen golfen werden, aber hier geht:
Die Eingabe erfolgt wie in einer CJam-Liste, z.
Wie es funktioniert :
Der Code ist in zwei Teile geteilt:
Analysieren der Eingabe in die Listen
A
undB
:Durchführen der erforderlichen Aktionen für die beiden Paare von
A
undB
:Probieren Sie es hier online aus
quelle
Lua, 235 Bytes
Auf keinen Fall ein Gewinner, aber zumindest eine lustige Herausforderung.
Die Eingabe funktioniert folgendermaßen:
... und hier ist ein Testskript:
... produziert ...
quelle
Pyth,
43403938 BytesMein Algorithmus arbeitet direkt mit der Eingabezeichenfolge und konvertiert diese Zahl nie. Es wird nur einmal maximal und niemals minimal berechnet.
Vielen Dank an @isaacg für das Speichern eines Bytes.
Probieren Sie es online aus: Pyth Compiler / Executor
Erklärungen:
Zuerst füge ich viele Nullen vor der Eingabe ein.
Dann definiere ich eine
y
Hilfsfunktiony([0, 1, 0, 0, 1, 1]) = False
, die angibt , ob die Indizes einer Liste (wie die Eingabe) in beiden Mengen A und BEg vorkommen , abery([0, 1, 0, 2]) = y([3]) = True
.Danach überprüfe ich zuerst, ob das Ergebnis ist
-1
.Nun zu den interessanten Sachen:
Beachten Sie, dass ich immer eine Nummer finden werde
T
, da ich bereits weiß, dass Indizes in beiden Mengen in der Liste J vorkommen. Die Anzahl ist maximallength(Q)
. Dies ist auch der Grund für das Einfügen der Nullen. Wenn mindestenslength(Q)
Nullen eingefügt sind,k-T
ist immer>= 0
, was für das Aufteilen der Liste notwendig ist. Warum füge ich also2^length(Q)
Nullen anstelle vonlength(Q)
Nullen ein? Im Testfall[]
brauche ich mindestens 1 Null, sonstyJ
wird ein Fehler zurückgegeben.quelle
><Cab
ist das gleiche wie:Cba
.Mathematica, 88 Bytes
quelle
m=MaxValue;Max[m[RegionDistance[#[[1]],s],s\[Element]#[[2]]]/.m[__]->-1&/@{#,Reverse@c}]&
was dann auf mehrdimensionale Objekte wie diese angewendet werden kann%@{Sphere[],Line[{{1,1,0},{3,3,3}}]}
Haskell,
145126124 BytesTestlauf:
s
filtert die natürlichen Zahlen nach einem Prädikatt
und der Eingabelistex
.#
berechnet den maximalen Abstand seiner Parameterd
unde
.%
fängt leere Mengen A oder B oder nimmt das letzte Maximum vond#e
unde#d
.f
ist die Hauptfunktion, die%
mit Set A und B aufruft .Edit: @Zgarb hat viele Bytes zum Speichern gefunden; @ ali0sha noch 2. Danke!
quelle
mod 2
scheint unnötig. Sie können auch von nicht definieren profitierena
undb
explizit.[]%_= -1
- aber Sie schlagen meinen Versuch Hände nach unten auf diese :)Perl,
5655+2 für hinzugefügt
-lp
.Die Eingabeliste sollte auf stdin ohne Leerzeichen angegeben werden, zB:
hausdorf.pl
:Um Leerzeichen zwischen den Elementen der Eingabeliste zu unterstützen, teilen Sie das Finale einfach
$q
durch 2, was 2 Striche kostetquelle
Python 2, 124
Das fühlt sich definitiv suboptimal an. Naja.
quelle
APL (49)
Testfälle:
Erläuterung:
⍳⍴⍵
: Ermittelt eine Liste mit Zahlen von 1 bis zur Länge der Eingabeliste↓2 2⊤⍵
: Für jeden Wert in der Eingabeliste das erste und das zweite Byte abrufen∆←(
...)/⊂⍳⍴⍵
: Wählen Sie für beide Bytelisten die entsprechenden Werte aus⍳⍴⍵
. Bewahren Sie diese in∆
.(⊂⍬)∊∆
...:¯1
: Wenn diese Liste die leere Liste enthält, kehren Sie zurück-1
. Andernfalls:|∘.-/∆
: Ermittelt den absoluten Unterschied zwischen jedem Wertepaar und liefert eine Matrix(+,⍉¨)
: Erhalte eine gedrehte und eine nicht gedrehte Kopie dieser Matrix{⌈/⌊/⍵}
: Ermitteln Sie für beide Matrizen das Maximum des Minimums der Zeilen⌈/
: dann holen Sie das Maximum davonquelle
,X
es aus dem Skalare zu unterscheidenX
.)Perl,
189176157BJetzt mit 500% mehr Zustand.
Lesbar:
Anwendungsbeispiel:
Eingang
perl golf.pl < input
quelle
Clojure, 167 Bytes
Es sollte einen kürzeren Weg geben ... Gibt es da?
quelle