Crie um programa que calcule o peso do hamming de uma linha. O vencedor é o programa com o menor peso de Hamming.

Regras:

  • O peso de Hamming para um caractere ASCII é definido como o número total de bits definido para 1 em sua representação binária.
  • Suponha que a codificação de entrada seja ASCII de 7 bits, passada por qualquer mecanismo de entrada normal para o seu idioma (por exemplo, stdin, args, etc.)
  • Envie o resultado, como um número, para stdout ou qualquer mecanismo de saída padrão / normal que seu idioma use.
  • Não é preciso dizer, mas você deve ser capaz de realmente executar o programa, na vida real, para que seja uma solução válida.
  • Vencedor é a solução cujo código tem o menor peso de hamming.
  • Desculpe, nenhuma solução em espaço em branco para este! Ok, você pode codificar em espaço em branco agora que resolvi as regras 🙂

Exemplos por caractere:

char | binary | weight -----+----------+------- a | 01100001 | 3 x | 01111000 | 4 ? | 00111111 | 6 \x00 | 00000000 | 0 \x7F | 01111111 | 7 

Comentários

  • se aceitarmos 0x20 / ASCII 32 como referência, não é ‘ t o peso do zumbido de hello world 10 em vez de 11?
  • Por que o peso de hello world é 11? Apenas 10 caracteres são diferentes de um espaço. Além disso – o peso de Hamming de um programa ‘ s parece ser apenas seu comprimento, excluindo espaços. Não é muito diferente do código de golfe normal.
  • Desculpe, estraguei tudo totalmente. O artigo do ‘ da Wikipedia sobre peso de hamming é um tanto enganoso, e eu totalmente iludi ‘ as regras. Reescrevendo agora. Atualizar: Ok, reescrito para defini-lo como o número de bits definido como 1 na string ASCII, desculpe o erro.
  • @ugoren Uma solução com menor -valor caracteres ASCII tem um peso menor de Hamming.
  • Agora tudo faz sentido. USE EM MAIÚSCULAS, CUIDADO COM ~ E o.

Resposta

J (33)

Um menor que 34!

+/,#:3 u: 

Fortemente inspirado por esta resposta , mas um peso de hamming inferior a um.

 +/,#:3 u:"+/,#:3 u:" 33 

Resposta

J, peso 34

+/,#:a.i. 

Uso – coloque o string a ser medida entre aspas no final:

 +/,#:a.i."+/,#:a.i." 34 

Como alternativa, obtendo a entrada do teclado (peso 54):

 +/,#:a.i.1!:1[1 hello 21 

Comentários

  • Há ‘ s apenas uma maneira de escrever isso:)
  • Não existe ‘ t … Eu encontrei uma solução que tem um peso de hamming menor.
  • Não estou tentando ser um buzzkill, mas as regras pedem um programa, não um fragmento.

Resposta

J , 39

+/,#:a.i:] 

Esta é uma função que requer uma argumento. (Ou substitua ] pela string diretamente; como Gareth observa, isso reduz o custo para 34.)

 +/,#:a.i:] "hello world" 45 +/,#:a.i:] "+/,#:a.i:]" 39 

Comentários

  • Grandes mentes pensam da mesma forma. 🙂

Resposta

Python, 189

print sum(bin(ord(A)).count("1")for A in raw_input()) 

Comentários

  • O equivalente Python 3, print(sum(bin(ord(A)).count('1')for A in input())), tem uma pontuação de 180.
  • @ dan04: Use aspas duplas em vez de simples para 176.

Resposta

QBasic, 322 311 286 264

H$=COMMAND$ FOR A=1 TO LEN(H$) B=ASC(MID$(H$,A,1)) WHILE B>0 D=D+B MOD 2 B=B\2 WEND NEXT ?D 

Tipo de a ferramenta certa para o trabalho, ainda é uma droga, é claro.

Comentários

  • +1 por usar um dos meus idiomas favoritos de todos os tempos. É ‘ é a primeira linguagem que aprendi a codificar em um PC.

Resposta

Unário 0

Todos vocês sabiam que isso aconteceria. Primeiro, o programa BrainFuck:

,[[>++[>>+>+<<<-]>>> [<<<+>>>-]>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>> [<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-] [-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>> [-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<< [>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<<< [>>+<[>>+>+<<<-]>>>[<<<+>>>-]>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>> [<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]> [-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<< [>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<<<]>>> [>+>+<<-]>>[<<+>>-][-]+<[>[-]<<[<<->>-]<<[>>+<<-]>>>[-]]>[<<<+<[-]>>>> [-]]<<[->>>>+<<<<]<[-<<+>>]<<],]>>>>>>>. 

Eu adicionei novas linhas para torná-lo “legível”, mas tem um peso Hamming de 4066. Funciona obtendo repetidamente o quociente / restos de uma string de entrada e somando todos os restos. Obviamente, se você executá-lo sozinho, obterá: 226 (4066% 256) (tecnicamente \ xe2), então claramente ele se considera o vencedor.

Agora, convertemos para unário e obtemos

000 ... 9*google^5.9 0"s ... 000 

Usamos uma implementação unária com caracteres NULL \ x00 para “0” e boom, peso de hamming de 0.

Pergunta bônus : Para quais caracteres ASCII c você pode executar este programa em uma string que consiste em N repetições e exiba esse caractere. (Por exemplo, uma string de 32 espaços dá um espaço).Quais valores de N funcionam (um número infinito deles funcionará ou nenhum funcionará).

Comentários

  • Eu ‘ não tenho certeza se entendi esta solução. O programa Brainfuck tem um peso enorme de presunto. O unário aceita bytes nulos como um programa ou você precisa reimplementar o unário? Se ‘ for o último, ‘ não é realmente uma solução válida – qualquer um poderia apenas dizer ” Eu defino uma linguagem de programação em que qualquer byte de entrada fornece {result} ” e ganho todos os desafios de golfe de código no site.
  • Um valor nulo personagem Unário seria ótimo. Tudo que você precisa é um EOF para dizer pare de contar. Na verdade, aqui ‘ s algum pseudo-C para ler esse arquivo: main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; } Doesn ‘ não importa o que você escolhe para ser seu personagem unário (contanto que não seja ‘ t EOF).
  • Bem, aqui ‘ um compilador unário para C que funciona bem com caracteres nulos: ideone.com/MIvAg . É claro que o arquivo necessário para fazer este programa não caberia no universo, mas temos a capacidade de executá-lo.
  • Se você puder ‘ t na verdade, executá-lo, ‘ não é realmente uma solução.
  • Como Carl Sagan disse uma vez: ” Se você deseja calcular o peso de uma string, você deve primeiro inventar 10 ^ 500 universos. ” (bilhões e bilhões, até)

Resposta

C, peso 322 263 256

O peso do hamming conta?

main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))D+=*A%2;printf("%d",D-2);} 

Usado principalmente no golfe padrão técnicas.
Um único loop calcula o peso (deslocando para a direita e adicionando até zero) e verifica a string (avança o ponteiro quando zero é alcançado).
Supondo que D seja inicializado em 2 (parâmetro único).

Otimização específica de peso de Hamming ons:
1. ABDH, com peso 2 cada, usado para nomes.
2. *++H preferencial a H[1].

Comentários

  • Hah, eu não consegui entender sua primeira frase até agora.
  • Você pode diminuir a pontuação para 230 exibindo o resultado como um número unário : main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
  • @schnaader , Eu nunca soube que @ era um dígito no sistema unário. Achei que ele só usasse 0 .. 0. Mas se você quiser ir por aqui, printf("@"+*a%2) é mais curto.
  • @ugoren: Depende da convenção / definição de unário. Por exemplo. en.wikipedia.org/wiki/Unary_numeral_system usa marcas de contagem e diz ” Não há nenhum símbolo explícito representando zero em unário como em outras bases tradicionais “.
  • @schnaader, OK, mas acho que ‘ está esticando o requisito ” como um número ” longe demais.

Resposta

Golfscript 84 72 58

{2base~}%{+}* 

(agradecimentos a Howard e Peter Taylor por sua ajuda)

Entrada: a string de entrada deve estar na pilha (passada como linha de comando ou simplesmente colocado na pilha).

No caso de você executá-lo na linha de comando, certifique-se de usar echo -n, caso contrário, a nova linha final também ser contado.

Resultado: imprime o valor do peso do hamming no console

O programa pode ser testado

aqui .

Comentários

  • O Golfscript diferencia maiúsculas de minúsculas? Caso contrário, você pode salvar alguns bits usando BASE em vez de base. Atualização: apenas verificado, BASE não ‘ não funciona. Boa solução 🙂
  • @Polynomial Tentei isso depois de ver seu TEST / test comentário 🙂 Mas não funciona ‘ t funciona.
  • Você pode se livrar de {...}2* aplicando 2base~ em primeiro lugar. A pontuação caiu para 72.
  • @Howard, obrigado por esta ótima dica! Eu ‘ apliquei em minha resposta.
  • Seu mecanismo de teste está errado, porque você ‘ se esqueceu de um limitação importante de sua página Web GolfScript. Você deve ter um ; antes da string que substituiu por stdin, de modo que (; seja desnecessário. Então, a observação de Howard ‘ reduz para 65.

Resposta

Perl, 80 (22 caracteres)

Feito e pronto:

perl -0777nE "say unpack"%32B*"" 

Ou aqui está uma versão alternativa com um peso de 77 (21 caracteres):

perl -0777pE "$_=unpack"%32B*"" 

Não gosto tanto dessa versão, porque sua saída omite a nova linha final.

Para calcular o peso, estou presumindo que estou contando caracteres da maneira usual (excluindo o perl -e / -E, mas incluindo outros caracteres de opção). Se por algum motivo as pessoas reclamarem disso, o melhor que posso fazer sem opções é 90 (26 caracteres):

$/=$,,say unpack"%32B*",<> 

Exemplo de uso:

$ perl -0777nE "say unpack"%32b*"" rickroll.txt 7071 

Boom.

Resposta

Pyth – 15

Isenção de responsabilidade: esta resposta não é elegível para vencer, pois Pyth é mais jovem do que este desafio.

Usa .B para representação binária e conta o número de "1" “s.

/.BQ\1 

Aceita a entrada em uma string para salvar em z versus Q.

Experimente online aqui .

Resposta

Scala 231

 readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum  

Código de autoteste:

"""readLine().map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum""".map(_.toInt.toBinaryString).flatten.map(_.toInt-48)sum 

com modificação de autoteste.

Comentários

  • É ‘ peso 495, não 231. Você não pode ‘ obter peso 231 com 126 caracteres – que ‘ s uma média de menos de 2 e todos os caracteres imprimíveis (exceto @ e espaço, que você don ‘ use) tenha pelo menos peso 2.
  • @ugoren: Mas ‘ s apenas 65 caracteres. O programa é impresso quase duas vezes: uma vez o código para calcular o peso do presunto e uma segunda vez como entrada estática para calculá-lo para o programa. Mas a parte do cálculo está faltando o ” readLine () ” na frente, porque leva a entrada literal. Tentei esclarecer a própria resposta.

Resposta

Java, peso 931 774 499 454

Acho que esta é a única resposta no momento com peso acima de 300.

class H{public static void main(String[]A){System.out.print(new java.math.BigInteger(A[0].getBytes()).bitCount());}} 

Espera entrada como um argumento de linha de comando.

Resposta

GNU sed -r, 467 + 1

(+1 para uso de -r – ou deveria ser +4?)

Exibe como um valor unário por linha de origem; para converter em um total decimal, redirecione a saída para | tr -d "\n" | wc -c. Conta todos os caracteres ASCII imprimíveis (32-126), mais o avanço de linha (10).

s@[a-z]@\U& @g s@[?{}~]@ @g s@[][/7;=>OW|^]@ @g s@[-"+.3569:<GKMNSUVYZ\\]@ @g s@[#%&)*,CEFIJL1248ORTX]@ @g s@$|[!"$(ABDH0P`]@ @g y! @!11! 

É difícil evitar listar todos os caracteres, mas podemos reduzir isso observando que as letras minúsculas têm um peso Hamming de um a mais do que as letras maiúsculas correspondentes. Preferimos nova linha (pontuação 2) em vez de ponto e vírgula (pontuação 5) como separador de declarações; preferimos @ (pontuação 1) ou ! (pontuação 2) em / (pontuação 5) como delimitador de padrão.

Observação – para obter os conjuntos de caracteres certos, criei esta tabela a partir de man ascii, classificados por peso. Basta adicionar as pontuações corretas e abaixo para obter o peso geral de cada personagem:

 2 4 3 5 6 7 --- ------ - 0: @ 0 P ` p |0 1: ! A 1 Q a q | 2: " B 2 R b r |1 4: $ D 4 T d t | 8: ( H 8 X h x | 3: # C 3 S c s | 5: % E 5 U e u | 6: & F 6 V f v |2 9: ) I 9 Y i y | A: * J : Z j z | C: , L < \ l | | 7: ´ G 7 W g w | B: + K ; [ k { |3 D: - M = ] m } | E: . N > ^ n ~ | F: / O ? _ o |4 --- ------ - 1 2 3 

Isso pode ser útil para outras pessoas.

Resposta

Julia 262 268

A versão modificada usa a função útil “count_ones” para salvar 6 (262)

show(mapreduce(x->count_ones(x),+,map(x->int(x),collect(ARGS[1])))) 

Antigo versão sem função incorporada de contagem única (268)

show(mapreduce(x->int(x)-48,+,mapreduce(x->bits(x),*,collect(ARGS[1])))) 

Usa argumento de linha de comando para entrada.

Resposta

CJam 52 ou 48

Se a entrada ainda não estiver na pilha (52)

q:i2fbs:s:i:+ 

Se a entrada estiver na pilha (48)

:i2fbs:s:i:+ 

Por exemplo

"Hello World":i2fbs:s:i:+ 

Resposta

Julia, HW 199

H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:]))) 

Com

A="H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:])))" 

ou inserindo diretamente a string:

julia> H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect("H=mapreduce;H(B->B=="1",+,H(P->bits(P),*,collect(A[:])))"))) 199 

A versão sem golfe (HW 411) se parece com isto:

bitstring=mapreduce(x->bits(x),*,collect(teststring[:])) mapreduce(checkbit->checkbit=="1",+,bitstring) 

E para se divertir, aqui está uma versão otimizada (Peso Hamming 231 ) da opinião de Bakerg sobre o problema:

A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:])))) 

com

H="A=mapreduce;show(A(B->int(B)-48,+,A(B->bits(B),*,collect(H[:]))))" 

Resposta

HPPPL (HP Prime Programming Language), 74

sum(hamdist(ASC(a),0)) 

A calculadora gráfica HP Prime possui uma função hamdist () integrada.O peso hamming de cada caractere é igual à distância hamming de 0.

ASC (string) cria uma matriz dos valores ASCII de cada caractere em uma string.

hamdist ( valor, 0) calcula a distância Hamming de 0 para cada valor ASCII

sum () soma todos os valores.

Calculando o peso Hamming de seu próprio código-fonte:

Peso Hamming HPPPL

Resposta

05AB1E , peso 17 (4 bytes )

ÇbSO 

Experimente online ou verifique mais alguns casos de teste .

Explicação:

 Ç # Convert the characters in the (implicit) input to their ASCII decimal values # i.e. "Test" → [84,101,115,116] b # Convert those values to binary # i.e. [84,101,115,116] → ["1010100","1100101","1110011","1110100"] S # Split it into a list of 0s and 1s (implicitly flattens) # i.e. ["1010100","1100101","1110011","1110100"] # → [1,0,1,0,1,0,0,1,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0] O # Sum those (and output implicitly) # i.e. [1,0,1,0,1,0,0,1,1,0,0,1,0,1,1,1,1,0,0,1,1,1,1,1,0,1,0,0] → 16  

Resposta

Perl 6 , 102

Experimente online!

Embora isso não seja um código de golfe, a solução mais curta também parece ter o menor peso de hamming …

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *