Introdução
A distância de Hausdorff mede a diferença entre dois subconjuntos de um espaço métrico. Intuitivamente, um espaço métrico é apenas um conjunto com uma função de distância integrada; neste desafio, usaremos números naturais com a distância comum d(a, b) := abs(a - b)
. A distância de Hausdorff entre dois conjuntos finitos não vazios A
e B
é 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))
em notação semelhante a Python. A distância de Hausdorff pode ser calculada encontrando-se o elemento A
para o qual a distância até o elemento mais próximo B
é máxima e o elemento B
para o qual a distância até o elemento mais próximo A
é máxima e, em seguida, aproveitando o máximo dessas distâncias. Em outras palavras, se a distância de Hausdorff é d
, então todo elemento de A
está dentro da distância d
de algum elemento de B
e vice-versa.
Entrada
Sua entrada é uma lista única de números inteiros. Ele contém apenas os elementos 0,1,2,3
, o que significa se o índice especificado da lista é um elemento de nem A
nem B
, somente A
, apenas B
ou ambos A
e B
. Por exemplo, a entrada [0,1,1,0,2,3]
significa isso A = {1,2,5}
e B = {4,5}
, se usarmos a indexação baseada em 0 (o que não faz diferença, pois nossas métricas são invariantes à conversão).
Saída
Sua saída é a distância de Hausdorff entre A
e B
; no exemplo acima, é 3
. Se um dos conjuntos estiver vazio, a distância não será definida e você retornará -1
.
Regras
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Casos de teste
[] -> -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))
deveria ser suficiente. Isso ocorre porqued(a,b)
retorna o valor absoluto e, portanto, ambas as funções max retornam o mesmo número todas as vezes.A
esteja muito próximo de um deB
, mas há elementosB
muito distantesA
(por exemplo, seA
for um subconjunto deB
). Nesse caso, a fórmula curta está incorreta.Respostas:
CJam,
5352463837 bytesRecebe entrada em STDIN como uma matriz de estilo CJam:
Aqui está um equipamento de teste que converte todos os casos de teste nesse formato e executa o código neles. Embora os resultados estejam no campo de entrada, eles não são usados pelo código (remova-os se você não confiar em mim :)).
Explicação
Primeiro, analisamos a entrada para obter os dois conjuntos A e B:
E agora encontramos as diferenças absolutas e selecionamos o máximo de minutos:
Observe que mantivemos a matriz vazia resultante da inicial
0
na parte inferior da pilha o tempo todo, mas matrizes vazias não contribuem com nada para a saída.fonte
CJam,
57 5652 bytesEu acho que isso pode ser um pouco de golfe, mas aqui vai:
A entrada entra como uma lista com estilo CJam, por exemplo.
Como funciona :
O código é dividido em duas partes:
Analisando a entrada nas listas
A
eB
:Executando as ações necessárias nos dois pares de
A
eB
:Experimente online aqui
fonte
Lua, 235 bytes
Definitivamente não é um vencedor, mas pelo menos um desafio divertido.
A entrada funciona assim:
... e aqui está um script de teste:
... produz ...
fonte
Pitão,
43403938 bytesMeu algoritmo opera diretamente na string de entrada e nunca converte esse número. Ele calcula apenas uma vez no máximo e nunca no mínimo.
Agradecemos a @isaacg por salvar um byte.
Experimente online: Pyth Compiler / Executor
Explicações:
Primeiro, insiro muitos zeros na frente da entrada.
Em seguida, defino uma função auxiliar
y
, que informa se os índices de uma lista (como o de entrada) aparecem nos conjuntos A e BEgy([0, 1, 0, 0, 1, 1]) = False
, masy([0, 1, 0, 2]) = y([3]) = True
.Depois, primeiro verifico se o resultado é
-1
.Agora, o interessante:
Observe que sempre vou encontrar um número
T
, pois já sei que os índices aparecem nos dois conjuntos da lista J. O número é máximolength(Q)
. Esse também é o motivo para inserir os zeros. Se houver pelo menoslength(Q)
zeros inseridos,k-T
é sempre>= 0
, o que é necessário para o fatiamento da lista. Então, por que insiro2^length(Q)
zeros em vez delength(Q)
zeros? No caso de teste,[]
preciso de pelo menos 1 zero, caso contrárioyJ
, retornará um erro.fonte
><Cab
é o mesmo que:Cba
.Mathematica, 88 bytes
fonte
m=MaxValue;Max[m[RegionDistance[#[[1]],s],s\[Element]#[[2]]]/.m[__]->-1&/@{#,Reverse@c}]&
que pode ser aplicado a objetos multidimensionais como esse%@{Sphere[],Line[{{1,1,0},{3,3,3}}]}
Haskell,
145126124 bytesExecução de teste:
s
filtra os números naturais de acordo com um predicadot
e a lista de entradax
.#
calcula a distância máxima de seus parâmetrosd
ee
.%
pega conjuntos vazios A ou B ou pega o máximo final ded#e
ee#d
.f
é a principal função que chama%
com os conjuntos A e B.Edit: O @Zgarb encontrou muitos bytes para salvar; @ ali0sha outro 2. Obrigado!
fonte
mod 2
parece desnecessária. Você também pode se beneficiar por não definira
eb
explicitamente.[]%_= -1
- mas você bater minha tentativa mãos para baixo sobre este :)Perl,
5655Adicionado +2 para
-lp
.A lista de entrada deve ser fornecida no stdin sem espaços, por exemplo:
hausdorf.pl
:Para suportar espaços entre os elementos da lista de entrada, basta dividir a final
$q
por 2 por um custo de 2 pinceladasfonte
Python 2, 124
Definitivamente, isso parece subótimo. Ah bem.
fonte
APL (49)
Casos de teste:
Explicação:
⍳⍴⍵
: obtém uma lista de números de 1 ao comprimento da lista de entrada↓2 2⊤⍵
: para cada valor na lista de entrada, obtenha o primeiro byte e o segundo byte∆←(
...)/⊂⍳⍴⍵
: para as duas listas de bytes, selecione os valores correspondentes em⍳⍴⍵
. Guarde-os em∆
.(⊂⍬)∊∆
...:¯1
: se esta lista contiver a lista vazia, retorne-1
. De outra forma:|∘.-/∆
: obtenha a diferença absoluta entre cada par de valores, fornecendo uma matriz(+,⍉¨)
: obtenha uma cópia rotacionada e não rotacionada dessa matriz{⌈/⌊/⍵}
: para ambas as matrizes, obtenha o máximo dos mínimos das linhas⌈/
: então obtenha o máximo dissofonte
,X
, para distingui-lo de escalarX
.)Perl,
189176157BAgora com 500% mais estado.
Legível:
Exemplo de uso:
entrada
perl golf.pl < input
fonte
Clojure, 167 bytes
Deve haver uma maneira mais curta ... Existe?
fonte