Расстояние Хэмминга между двумя строками одинаковой длины - это количество позиций, в которых соответствующие символы различны. Если строки не имеют одинаковую длину, расстояние Хэмминга не определяется.
Вызов
Напишите программу или функцию, которая находит наибольшее расстояние Хэмминга среди всех пар строк из списка строк, дополненных согласно требованиям, описанным ниже.
Персонажи будут изнутри a-zA-Z0-9
.
Строки не могут быть равными по длине, поэтому для каждого сравнения более короткая строка должна быть дополнена следующим образом:
- оберните строку с начала столько раз, сколько необходимо, чтобы соответствовать требуемой длине
- меняйте регистры букв каждый раз за нечетное время (1, 3, 5 и т. д.)
- оставить вещи
a-zA-Z
без изменений при упаковке
Например, допустим, вам нужно добавить 5-символьную строку, ab9Cd
чтобы она заканчивалась 18 символами. Вы бы в конечном итоге с:
ab9CdAB9cDab9CdAB9
^^^^^ ^^^
с ^
добавленными под 1 и 3 обертками, чтобы выделить изменения в регистре.
Ввод, вывод
Формат ввода / вывода гибкий. Можно предположить, что на входе есть как минимум две строки, и что все строки будут иметь хотя бы один символ.
Вывод является целым числом.
правила
Это код-гольф . Стандартные правила применяются.
Контрольные примеры
[ "a", "b" ] => 1
[ "a", "b", "c" ] => 1
[ "a", "a", "c" ] => 1
[ "abc", "abcd" ] => 1
[ "abc12D5", "abC34d3", "ABC14dabc23DAbC89d"] => 17
[ "a", "Aaa", "AaaA", "aAaAa", "aaaaaaaaaaaaaa", "AAaAA", "aAa" ] => 8
["AacaAc", "Aab"] => 2
Ссылочная реализация
Я проверил примеры с (совершенно не загнанным) R-кодом, который вы можете попробовать здесь, чтобы сравнить любые другие примеры, которые вы можете попробовать с вашим кодом.
["AacaAc", "Aab"] => 2
. Целенаправленный гольф на мой ответ Jelly провалил бы этот случай, но прошел бы все остальные.Ответы:
Желе , 20 байт
Не очень доволен этим. Должно быть пригодным для игры в гольф, возможно, даже до ~ 15 байт.
Попробуйте онлайн!
или проверить набор тестов!
объяснение
источник
LÞ
и все же получить тот же максимум в конце.ṁ/
в некоторых случаях вместо этого будет обрезаться самый длинный до длины самого короткого, что не является тем, что мы хотим .... Я думаю, тестовые примеры выбраны слишком хорошо (и это довольно неудачное совпадение) ...["AacaAc", "Aab"]
.Python 2 , 86 байт
Попробуйте онлайн!
Даны две строки,
s,t
,zip((s+s.swapcase())*len(t),t))
будет список кортежей длины ,len(t)
так какzip
Усекает кратчайшее итерацию. Еслиlen(s)<len(t)
, то это «дополняет»s
нужным регистром, и мы вычисляемsum
различные символы.Если
len(t)<=len(s)
, то результатsum
будет меньше или равен,sum
если мы оценивалиt,s
; так что это не влияет на результатmax
в этом случае.источник
y!=
вместо того,!=y
чтобы сохранить 1 байтJavaScript (Node.js) , 111 байт
Попробуйте онлайн!
источник
Желе , 19 байт
Попробуйте онлайн!
источник
Рубин ,
8982 байтаСоздает перекрестное произведение списка входных данных против себя перед вычислением расстояния Хэмминга каждой пары, используя метод дублирования, аналогичный ответу Часа Брауна . Тем не менее, Ruby не может объединять строки в цепочку или добавлять логические значения без дополнительных затрат, поэтому вместо этого возникает необходимость перебирать пару строк вручную.
-7 байт из ГБ.
Попробуйте онлайн!
источник
Java 10 ,
+748740667666616 байтЭто должен быть самый плотный и нечитаемый, но самый длинный гольф, который я когда-либо придумывал.
Вызовите метод
h(String[])
с явным массивом (без аргументов var): например,возвращается
1
.Вы можете попробовать это онлайн !
Развернулся и прокомментировал:
Я знаю, что лучшее решение может быть достигнуто, особенно в части сопряжения строк.
РЕДАКТИРОВАТЬ : сбрить 8 байтов, изменив размер массива int
hammingDistance()
на квадрат числа заданных строк. Это также исправляетArrayIndexOutOfBounds
бросок в одном из тестовых случаев.РЕДАКТИРОВАТЬ 2 : Сохранено 33 байта благодаря комментариям Кевина Круйссена : удалено объявление класса, сокращены имена до 1 символа, изменены операторы и т. Д.
РЕДАКТИРОВАТЬ 3 : Сохранить 1 байт и достичь оценки, утвержденной сатаной, изменив метод с помощью var-arg в массив.
РЕДАКТИРОВАТЬ 4 : Сохраните еще 50 байтов благодаря Кевину Круйссену , снова: обновите версию Java с 8 до 10, чтобы использовать
var
ключевое слово, удаленныйStringBuilder
экземпляр и т. Д.источник
hammingDistance
использованияd
или какой-либо другой неиспользуемой переменной. Большинство из вас&&
может быть&
и||
может быть|
.c^' '
может бытьc^32
.boolean w = false;
может бытьboolean w=0>1;
.i=0
в инициализации петли могут быть удалены и изменить ,,i,j
чтобы,i=0,j
.++j
могут быть удалены и++
могут быть добавлены в.charAt(j++)
..toString()
может быть+""
.for(j=i+1;j<l;++j)
может бытьfor(j=0;++j<l;)
. И т. Д. И т. Д.StringBuilder
могут бытьStringBuffer
(если вы переключитесь на Java 10, это может бытьvar b=new StringBuffer(l);
. Тогдаboolean
иchar
может бытьvar
. Если у вас нет Java 10 локально, он доступен на TIO ). Кроме того,for(;i<n;++i){for(char c:s.toCharArray())b.append(e(w,c));w=!w;}
может бытьfor(;i++<n;w=!w)for(char c:s.toCharArray())b.append(e(w,c));
. И я уверен, что вы можете удалитьStringBuffer
полностью и просто использоватьString
и+=
вместоappend
.05AB1E ,
3329 байтПопробуйте онлайн или проверьте все контрольные примеры .
Скорее всего, можно уменьшить число байтов вдвое, но это работает ..
Объяснение:
источник
Java 11, 387 байт
Попробуйте онлайн. (ПРИМЕЧАНИЕ. Поскольку Java 11 еще не включена в TIO,
String.repeat(int)
она была эмулирована сrepeat(String,int)
тем же счетчиком байтов.)Объяснение:
источник
R 173 байта
Попробуйте онлайн!
@ngm: Я старался изо всех сил сыграть в твой код ( конечно, с моими тяжелыми настройками), но, как ты хорошо знаешь, R не очень хорош в манипулировании строками: P
источник
outer
в себя получение всех комбинаций и выполнение модульной арифметики над точками кода вместоchartr
.