La distancia de Hamming entre dos cadenas de igual longitud es el número de posiciones en las que los caracteres correspondientes son diferentes. Si las cadenas no tienen la misma longitud, la distancia de Hamming no está definida.
Desafío
Escriba un programa o función que encuentre la mayor distancia de Hamming entre todos los pares de cadenas de una lista de cadenas, rellenada según sea necesario de acuerdo con las reglas que se describen a continuación.
Los personajes serán de dentro a-zA-Z0-9
.
Las cadenas pueden no tener la misma longitud, por lo que para cada comparación, la cadena más corta debe rellenarse de la siguiente manera:
- envuelva la cadena desde el principio tantas veces como sea necesario para que coincida con la longitud requerida
- cambiar los casos de las letras cada vez que se envuelve (1er, 3er, 5to, etc.)
- dejar las cosas afuera
a-zA-Z
sin cambios al envolver
Por ejemplo, supongamos que necesita rellenar la cadena de 5 caracteres ab9Cd
para que termine con 18 caracteres. Terminarías con:
ab9CdAB9cDab9CdAB9
^^^^^ ^^^
con ^
agregado debajo de la 1ra y 3ra envolturas para resaltar los cambios de caso.
De entrada y salida
El formato de entrada / salida es flexible. Puede suponer que la entrada tiene al menos dos cadenas y que todas las cadenas tendrán al menos un carácter.
La salida es un entero.
Reglas
Este es el código de golf . Aplican reglas estándar.
Casos de prueba
[ "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
Implementación de referencia
Probé los ejemplos con un código R (completamente no protegido) que puedes probar aquí para comparar cualquier otro ejemplo que puedas probar con tu código.
["AacaAc", "Aab"] => 2
. Un golf intencionado para mi respuesta de Jelly hubiera fallado en ese caso, pero habría pasado todos los demás.Respuestas:
Jalea , 20 bytes
No muy contento con eso. Debería ser golfable, incluso a ~ 15 bytes tal vez.
Pruébalo en línea!
o echa un vistazo a una suite de prueba!
Explicación
fuente
LÞ
y seguir obteniendo el mismo máximo al final.ṁ/
cambio recortaría el más largo a la longitud del más corto en algunos casos, que no es lo que queremos ... Supongo que los casos de prueba están demasiado bien elegidos (y esta es una coincidencia bastante desafortunada) ...["AacaAc", "Aab"]
.Python 2 , 86 bytes
Pruébalo en línea!
Dadas dos secuencias,
s,t
,zip((s+s.swapcase())*len(t),t))
será una lista de tuplas de longitudlen(t)
desdezip
trunca a la más corta iterable. Silen(s)<len(t)
, entonces esto "se rellena"s
con el intercambio de mayúsculas y minúsculas y calculamos lossum
diferentes caracteres.Si
len(t)<=len(s)
, entonces el resultadosum
será menor o igual quesum
si estuviéramos evaluandot,s
; por lo que no tiene ningún efecto en el resultadomax
en ese caso.fuente
y!=
lugar de!=y
guardar 1 byteJavaScript (Node.js) , 111 bytes
Pruébalo en línea!
fuente
Jalea , 19 bytes
Pruébalo en línea!
fuente
Ruby ,
8982 bytesCrea el producto cruzado de la lista de entrada contra sí mismo antes de calcular la distancia de Hamming de cada par, utilizando un método de duplicación similar a la respuesta de Chas Brown . Sin embargo, Ruby no puede juntar cadenas o agregar booleanos sin sobrecarga adicional, por lo que se hace necesario iterar manualmente a través del par de cadenas.
-7 bytes de GB.
Pruébalo en línea!
fuente
Java 10 ,
748740667666616 bytesEste tiene que ser el más denso e ilegible, sin embargo, el golf más largo que se me ocurrió.
Método de llamada
h(String[])
con una matriz explícita (sin argumentos var): por ejemplo,vuelve
1
.¡Puedes probarlo en línea !
Ungolfed y comentó:
Yo sé que se puede lograr una mejor solución, especialmente para la parte de la cadena de sincronización.
EDITAR : afeite 8 bytes cambiando el tamaño de la matriz int
hammingDistance()
al cuadrado del número de cadenas dado. También repara unArrayIndexOutOfBounds
lanzamiento en uno de los casos de prueba.EDIT 2 : guardado 33 bytes gracias a los comentarios de Kevin Cruijssen : declaración de clase eliminada, nombres acortados a 1 carácter, operadores cambiados, etc.
EDITAR 3 : Ahorre 1 byte y alcance el puntaje aprobado por Satanás cambiando el método con var-arg a array.
EDIT 4 : Ahorre otros 50 bytes gracias a Kevin Cruijssen , nuevamente: actualice la versión de Java de 8 a 10 para usar la
var
palabra clave, laStringBuilder
instancia eliminada , etc.fuente
hammingDistance
usard
o alguna otra variable no utilizada. La mayor parte de tu&&
puede ser&
y||
puede ser|
.c^' '
puede serc^32
.boolean w = false;
puede serboolean w=0>1;
.i=0
en el bucle se puede eliminar la inicialización y cambiar,i,j
a,i=0,j
.++j
puede eliminarse y++
agregarse a.charAt(j++)
..toString()
puede ser+""
.for(j=i+1;j<l;++j)
puede serfor(j=0;++j<l;)
. Etc. etc.StringBuilder
puede serStringBuffer
(si cambia a Java 10 podría servar b=new StringBuffer(l);
. Elboolean
ychar
puede ser tambiénvar
. Si no tiene Java 10 localmente, está disponible en TIO ). Además,for(;i<n;++i){for(char c:s.toCharArray())b.append(e(w,c));w=!w;}
puede serfor(;i++<n;w=!w)for(char c:s.toCharArray())b.append(e(w,c));
. Y estoy bastante seguro de que puede eliminarlo porStringBuffer
completo y simplemente usarloString
y en+=
lugar de hacerloappend
.05AB1E ,
3329 bytesPruébelo en línea o verifique todos los casos de prueba .
Lo más probable es que se reduzca a la mitad en conteo de bytes, pero funciona.
Explicación:
fuente
Java 11, 387 bytes
Pruébalo en línea. (NOTA: dado que Java 11 aún no está en TIO,
String.repeat(int)
se ha emulado comorepeat(String,int)
para el mismo conteo de bytes).Explicación:
fuente
R , 173 bytes
Pruébalo en línea!
@ngm: Hice mi mejor esfuerzo para jugar golf con su código (con mis personalizaciones pesadas, por supuesto) pero, como bien sabe, R no es muy golfista manipulando cadenas: P
fuente
outer
obtener todas las combinaciones y hacer aritmética modular en los puntos de código en lugar dechartr
.