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 Ay Bestá 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 Acuya distancia al elemento más cercano Bes máxima, y el elemento Bcuya distancia al elemento más cercano Aes 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 Aestá dentro de la distancia dde 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 Atampoco B, solo A, solo Bo ambos Ay 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 Ay 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.Aesté muy cerca de uno de ellosB, pero hay elementosBmuy alejados deA(por ejemplo, siAes 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
0en 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
AyB:Realizando las acciones requeridas en los dos pares de
AyB: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-Tsiempre 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 contrarioyJdevolverá un error.fuente
><Cabes 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:
sfiltra los números naturales según un predicadoty la lista de entradax.#calcula la distancia máxima de sus parámetrosdye.%captura conjuntos vacíos A o B o toma el máximo final ded#eye#d.fes 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 2parece innecesario. También puede beneficiarse de no definiraybexplí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
$qentre 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 < inputfuente
Clojure, 167 bytes
Debería haber un camino más corto ... ¿Hay?
fuente