introduction
La distance de Hausdorff mesure la différence entre deux sous-ensembles d'un espace métrique. Intuitivement, un espace métrique n'est qu'un ensemble avec une fonction de distance intégrée; dans ce défi, nous utiliserons des nombres naturels avec la distance ordinaire d(a, b) := abs(a - b)
. La distance de Hausdorff entre deux ensembles finis non vides A
et B
est donnée par
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))
en notation de type Python. La distance de Hausdorff peut être calculée en trouvant l'élément A
dont la distance à l'élément le plus proche de B
est maximale, et l'élément B
dont la distance à l'élément le plus proche A
est maximale, puis en prenant le maximum de ces distances. En d'autres termes, si la distance de Hausdorff est d
, alors chaque élément de se A
trouve à distance d
d'un élément de B
, et vice versa.
Contribution
Votre entrée est une seule liste d'entiers. Il ne contient que les éléments 0,1,2,3
, ce qui signifie si l'index donné de la liste est un élément ni A
ni B
, seulement A
, seulement B
, ou les deux A
et B
. Par exemple, l'entrée [0,1,1,0,2,3]
signifie cela A = {1,2,5}
et B = {4,5}
, si nous utilisons une indexation basée sur 0 (ce qui ne fait aucune différence, car nos métriques sont invariantes par rapport à la traduction).
Production
Votre sortie est la distance de Hausdorff entre A
et B
; dans l'exemple ci-dessus, c'est le cas 3
. Si l'un des ensembles est vide, la distance n'est pas définie et vous reviendrez -1
.
Règles
Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites.
Cas de test
[] -> -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))
devrait être suffisant. En effet,d(a,b)
renvoie la valeur absolue, et donc les deux fonctions max renverront le même nombre à chaque fois.A
soit très proche de l'unB
, mais il y a des éléments deB
très loin deA
(par exemple, siA
est un sous-ensemble deB
). Dans ce cas, la formule courte est incorrecte.Réponses:
CJam,
5352463837 octetsPrend l'entrée sur STDIN en tant que tableau de style CJam:
Voici un harnais de test qui convertit tous les cas de test dans ce format et exécute le code sur eux. Bien que les résultats soient dans le champ de saisie, ils ne sont pas utilisés par le code (supprimez-les si vous ne me faites pas confiance :)).
Explication
Tout d'abord, nous analysons l'entrée pour obtenir les deux ensembles A et B:
Et maintenant, nous trouvons les différences absolues et sélectionnons le maximum des minutes:
Notez que nous avons toujours gardé le tableau vide résultant de l'initiale
0
au bas de la pile, mais les tableaux vides ne contribuent en rien à la sortie.la source
CJam,
57 5652 octetsJe pense que cela peut être un peu joué au golf, mais voici:
L'entrée va comme une liste de style CJam, par exemple.
Comment ça marche :
Le code est divisé en deux parties:
Analyser l'entrée dans les listes
A
etB
:Exécution des actions requises sur les deux paires de
A
etB
:Essayez-le en ligne ici
la source
Lua, 235 octets
Certainement pas un gagnant, mais au moins un défi amusant.
L'entrée fonctionne comme ceci:
... et voici un script de test:
... produit ...
la source
Pyth,
43403938 octetsMon algorithme opère directement sur la chaîne d'entrée et ne convertit jamais ces nombres. Il ne calcule qu'une fois un maximum et jamais un minimum.
Merci à @isaacg d'avoir enregistré un octet.
Essayez-le en ligne: Pyth Compiler / Executor
Explications:
Je vais d'abord insérer beaucoup de zéros devant l'entrée.
Ensuite, je définis une fonction d'aide
y
, qui indique si les indices d'une liste (comme celle d'entrée) apparaissent dans les deux ensembles A et BEgy([0, 1, 0, 0, 1, 1]) = False
, maisy([0, 1, 0, 2]) = y([3]) = True
.Ensuite, je vérifie d'abord si le résultat est
-1
.Passons maintenant aux choses intéressantes:
Remarquez que je trouverai toujours un nombre
T
, car je sais déjà que les indices apparaissent dans les deux ensembles de la liste J. Le nombre est maximallength(Q)
. C'est aussi la raison de l'insertion des zéros. S'il y a au moins deslength(Q)
zéros insérés,k-T
c'est toujours>= 0
, ce qui est nécessaire pour le découpage de la liste. Alors, pourquoi dois-je insérer des2^length(Q)
zéros au lieu delength(Q)
zéros? Dans le cas de test,[]
j'ai besoin d'au moins 1 zéro, sinonyJ
je retournerai une erreur.la source
><Cab
est le même que:Cba
.Mathematica, 88 octets
la source
m=MaxValue;Max[m[RegionDistance[#[[1]],s],s\[Element]#[[2]]]/.m[__]->-1&/@{#,Reverse@c}]&
ce qui peut ensuite être appliqué à des objets multidimensionnels tels que%@{Sphere[],Line[{{1,1,0},{3,3,3}}]}
Haskell,
145126124 octetsEssai:
s
filtre les nombres naturels en fonction d'un prédicatt
et de la liste d'entréex
.#
calcule la distance maximale de ses paramètresd
ete
.%
attrape les ensembles vides A ou B ou prend le maximum final ded#e
ete#d
.f
est la fonction principale qui appelle%
avec l'ensemble A et B.Edit: @Zgarb a trouvé beaucoup d'octets à enregistrer; @ ali0sha un autre 2. Merci!
la source
mod 2
semble inutile. Vous pouvez également bénéficier de ne pas définira
etb
explicitement.[]%_= -1
- mais vous avez battu ma tentative haut la main :)Perl,
5655Ajout de +2 pour
-lp
.La liste d'entrée doit être donnée sur stdin sans espaces, par exemple:
hausdorf.pl
:Pour prendre en charge les espaces entre les éléments de la liste d'entrée, il suffit de diviser la finale
$q
par 2 pour un coût de 2 coupsla source
Python 2, 124
Cela semble définitivement sous-optimal. Tant pis.
la source
APL (49)
Testcases:
Explication:
⍳⍴⍵
: obtenir une liste de nombres de 1 à la longueur de la liste d'entrée↓2 2⊤⍵
: pour chaque valeur de la liste d'entrée, obtenez le premier octet et le deuxième octet∆←(
...)/⊂⍳⍴⍵
: pour les deux listes d'octets, sélectionnez les valeurs correspondantes dans⍳⍴⍵
. Conservez-les dans∆
.(⊂⍬)∊∆
...:¯1
: si cette liste contient la liste vide, retournez-1
. Autrement:|∘.-/∆
: obtenir la différence absolue entre chaque paire de valeurs, donnant une matrice(+,⍉¨)
: obtenir une copie pivotée et non pivotée de cette matrice{⌈/⌊/⍵}
: pour les deux matrices, obtenez le maximum des minimums des lignes⌈/
: alors obtenez le maximum de çala source
,X
, pour la distinguer du scalaireX
.)Perl,
189176157BMaintenant avec 500% d'état en plus.
Lisible:
Exemple d'utilisation:
contribution
perl golf.pl < input
la source
Clojure, 167 octets
Il devrait y avoir un moyen plus court ... Y a-t-il?
la source