Вступление
Расстояние Хаусдорфа измеряет разницу между двумя подмножествами метрического пространства. Интуитивно понятно, что метрическое пространство - это просто некоторый набор со встроенной функцией расстояния; В этой задаче мы будем использовать натуральные числа с обычным расстоянием 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
max(max(min(d(a, b) for b in B) for a in A))
должно быть достаточно. Это потому, чтоd(a,b)
возвращает абсолютное значение, и, следовательно, обе функции max будут возвращать одно и то же число каждый раз.A
очень близок к одному изB
, но есть элементыB
очень далеки от негоA
(например, еслиA
есть подмножествоB
). В этом случае краткая формула неверна.Ответы:
CJam,
5352463837 байтПринимает ввод в STDIN в виде массива стиля CJam:
Вот набор тестов, который преобразует все тестовые примеры в этот формат и запускает на них код. Хотя результаты находятся в поле ввода, они не используются кодом (удалите их, если вы мне не доверяете :)).
объяснение
Сначала мы анализируем входные данные, чтобы получить два набора A и B:
И теперь мы находим абсолютные различия и выбираем максимум из минут:
Обратите внимание, что мы постоянно сохраняем пустой массив, полученный из начального значения,
0
в нижней части стека, но пустые массивы ничего не вносят в вывод.источник
CJam,
57 5652 байтаЯ думаю, что это может быть немного в гольфе, но здесь идет:
Ввод идет как список в стиле CJam, например.
Как это работает :
Код разбит на две части:
Разбор ввода в списки
A
иB
:Выполнение необходимых действий на двух парах
A
иB
:Попробуйте онлайн здесь
источник
Луа, 235 байт
Определенно не победитель, но, по крайней мере, веселый вызов.
Ввод работает так:
... и вот тестовый скрипт:
... производит ...
источник
Pyth,
43403938 байтМой алгоритм работает непосредственно с входной строкой и никогда не преобразует эти числа. Он рассчитывается только один раз максимум, а не минимум.
Спасибо @isaacg за сохранение одного байта.
Попробуйте онлайн: Pyth Compiler / Executor
Пояснения:
Сначала я вставлю много нулей перед входом.
Затем я определяю вспомогательную функцию
y
, которая сообщает, появляются ли индексы списка (например, входного) в обоих наборах A и BEgy([0, 1, 0, 0, 1, 1]) = False
, ноy([0, 1, 0, 2]) = y([3]) = True
.После этого я сначала проверяю, есть ли результат
-1
.Теперь к интересному:
Обратите внимание, что я всегда найду число
T
, так как я уже знаю, что индексы появляются в обоих наборах в списке J. Число максимальноеlength(Q)
. Это также причина для вставки нулей. Еслиlength(Q)
вставлены хотя бы нули,k-T
всегда есть>= 0
, что необходимо для нарезки списка. Так почему я вставляю2^length(Q)
нули вместоlength(Q)
нулей? В тестовом случае[]
мне нужно как минимум 1 ноль, иначеyJ
вернется ошибка.источник
><Cab
так же, как:Cba
.Mathematica, 88 байт
источник
m=MaxValue;Max[m[RegionDistance[#[[1]],s],s\[Element]#[[2]]]/.m[__]->-1&/@{#,Reverse@c}]&
который затем можно применить к многомерным объектам, таким образом%@{Sphere[],Line[{{1,1,0},{3,3,3}}]}
Haskell,
145126124 байтаТестовый забег:
s
фильтрует натуральные числа в соответствии с предикатомt
и списком вводаx
.#
рассчитывает максимальное расстояние его параметровd
иe
.%
ловит пустые множества A или B или принимает окончательный максимумd#e
иe#d
.f
является основной функцией, которая вызывает%
с множеством A и B.Редактировать: @Zgarb нашел много байтов для сохранения; @ ali0sha еще 2. Спасибо!
источник
mod 2
Кажется ненужным. Вы также можете извлечь выгоду из не определенияa
иb
явно.[]%_= -1
- но вы разбили мою попытку на этом :)Perl,
5655Добавлено +2 для
-lp
.Список ввода должен быть указан на stdin без пробелов, например:
hausdorf.pl
:Чтобы поддерживать пробелы между элементами входного списка, просто разделите финал
$q
на 2 для стоимости 2 ударовисточник
Питон 2, 124
Это определенно чувствует себя неоптимальным. Ну что ж.
источник
APL (49)
Testcases:
Объяснение:
⍳⍴⍵
: получить список чисел от 1 до длины списка ввода↓2 2⊤⍵
: для каждого значения в списке ввода получить первый и второй байт∆←(
...)/⊂⍳⍴⍵
: для обоих списков байтов выберите соответствующие значения из⍳⍴⍵
. Храните это в∆
.(⊂⍬)∊∆
...:¯1
: если этот список содержит пустой список, вернуть-1
. Иначе:|∘.-/∆
: получить абсолютную разницу между каждой парой значений, задав матрицу(+,⍉¨)
: получить повернутую и не повернутую копию этой матрицы{⌈/⌊/⍵}
: для обеих матриц получить максимум минимумов строк⌈/
: тогда получите максимум этогоисточник
,X
, чтобы отличить его от скаляраX
.)Perl,
189176157BТеперь с 500% больше государства.
Четкий:
Пример использования:
вход
perl golf.pl < input
источник
Clojure, 167 байтов
Должен быть более короткий путь ... Есть?
источник