A distância de Hamming entre duas strings de igual comprimento é o número de posições nas quais os caracteres correspondentes são diferentes. Se as cordas não tiverem o mesmo comprimento, a distância de Hamming não será definida.
Desafio
Escreva um programa ou função que encontre a maior distância de Hamming dentre todos os pares de cadeias de uma lista de cadeias, preenchida conforme necessário, de acordo com as regras descritas abaixo.
Os personagens serão de dentro a-zA-Z0-9
.
As cadeias podem não ter o mesmo comprimento; portanto, para cada comparação, a cadeia mais curta deve ser preenchida da seguinte maneira:
- enrole a corda desde o início quantas vezes for necessário para corresponder ao comprimento necessário
- mude os casos das letras cada vez que invólucro estranho (1º, 3º, 5º, etc.)
- deixe as coisas do lado de fora
a-zA-Z
inalteradas ao embrulhar
Por exemplo, digamos que você precise preencher a sequência de 5 caracteres ab9Cd
para que ela termine com 18 caracteres. Você terminaria com:
ab9CdAB9cDab9CdAB9
^^^^^ ^^^
com ^
adicionado debaixo das 1ª e 3ª envoltórios de destaque às mudanças de caso.
Entrada / Saída
O formato de entrada / saída é flexível. Você pode assumir que a entrada possui pelo menos duas strings e que todas as strings terão pelo menos um caractere.
A saída é um número inteiro.
Regras
Isso é código-golfe . Aplicam-se regras padrão.
Casos de teste
[ "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
Implementação de referência
Testei os exemplos com o código R (completamente não destruído) que você pode tentar aqui para comparar outros exemplos que você pode experimentar com o seu código.
["AacaAc", "Aab"] => 2
. Um golfe intencional para a minha resposta Jelly teria falhado nesse caso, mas passaria por todos os outros.Respostas:
Gelatina , 20 bytes
Não estou realmente feliz com isso. Deve ser jogável, mesmo com ~ 15 bytes, talvez.
Experimente online!
ou Confira uma suíte de testes!
Explicação
fonte
LÞ
e ainda obter o mesmo máximo no final.ṁ/
em vez disso, apararia o maior com o comprimento do menor em alguns casos, o que não é o que queremos ... Acho que os casos de teste são muito bem escolhidos (e isso é um pouco infeliz coincidência) ...["AacaAc", "Aab"]
.Python 2 , 86 bytes
Experimente online!
Dadas duas cordas,
s,t
,zip((s+s.swapcase())*len(t),t))
será uma lista de tuplas de comprimentolen(t)
desdezip
trunca a menor iterable. Selen(s)<len(t)
, então, isso "s
ocorre " com a troca de maiúsculas e minúsculas desejada e calculamos ossum
caracteres diferentes.Se
len(t)<=len(s)
, então o resultadosum
será menor ou igual aosum
se estávamos avaliandot,s
; portanto, não tem efeito sobre o resultadomax
nesse caso.fonte
y!=
vez de!=y
salvar 1JavaScript (Node.js) , 111 bytes
Experimente online!
fonte
Geléia , 19 bytes
Experimente online!
fonte
Ruby ,
8982 bytesCria o produto cruzado da lista de entrada contra si próprio antes de calcular a distância de Hamming de cada par, usando um método de duplicação semelhante à resposta de Chas Brown . Porém, o Ruby não pode compactar as seqüências de caracteres ou adicionar booleanos sem sobrecarga adicional; portanto, torna-se necessário percorrer manualmente o par de cadeias de caracteres.
-7 bytes de GB.
Experimente online!
fonte
Java 10 ,
748740667666616 bytesEste deve ser o mais denso e ilegível, mas o golfe mais longo que já vi.
Chame o método
h(String[])
com uma matriz explícita (sem var argumentos): por exemplo,retorna
1
.Você pode experimentá-lo online !
Ungolfed e comentou:
Eu sei que uma solução melhor pode ser alcançada, especialmente para a parte de emparelhamento de cordas.
EDIT : reduza 8 bytes alterando o tamanho da matriz int
hammingDistance()
para o quadrado do número de strings fornecidas. Ele também corrige umArrayIndexOutOfBounds
lançamento em um dos casos de teste.EDIT 2 : Salvo 33 bytes graças aos comentários de Kevin Cruijssen : declaração de classe removida, nomes encurtados para 1 caractere, operadores alterados etc.
EDIT 3 : Economize 1 byte e alcance a pontuação aprovada por Satanás, alterando o método com var-arg para array.
EDIT 4 : Salve outros 50 bytes graças a Kevin Cruijssen , novamente: atualize a versão Java de 8 para 10 para usar
var
palavras-chave,StringBuilder
instância removida etc.fonte
hammingDistance
usard
ou alguma outra variável não utilizada. A maior parte do seu&&
pode ser&
e||
pode ser|
.c^' '
pode serc^32
.boolean w = false;
pode serboolean w=0>1;
.i=0
a inicialização do loop pode ser removida e altere,i,j
para,i=0,j
.++j
pode ser removido e++
adicionado ao.charAt(j++)
..toString()
pode ser+""
.for(j=i+1;j<l;++j)
pode serfor(j=0;++j<l;)
. Etc. etc.StringBuilder
pode serStringBuffer
(se você alternar para o Java 10, pode servar b=new StringBuffer(l);
. Oboolean
echar
também pode servar
. Se você não possui o Java 10 localmente, ele está disponível no TIO ). Além disso,for(;i<n;++i){for(char c:s.toCharArray())b.append(e(w,c));w=!w;}
pode serfor(;i++<n;w=!w)for(char c:s.toCharArray())b.append(e(w,c));
. E eu tenho certeza que você pode removerStringBuffer
completamente e apenas usarString
e+=
nãoappend
.05AB1E ,
3329 bytesExperimente online ou verifique todos os casos de teste .
Provavelmente pode ser dividido pela metade na contagem de bytes, mas funciona ..
Explicação:
fonte
Java 11, 387 bytes
Experimente online. (NOTA: Como o Java 11 ainda não está no TIO,
String.repeat(int)
ele foi emulado comorepeat(String,int)
para a mesma contagem de bytes.)Explicação:
fonte
R , 173 bytes
Experimente online!
@ngm: Eu tentei o meu melhor no golfe do seu código (com minhas personalizações pesadas, é claro), mas, como você bem sabe, R não gosta muito de manipular strings: P
fonte
outer
obter todas as combinações e fazer aritmética modular nos pontos de código em vez dechartr
.