Мини-гольф по понедельникам: серия коротких соревнований по коду , публикуемых (надеюсь!) Каждый понедельник.
(Извините, это немного поздно.)
Я уверен, что большинство из вас слышали о расстоянии Левенштейна , алгоритме для вычисления расстояния между двумя строками. Ну, эта задача о реализации аналогичного алгоритма моего собственного изобретения *, называемого расстоянием анаграммы . Основное отличие состоит в том, что порядок символов не имеет значения; вместо этого измеряются только символы, уникальные для одной или другой строки.
Вызов
Цель задачи - написать программу или функцию, которая принимает две строки и возвращает расстояние анаграммы между ними. Основной способ сделать это - использовать следующую логику:
- Конвертируйте обе строки в нижний регистр и (необязательно) сортируйте символы по алфавиту.
- Хотя строки содержат хотя бы один равный символ, удалите первый экземпляр этого символа из каждой строки.
- Добавьте длины оставшихся строк и верните / выведите результат.
пример
Если входы:
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-минутным поиском.
Ответы:
Pyth, 12 байт
Тестирование
Рассматриваемая операция эквивалентна суммирующему оператору вычитания Пита,
.-
применяемому в обоих направлениях. Вы могли бы назвать это bagwise xor, я полагаю.Решение:
.z
: получить ввод в виде списка из 2 строк.rR0
: преобразовать оба в нижний регистр..p
Формируют все перестановки, т.е. нормальные и обратные..-M
: Составьте карту.-
операции для каждого заказа.s
: Объединить результаты.l
: Печать длины.источник
JavaScript (ES7), 92 байта
Определяет анонимную функцию.
Чтобы проверить, запустите фрагмент ниже. Вы можете отредактировать код и нажать «Тест», чтобы сравнить его вывод с оригиналом. (Оставьте комментарий, если вы найдете улучшение!) Ввод, как
"Hello, world!", "Code golf!"
в поле ввода.Спасибо @ETHproductions за сохранение 6 байтов!
Подробнее о тестовом наборе
Как это работает
источник
.join("")+b
с.join``+b
без эффекта.CJam,
2319 байтовПопробуйте онлайн в интерпретаторе CJam .
Как это работает
источник
Руби, 62
Там должен быть лучший путь.
Редактировать: 57 символов благодаря iamnotmaynard, исследующему путь, которому я был слишком ленив.
источник
sub
может взять строки Не могли бы вы использоватьc.downcase
вместо/#{Regexp.escape c}/i
?Python,
9087818079 байтPython <3.5 версия, 80 байт
объяснение
Для каждого символа в a или b подсчитайте количество вхождений в каждой строке и добавьте (положительную) разницу.
Редактирование: Перечитайте правила, реализованы анонимные функции, улучшен ответ, избавившись от raw_input. Первый гольф, пожалуйста, будьте нежны!
Спасибо sp3000 за улучшение переопределения str.lower и за то, что я понял, что печатать не нужно. Также пробелы. Все еще учусь.
Используя python> = 3.5, существует более короткий способ определения наборов, поэтому байт можно сохранить в предыдущих версиях.
источник
Сетчатка,
4020 байт20 байтов сэкономлено благодаря Мартину Бюттнеру.
Поместите каждую строку в отдельный файл и замените
\n
ее буквальным переводом строки.источник
pb , 648 байт
Принимает ввод с символом табуляции, разделяющим две строки.
Этот был чокнутым. На самом деле реализация алгоритма не была трудной частью, это было относительно легко. Но мне пришлось сделать две вещи, которые трудно сделать в pb: нечувствительность к регистру и itoa. У меня была программа для преобразования в нижний регистр, просто лежащая без дела (сама длина 211 байт), и все остальное было прикреплено к концу, чтобы выполнить работу специально для этой задачи.
Вы можете посмотреть эту программу на YouTube! Есть пара вещей, которые вы должны иметь в виду, если вы делаете:
chr(-1)
сбой интерпретатора при работе в режиме наблюдения.Hello, world!
иCode golf.
. Это немного отличается от одного из примеров входных данных в задании; Я использовал его, потому что он был коротким, но изменил его так, чтобы правильный вывод был 10 вместо 9. Это просто для того, чтобы показать, что число печатается правильно, даже если оно состоит из нескольких цифр, что сложно в pb.chr(10)
не обрабатывается должным образом, делает их в значительной степени бесполезными здесь. Несмотря на все сказанное, я думаю, что это почти красиво смотреть. Это огромный беспорядок ужасного кода, интерпретирующего другой ужасный код, кусочки которого ломаются перед вашими глазами, и все же все работает достаточно, чтобы получить правильный ответ. Похоже, мусор печатается, но если вы внимательно посмотрите со знанием источника, вы сможете в любой момент разобраться, что он делает и почему. Я чувствую себя Сайфером, когда смотрю это видео:I... I don’t even see the code. All I see is blonde, brunette, red-head.
Без дальнейших церемоний, вот код без правил.
источник
C ++ 199 байт
Использует массив для хранения счетчика каждого символа в первой строке, минус счетчик во второй строке. Далее он находит сумму абсолютных значений элементов массива: это расстояние.
Golfed:
Ungolfed:
источник
PowerShell, 79 байт
Почти тот же код, что и мой ответ на Anagram Code Golf ... но ... Я получаю странное поведение, если просто отрываю
-eq0
от этого ответа, поэтому я вынужден был явно.ToLower()
и переписать внеparam
декларации. +Объяснение также (в основном) скопировано из этого ответа - берет два строковых ввода, делает их строчными, и повторно преобразует их как массивы символов.
diff
Функция (псевдонимCompare-Object
) принимает два массива и возвращает элементы, которые отличаются между ними. Мы используем это путем повторного приведения возврата в виде массива с()
, а затем проверки его длины.+ Например, я получал фиктивные результаты
param([char[]]$a,[char[]]$b)(diff $a $b).length
вall lowercase.
/ALL UPPERCASE!
test. Если бы я вручную выделил массивы (например, запустил(diff ('a','l','l'...
), все работало нормально, но не получалось каждый раз, когда при приведении приводилось совпадение заглавных и строчных букв. Все, что я могу прочитать в документации, гласит, чтоdiff
регистр не учитывается по умолчанию, так что ... пожав плечами ???источник
Баш,
6867 байтЯ думаю, что это работает. Обратите внимание на пробел во второй строке.
Контрольные примеры
источник
Perl,
5246 байтов + 3 переключателя (a, F, n) =5549 байтовПринимает ввод из STDIN с входными строками в их собственных строках, завершается EOF.
Переключатели:
Код:
источник
Утилиты Bash + GNU, 53
sed
преобразуется в нижний регистр и разбивает строку на строки дляsort
. Поскольку нам нужно сделать это дважды, я поместил это в функцию.comm3 -3
отфильтровывает соответствующие строки иwc -l
выдает число.Вход через
STDIN
; Поскольку две команды читаются последовательно, вы должны отправитьEOF
(Ctrl-D) дважды, между строками и в конце. Перезаписывает файл1
, если присутствует.источник
Matlab, 91 байт
Попробуйте онлайн .
Это работает следующим образом:
источник
Желе , 6 байт
Попробуйте онлайн!
источник
F #,
134126 байтовПояснение :
a
иb
отдельно.Сократите каждую группу с
-
оператором, который имеет следующий эффект:Суммируйте абсолютные значения значений из предыдущего шага.
источник
Scala ,
13481 байтСпасибо @ ASCII-только за их работу.
Попробуйте онлайн!
источник