Вступление
Расстояние Хаусдорфа измеряет разницу между двумя подмножествами метрического пространства. Интуитивно понятно, что метрическое пространство - это просто некоторый набор со встроенной функцией расстояния; В этой задаче мы будем использовать натуральные числа с обычным расстоянием d(a, b) := abs(a - b). Хаусдорфово расстояние между двумя непустыми конечными множествами Aи Bопределяется как
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))
в Python-подобных обозначениях. Расстояние Хаусдорфа можно вычислить, найдя элемент, Aдля которого расстояние до ближайшего элемента Bявляется максимальным, и элемент, Bдля которого расстояние до ближайшего элемента Aявляется максимальным, и затем взяв максимум этих расстояний. Другими словами, если расстояние Хаусдорфа равно d, то каждый элемент Aнаходится в пределах расстояния dнекоторого элемента B, и наоборот.
вход
Ваш ввод представляет собой единый список целых чисел. Он содержит только элементы 0,1,2,3, которые указывают, является ли данный индекс списка элементом ни, Aни B, только A, только B, или и то, Aи другое B. Например, ввод [0,1,1,0,2,3]означает, что A = {1,2,5}и B = {4,5}, если мы используем индексацию на основе 0 (что не имеет значения, поскольку наши метрики являются инвариантными для перевода).
Выход
Ваш вывод - расстояние Хаусдорфа между Aи B; в приведенном выше примере это так 3. Если любой набор пуст, то расстояние не определено, и вы должны вернуться -1.
правила
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Тестовые случаи
[] -> -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
Aочень близок к одному из B, но есть элементы Bочень далеки от него A(например, если Aесть подмножество B). В этом случае краткая формула неверна.
max(max(min(d(a, b) for b in B) for a in A))должно быть достаточно. Это потому, чтоd(a,b)возвращает абсолютное значение, и, следовательно, обе функции max будут возвращать одно и то же число каждый раз.