Мини-гольф по понедельникам: серия коротких соревнований по коду , публикуемых (надеюсь!) Каждый понедельник.
(Извините, это немного поздно.)
Я уверен, что большинство из вас слышали о расстоянии Левенштейна , алгоритме для вычисления расстояния между двумя строками. Ну, эта задача о реализации аналогичного алгоритма моего собственного изобретения *, называемого расстоянием анаграммы . Основное отличие состоит в том, что порядок символов не имеет значения; вместо этого измеряются только символы, уникальные для одной или другой строки.
Вызов
Цель задачи - написать программу или функцию, которая принимает две строки и возвращает расстояние анаграммы между ними. Основной способ сделать это - использовать следующую логику:
- Конвертируйте обе строки в нижний регистр и (необязательно) сортируйте символы по алфавиту.
- Хотя строки содержат хотя бы один равный символ, удалите первый экземпляр этого символа из каждой строки.
- Добавьте длины оставшихся строк и верните / выведите результат.
пример
Если входы:
Hello, world!
Code golf!
Затем в нижнем регистре и сортировке они становятся: (по умолчанию сортировка JS; обратите внимание на начальные пробелы)
!,dehllloorw
!cdefgloo
Удаляя все символы в обеих строках, мы получаем:
,hllrw
cfg
Таким образом, расстояние анаграммы между исходными двумя строками = 6 + 3 = 9.
Детали
- Строки могут быть взяты в любом разумном формате.
- Строки будут состоять только из печатного ASCII.
- Сами строки не будут содержать никаких пробелов, кроме обычных. (Без вкладок, новых строк и т. Д.)
- Вам не нужно использовать этот точный алгоритм, если результаты совпадают.
Тест-кейсы
Вход 1:
Hello, world!
Code golf!
Выход 1:
9
Вход 2:
12345 This is some text.
.txet emos si sihT 54321
Выход 2:
0
Вход 3:
All unique characters here!
Bdfgjkmopvwxyz?
Выход 3:
42
Вход 4:
This is not exactly like Levenshtein distance,
but you'll notice it is quite similar.
Выход 4:
30
Вход 5:
all lowercase.
ALL UPPERCASE!
Выход 5:
8
счет
Это код-гольф , поэтому выигрывает самый короткий действительный код в байтах. Tiebreaker переходит к представлению, которое первым достигло конечного числа байтов. Победитель будет выбран в следующий понедельник, 12 октября. Удачи!
Изменить: Поздравляем победителя, @isaacg, используя Pyth (снова) для поразительных 12 байтов!
* Если этот алгоритм использовался в другом месте и / или получил другое имя, пожалуйста, дайте мне знать! Я не смог найти его с 20-минутным поиском.