Introducción
La distancia de Hausdorff mide la diferencia entre dos subconjuntos de un espacio métrico. Intuitivamente, un espacio métrico es solo un conjunto con una función de distancia incorporada; En este desafío, utilizaremos números naturales con la distancia ordinaria d(a, b) := abs(a - b)
. La distancia de Hausdorff entre dos conjuntos finitos no vacíos A
y B
está dada por
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 notación similar a Python. La distancia de Hausdorff se puede calcular encontrando el elemento A
cuya distancia al elemento más cercano B
es máxima, y el elemento B
cuya distancia al elemento más cercano A
es máxima, y luego tomando el máximo de estas distancias. En otras palabras, si la distancia de Hausdorff es d
, entonces cada elemento de A
está dentro de la distancia d
de algún elemento de B
, y viceversa.
Entrada
Su entrada es una lista única de enteros. Solo contiene los elementos 0,1,2,3
, que significan si el índice dado de la lista es un elemento de ni A
tampoco B
, solo A
, solo B
o ambos A
y B
. Por ejemplo, la entrada [0,1,1,0,2,3]
significa eso A = {1,2,5}
y B = {4,5}
, si usamos indexación basada en 0 (lo que no hace ninguna diferencia, ya que nuestras métricas son invariables en la traducción).
Salida
Su salida es la distancia de Hausdorff entre A
y B
; en el ejemplo anterior, lo es 3
. Si cualquiera de los conjuntos está vacío, la distancia no está definida y usted deberá regresar -1
.
Reglas
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
[] -> -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))
debería ser suficiente. Esto se debe a qued(a,b)
devuelve el valor absoluto y, por lo tanto, ambas funciones max devolverán el mismo número cada vez.A
esté muy cerca de uno de ellosB
, pero hay elementosB
muy alejados deA
(por ejemplo, siA
es un subconjunto deB
). En ese caso, la fórmula corta es incorrecta.Respuestas:
CJam,
5352463837 bytesToma entrada en STDIN como una matriz de estilo CJam:
Aquí hay un arnés de prueba que convierte todos los casos de prueba a este formato y ejecuta el código en ellos. Aunque los resultados están en el campo de entrada, el código no los utiliza (elimínelos si no confía en mí :)).
Explicación
Primero, analizamos la entrada para obtener los dos conjuntos A y B:
Y ahora encontramos las diferencias absolutas y seleccionamos el máximo de minutos:
Tenga en cuenta que hemos mantenido la matriz vacía resultante de la inicial
0
en la parte inferior de la pila todo el tiempo, pero las matrices vacías no contribuyen en nada a la salida.fuente
CJam,
57 5652 bytesCreo que esto se puede jugar un poco, pero aquí va:
La entrada entra como una lista de estilo CJam, por ejemplo.
Cómo funciona :
El código se divide en dos partes:
Analizando la entrada en las listas
A
yB
:Realizando las acciones requeridas en los dos pares de
A
yB
:Pruébalo en línea aquí
fuente
Lua, 235 bytes
Definitivamente no es un ganador, pero al menos es un desafío divertido.
La entrada funciona así:
... y aquí hay un script de prueba:
... produce ...
fuente
Pyth,
43403938 bytesMi algoritmo opera directamente en la cadena de entrada y nunca convierte estos números. Solo calcula una vez como máximo y nunca como mínimo.
Gracias a @isaacg por guardar un byte.
Pruébelo en línea: Pyth Compiler / Executor
Explicaciones:
Primero insertaré muchos ceros delante de la entrada.
Luego defino una función auxiliar
y
, que indica si los índices de una lista (como la entrada) aparecen en los conjuntos A y BEgy([0, 1, 0, 0, 1, 1]) = False
, peroy([0, 1, 0, 2]) = y([3]) = True
.Luego, primero verifico si el resultado es
-1
.Ahora a las cosas interesantes:
Tenga en cuenta que siempre encontraré un número
T
, ya que sé que los índices aparecen en ambos conjuntos en la lista J. El número es máximolength(Q)
. Esta es también la razón para insertar los ceros. Si hay al menoslength(Q)
ceros insertados,k-T
siempre es>= 0
, lo cual es necesario para el corte de la lista. Entonces, ¿por qué inserto2^length(Q)
ceros en lugar delength(Q)
ceros? En el caso de prueba[]
necesito al menos 1 cero, de lo contrarioyJ
devolverá un error.fuente
><Cab
es el mismo que:Cba
.Mathematica, 88 bytes
fuente
m=MaxValue;Max[m[RegionDistance[#[[1]],s],s\[Element]#[[2]]]/.m[__]->-1&/@{#,Reverse@c}]&
que luego se puede aplicar a objetos multidimensionales como tal%@{Sphere[],Line[{{1,1,0},{3,3,3}}]}
Haskell,
145126124 bytesPrueba de funcionamiento:
s
filtra los números naturales según un predicadot
y la lista de entradax
.#
calcula la distancia máxima de sus parámetrosd
ye
.%
captura conjuntos vacíos A o B o toma el máximo final ded#e
ye#d
.f
es la función principal que llama%
con el conjunto A y B.Editar: @Zgarb encontró muchos bytes para guardar; @ ali0sha otro 2. ¡Gracias!
fuente
mod 2
parece innecesario. También puede beneficiarse de no definira
yb
explícitamente.[]%_= -1
- pero superaste mi intento en esto :)Perl,
5655Se agregó +2 para
-lp
.La lista de entrada debe darse en stdin sin espacios, por ejemplo:
hausdorf.pl
:Para admitir espacios entre los elementos de la lista de entrada, simplemente divida el final
$q
entre 2 por un costo de 2 trazosfuente
Pitón 2, 124
Esto definitivamente se siente subóptimo. Oh bien.
fuente
APL (49)
Casos de prueba:
Explicación:
⍳⍴⍵
: obtener una lista de números del 1 a la longitud de la lista de entrada↓2 2⊤⍵
: para cada valor en la lista de entrada, obtenga el primer byte y el segundo byte∆←(
...)/⊂⍳⍴⍵
: para ambas listas de bytes, seleccione los valores correspondientes de⍳⍴⍵
. Guárdelos en∆
.(⊂⍬)∊∆
...:¯1
: si esta lista contiene la lista vacía, regrese-1
. De otra manera:|∘.-/∆
: obtiene la diferencia absoluta entre cada par de valores, dando una matriz(+,⍉¨)
: obtener una copia rotada y no rotada de esa matriz{⌈/⌊/⍵}
: para ambas matrices, obtenga el máximo de los mínimos de las filas⌈/
: luego obtenga el máximo de esofuente
,X
, para distinguirla del escalarX
.)Perl,
189176157BAhora con un 500% más de estado.
Legible:
Ejemplo de uso:
entrada
perl golf.pl < input
fuente
Clojure, 167 bytes
Debería haber un camino más corto ... ¿Hay?
fuente