Mini-golfe de segunda-feira: Uma série de desafios curtos de golfe com código , publicados (espero!) Toda segunda-feira.
(Desculpe, este está um pouco atrasado.)
Tenho certeza que a maioria de vocês já ouviu falar da distância de Levenshtein , um algoritmo para calcular a distância entre duas cordas. Bem, esse desafio é sobre a implementação de um algoritmo semelhante de minha própria invenção *, chamado distância do anagrama . A principal diferença é que a ordem dos personagens não importa; em vez disso, apenas os caracteres exclusivos de uma sequência ou de outra são medidos.
Desafio
O objetivo do desafio é escrever um programa ou função que pegue duas cordas e retorne a distância do anagrama entre elas. A principal maneira de fazer isso é usar a seguinte lógica:
- Converta as duas strings em minúsculas e (opcionalmente) classifique os caracteres de cada um em ordem alfabética.
- Enquanto as seqüências contêm pelo menos um caractere igual, remova a primeira instância desse caractere de cada sequência.
- Adicione os comprimentos das seqüências restantes e retorne / produza o resultado.
Exemplo
Se as entradas são:
Hello, world!
Code golf!
Em seguida, em minúsculas e classificadas, elas se tornam: (pela classificação padrão de JS; observe os espaços iniciais)
!,dehllloorw
!cdefgloo
Removendo todos os caracteres que estão nas duas cadeias, terminamos com:
,hllrw
cfg
Assim, a distância do anagrama entre as duas cordas originais = 6 + 3 = 9.
Detalhes
- As seqüências de caracteres podem ser obtidas em qualquer formato sensato.
- As seqüências consistirão apenas em ASCII imprimível.
- As cadeias de caracteres em si não conterão nenhum espaço em branco além dos espaços regulares. (Sem guias, novas linhas etc.)
- Você não precisa usar esse algoritmo exato, desde que os resultados sejam os mesmos.
Casos de teste
Entrada 1:
Hello, world!
Code golf!
Saída 1:
9
Entrada 2:
12345 This is some text.
.txet emos si sihT 54321
Saída 2:
0
Entrada 3:
All unique characters here!
Bdfgjkmopvwxyz?
Saída 3:
42
Entrada 4:
This is not exactly like Levenshtein distance,
but you'll notice it is quite similar.
Saída 4:
30
Entrada 5:
all lowercase.
ALL UPPERCASE!
Saída 5:
8
Pontuação
Este é o code-golf , pelo que o código válido mais curto em bytes vence. O desempatador vai para o envio que atingiu sua contagem final de bytes primeiro. O vencedor será escolhido na próxima segunda-feira, 12 de outubro. Boa sorte!
Edit: Parabéns ao vencedor, @isaacg, usando Pyth (novamente) por 12 bytes surpreendentes !
* Se este algoritmo foi usado em outro lugar e / ou recebeu outro nome, informe-me! Não consegui encontrá-lo com uma pesquisa de 20 minutos.
Respostas:
Pitão, 12 bytes
Suíte de teste
A operação em questão é equivalente ao operador de subtração bagwise de Pyth
.-
, aplicado nas duas direções. Você poderia chamar isso de bagor xor, suponho.A solução é:
.z
: obtém entrada como lista de 2 strings.rR0
: converte ambos para minúsculas..p
: Forme todas as permutações, ou seja, normais e invertidas..-M
: Mapeie a.-
operação sobre cada pedido.s
: Concatene os resultados.l
: Imprima o comprimento.fonte
JavaScript (ES7), 92 bytes
Define uma função anônima.
Para testar, execute o snippet abaixo. Você pode editar o código e clicar em 'Teste' para comparar sua saída com a original. (Deixe um comentário se encontrar uma melhoria!) A entrada é como
"Hello, world!", "Code golf!"
na caixa de entrada.Obrigado a @ETHproductions por economizar 6 bytes!
Mais sobre a suíte de testes
Como funciona
fonte
.join("")+b
com.join``+b
sem efeito.CJam,
2319 bytesExperimente online no intérprete CJam .
Como funciona
fonte
Ruby, 62
Tem que haver uma maneira melhor.
Edit: 57 caracteres graças a iamnotmaynard investigando um caminho que eu estava com preguiça de fazer.
fonte
sub
pode levar cordas. Você não poderia usar emc.downcase
vez de/#{Regexp.escape c}/i
?Python,
9087818079 bytesPython <versão 3.5, 80 bytes
Explicação
Para cada caractere em a ou b, conte o número de ocorrências em cada sequência e adicione a diferença (positiva).
Edit: Reler regras, funções anônimas realizadas são aceitáveis, melhor resposta, eliminando raw_input. Primeiro golfe, por favor, seja gentil!
Obrigado ao sp3000 pela melhoria da redefinição do str.lower e por me fazer perceber que a impressão era desnecessária. Também espaços. Ainda aprendendo.
Usando python> = 3.5, existe uma maneira mais curta de definir conjuntos, para que um byte possa ser salvo em versões anteriores.
fonte
Retina,
4020 bytes20 bytes salvos graças a Martin Büttner.
Coloque cada linha em seu próprio arquivo e substitua
\n
por uma nova linha literal.fonte
pb , 648 bytes
Recebe uma entrada com um caractere de tabulação que separa as duas cadeias.
Este foi um doozy. Na verdade, implementar o algoritmo não foi a parte mais difícil, veio com relativa facilidade. Mas eu tive que fazer duas coisas que são difíceis de fazer no pb: insensibilidade ao caso e itoa. Por acaso, eu tinha um programa de conversão para minúsculas (com apenas 211 bytes de comprimento) e todo o resto foi pregado no final para fazer o trabalho especificamente para esse desafio.
Você pode assistir a este programa executado no YouTube! Há algumas coisas que você deve ter em mente se fizer:
chr(-1)
trava o intérprete ao executar no modo de exibição.Hello, world!
eCode golf.
. Isso é um pouco diferente de uma das entradas de exemplo no desafio; Usei-o porque era curto, mas o modifiquei para que a saída correta seja 10 em vez de 9. Isso é apenas para mostrar que o número é impresso corretamente, mesmo se houver vários dígitos, o que é difícil em pb.chr(10)
não é tratado adequadamente os torna amplamente inúteis aqui. Tudo isso dito, eu acho que é quase bonito de se assistir. É uma enorme bagunça de código horrível interpretando outro código horrível, partes dele quebrando na frente dos seus olhos e, no entanto, tudo funciona apenas o suficiente para obter a resposta certa. Parece que o lixo está sendo impresso, mas se você observar de perto o suficiente com o conhecimento da fonte, poderá descobrir o que está fazendo e o porquê a qualquer momento. Eu me sinto como Cypher quando assisto a este vídeo:I... I don’t even see the code. All I see is blonde, brunette, red-head.
Sem mais delongas, aqui está o código não destruído.
fonte
C ++ 199 bytes
Usa uma matriz para armazenar a contagem de cada caractere na primeira sequência, minis a contagem na segunda sequência. A seguir, encontra a soma dos valores absolutos dos elementos da matriz: essa é a distância.
Golfe:
Ungolfed:
fonte
PowerShell, 79 bytes
Quase exatamente o mesmo código da minha resposta no Anagram Code Golf ... mas ... Eu estou tendo um comportamento estranho se eu simplesmente retirar
-eq0
essa resposta, então acabei precisando explicitamente.ToLower()
e reformular fora daparam
declaração. +A explicação também (principalmente) foi copiada dessa resposta - Pega as duas entradas de seqüência de caracteres, as torna em minúsculas e as reintroduz como matrizes de caracteres. A
diff
função (um alias paraCompare-Object
) pega as duas matrizes e retorna itens diferentes entre as duas. Aproveitamos isso ao relançar o retorno como uma matriz com()
e, em seguida, verificar seu comprimento.+ Por exemplo, eu estava ficando resultados falsos com
param([char[]]$a,[char[]]$b)(diff $a $b).length
oall lowercase.
/ALL UPPERCASE!
teste. Se eu separasse manualmente as matrizes (por exemplo, executei(diff ('a','l','l'...
), funcionaria bem, mas falharia toda vez que houvesse sobreposição de maiúsculas / minúsculas na transmissão. Tudo o que posso ler na documentação afirma que nãodiff
diferencia maiúsculas de minúsculas por padrão, então ... encolher de ombros ???fonte
Bash,
6867 bytesEu acho que isso funciona. Observe o espaço à direita na segunda linha.
Casos de teste
fonte
Perl,
5246 bytes + 3 comutadores (a, F, n) =5549 bytesRecebe a entrada do STDIN com as seqüências de entrada em suas próprias linhas, finalizadas pelo EOF.
Comuta:
Código:
fonte
Utilitários Bash + GNU, 53
sed
transforma em minúsculas e divide a string em linhas parasort
. Como precisamos fazer isso duas vezes, coloco-o em uma função.comm3 -3
filtra as linhas relevantes ewc -l
produz o número.Entrada é via
STDIN
; Como dois comandos são lidos seqüencialmente, você deve enviarEOF
(Ctrl-D) duas vezes, entre as strings e no final. Sobrescreve o arquivo1
, se presente.fonte
Matlab, 91 bytes
Experimente online .
Isso funciona da seguinte maneira:
fonte
Gelatina , 6 bytes
Experimente online!
fonte
F #,
134126 bytesExplicação :
a
eb
separadamente.Reduza cada grupo com o
-
operador, que tem o seguinte efeito:Soma o valor absoluto dos valores da etapa anterior.
fonte
Scala ,
13481 bytesObrigado @ ASCII-only por seu trabalho.
Experimente online!
fonte