Cree un programa que calcule el peso del martillo de una cuerda. El ganador es el programa con el menor peso de Hamming.

Reglas:

  • El peso de Hamming para un carácter ASCII se define como el número total de bits establecido en 1 en su representación binaria.
  • Suponga que la codificación de entrada es ASCII de 7 bits, pasada a través de cualquier mecanismo de entrada normal para su idioma (por ejemplo, stdin, args, etc.)
  • Envíe el resultado, como un número, a stdout o cualquier mecanismo de salida predeterminado / normal que utilice su lenguaje.
  • No hace falta decirlo, pero debe poder ejecutar el programa, en la vida real, para que sea una solución válida.
  • El ganador es la solución cuyo código tiene el menor peso de martillo.
  • Lo siento, ¡No hay soluciones en espacios en blanco para este! Ok, ahora puedes codificar en espacios en blanco. He resuelto las reglas 🙂

Ejemplos por carácter:

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

Comentarios

  • si tomamos 0x20 / ASCII 32 como referencia, ¿no es ‘ t el zumbido de hello world 10 en lugar de 11?
  • ¿Por qué el peso de hello world es 11? Solo 10 caracteres son diferentes de un espacio. Además, el peso de Hamming de un programa ‘ s parece ser solo su longitud, excluyendo los espacios. No es tan diferente del golf de código normal.
  • Lo siento, lo arruiné por completo. Wikipedia ‘ s artículo sobre el peso de Hamming es bastante engañoso, y fubaré ‘ totalmente las reglas. Reescribiendo ahora. Actualización: Ok, reescrito para definirlo como el número de bits establecido en 1 en la cadena ASCII, perdón por el error.
  • @ugoren Una solución con menor -Los caracteres ASCII de valor tienen un peso de Hamming más bajo.
  • Ahora todo tiene sentido. UTILICE MAYÚSCULAS, TENGA CUIDADO CON ~ Y o.

Respuesta

J (33)

¡Uno menor que 34!

+/,#:3 u: 

Fuertemente inspirado por esta respuesta , pero con un peso de martillo inferior.

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

Respuesta

J, peso 34

+/,#:a.i. 

Uso: coloque el cadena que se medirá entre comillas al final:

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

Alternativamente, tomando la entrada del teclado (peso 54):

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

Comentarios

  • Hay ‘ solo una forma de escribir esto:)
  • No hay ‘ t … Encontré una solución que tiene un peso de martillo de uno menos.
  • No estoy tratando de ser un buzzkill, pero las reglas piden un programa , no un fragmento.

Responder

J , 39

+/,#:a.i:] 

Esta es una función que toma uno argumento. (O reemplace ] con la cadena directamente; como señala Gareth, eso reduce el costo a 34).

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

Comentarios

  • Las grandes mentes piensan igual. 🙂

Respuesta

Python, 189

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

Comentarios

  • El equivalente de Python 3, print(sum(bin(ord(A)).count('1')for A in input())), tiene una puntuación de 180.
  • @ dan04: Use comillas dobles en lugar de simples para 176.

Respuesta

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 la herramienta adecuada para el trabajo, todavía apesta por supuesto.

Comentarios

  • +1 por usar uno de mis idiomas favoritos de todos los tiempos. Es ‘ el primer idioma que aprendí a codificar en una PC.

Respuesta

Unario 0

Todos sabían que venía. Primero, el programa BrainFuck:

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

Agregué líneas nuevas para hacerlo «legible» pero tiene un peso Hamming de 4066. Funciona obteniendo repetidamente el cociente / restos de una cadena de entrada y sumando todos los restos. Por supuesto, si lo ejecuta en sí mismo, obtiene: 226 (4066% 256) (técnicamente \ xe2), así que claramente se declara ganador.

Ahora lo convertimos a Unary y obtenemos

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

Usamos una implementación unaria con caracteres NULL \ x00 para «0» y boom, con un peso de martillo de 0.

Pregunta adicional : ¿Para qué caracteres ASCII c puede ejecutar este programa en una cadena que consta de N repite y hace que muestre ese carácter. (Por ejemplo, una cadena de 32 espacios da un espacio).Qué valores de N funcionan (un número infinito de ellos funcionará o ninguno).

Comentarios

  • Yo ‘ no estoy seguro de entender esta solución. El programa Brainfuck tiene un peso enorme. ¿Unary acepta bytes nulos como programa o necesitaría volver a implementar Unary? Si ‘ es el último, ‘ no es realmente una solución válida; cualquiera podría decir » Defino un lenguaje de programación donde cualquier byte de entrada da {result} » y gano todos los desafíos de golf de código en el sitio.
  • Un valor nulo El personaje Unario estaría bien. Todo lo que necesita es un EOF para decir que deje de contar. De hecho, aquí ‘ hay un pseudo-C para leer ese archivo: main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; } Doesn ‘ No importa en absoluto cuál elijas para ser tu carácter Unario (siempre que no sea ‘ t EOF).
  • Bueno, aquí ‘ es un compilador único para C que funciona bien con caracteres nulos: ideone.com/MIvAg . Por supuesto, el archivo necesario para crear este programa no cabría en el universo, pero tenemos la capacidad para ejecutarlo.
  • Si puede ‘ t en realidad ejecutarlo, ‘ no es realmente una solución.
  • Como Carl Sagan dijo una vez: » Si deseas calcular el peso de martillo de una cuerda, primero debes inventar 10 ^ 500 universos. » (miles de millones y miles de millones, incluso)

Respuesta

C, peso 322 263 256

¿Cuenta el peso del martilleo del martillo?

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

Se utiliza principalmente en golf estándar técnicas.
Un solo bucle calcula el peso (desplazándose hacia la derecha y sumando hasta cero) y escanea la cadena (avanza el puntero cuando llega a cero).
Suponiendo que D se inicializa en 2 (parámetro único).

Optimización específica del peso de Hamming ons:
1. ABDH, con un peso de 2 cada uno, usado para nombres.
2. *++H preferido sobre H[1].

Comentarios

  • Ja, no entendí por completo tu primera oración hasta ahora.
  • Puede reducir la puntuación a 230 generando el resultado como un número unario : main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
  • @schnaader , Nunca supe que @ era un dígito en el sistema unario. Pensé que solo usa 0 .. 0. Pero si quieres seguir así, printf("@"+*a%2) es más corto.
  • @ugoren: Depende de la convención / definición de unario. P.ej. en.wikipedia.org/wiki/Unary_numeral_system usa marcas de conteo y dice » No hay ningún símbolo explícito que represente cero en unario como en otras bases tradicionales «.
  • @schnaader, OK, pero creo que ‘ s extendiendo el requisito » como un número » demasiado.

Respuesta

Golfscript 84 72 58

{2base~}%{+}* 

(gracias a Howard y Peter Taylor por su ayuda)

Entrada: la cadena de entrada tiene que estar en la pila (pasada como línea de comando argumento, o simplemente colocado en la pila).

En caso de que lo ejecute desde la línea de comando, asegúrese de usar echo -n, de lo contrario, el salto de línea final también ser contado.

Salida: imprime el valor del peso del martillo en la consola

El programa puede ser probado

aquí .

Comentarios

  • ¿Golfscript distingue entre mayúsculas y minúsculas? De lo contrario, puede guardar algunos bits usando BASE en lugar de base. Actualización: recién verificado, BASE no ‘ no funciona. Buena solución 🙂
  • @Polynomial Lo intenté después de ver su TEST / test comentario 🙂 Pero no ‘ t funciona.
  • Puede deshacerse de {...}2* aplicando 2base~ en primer lugar. Obtiene una puntuación de 72.
  • @Howard, gracias por este gran consejo! Lo ‘ lo apliqué en mi respuesta.
  • Su mecanismo de prueba es incorrecto, porque ‘ ha olvidado un limitación importante de su página Web GolfScript. Debe tener un ; antes de la cadena que sustituye por stdin, de modo que (; no sea necesario. Luego, la observación de Howard ‘ lo reduce a 65.

Responder

Perl, 80 (22 caracteres)

Hecho y hecho:

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

O aquí hay una versión alternativa con un peso de 77 (21 caracteres):

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

Sin embargo, no me gusta mucho esa versión porque su salida omite la nueva línea final.

Para calcular el peso, supongo que estoy contando caracteres de la forma habitual (excluyendo perl -e / -E, pero incluidos otros caracteres de opción). Si por alguna razón la gente se queja de esto, lo mejor que puedo hacer sin opciones es 90 (26 caracteres):

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

Ejemplo de uso:

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

Boom.

Respuesta

Pyth – 15

Renuncia de responsabilidad: esta respuesta no es elegible para ganar ya que Pyth es más joven que este desafío.

Utiliza .B para la representación binaria y cuenta el número de "1" «s.

/.BQ\1 

Toma la entrada en una cadena para guardar en z versus Q.

Pruébelo en línea aquí .

Respuesta

Scala 231

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

Código de autoprueba:

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

con modificaciones de autocomprobación.

Comentarios

  • Tiene ‘ peso 495, no 231. No puedes ‘ obtener el peso 231 con 126 caracteres, eso ‘ es un promedio de menos de 2, y todos los caracteres imprimibles (excepto @ y el espacio, que no ‘ t use) tenga un peso mínimo de 2.
  • @ugoren: Pero ‘ solo tiene 65 caracteres. El programa se imprime casi dos veces: una vez el código para calcular el peso del martillo y una segunda vez como entrada estática para calcularlo para el programa. Pero a la parte de cálculo le falta el » readLine () » al frente, porque toma la entrada literal. Intenté aclarar la respuesta en sí.

Respuesta

Java, peso 931 774 499 454

Creo que esta es la única respuesta en este momento con un peso superior a 300.

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

Espera la entrada como un argumento de línea de comando.

Respuesta

GNU sed -r, 467 + 1

(+1 para el uso de -r, ¿o debería ser +4?)

Salidas como un valor unario por línea fuente; para convertir a un total decimal, redirija la salida a | tr -d "\n" | wc -c. Cuenta todos los caracteres ASCII imprimibles (32-126), más el salto de línea (10).

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

Es difícil evitar enumerar todos los caracteres, pero podemos reducir esto observando que las letras minúsculas tienen un peso Hamming de uno más que las letras mayúsculas correspondientes. Preferimos una nueva línea (puntuación 2) sobre el punto y coma (puntuación 5) como separador de declaraciones; preferimos @ (puntuación 1) o ! (puntuación 2) sobre / (puntuación 5) como delimitador de patrón.

Nota – para obtener los conjuntos de caracteres correctos, creé esta tabla a partir de la que se encuentra en man ascii, ordenada por peso. Solo agregue las puntuaciones a la derecha y a continuación para obtener el peso total de cada carácter:

 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 

Esto podría resultar útil para otros.

Responder

Julia 262 268

La versión modificada utiliza la práctica función «count_ones» para ahorrar 6 (262)

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

Antiguo versión que no utiliza una función de conteo única (268)

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

Utiliza un argumento de línea de comando para la entrada.

Respuesta

CJam 52 o 48

Si la entrada aún no está en la pila (52)

q:i2fbs:s:i:+ 

Si la entrada está en la pila (48)

:i2fbs:s:i:+ 

Por ejemplo

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

Responda

Julia, HW 199

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

Con

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

o insertando directamente la cadena:

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 

La versión sin golf (HW 411) se ve así:

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

Y por el gusto de hacerlo, aquí hay una versión optimizada (Hamming Weight 231 ) de la versión de Bakerg del problema:

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

con

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

Respuesta

HPPPL (lenguaje de programación HP Prime), 74

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

La calculadora gráfica HP Prime tiene una función hamdist () incorporada.El peso de Hamming de cada carácter es el mismo que la distancia de Hamming desde 0.

ASC (cadena) crea una matriz de los valores ASCII de cada carácter en una cadena.

hamdist ( value, 0) calcula la distancia de Hamming desde 0 para cada valor ASCII

sum () suma todos los valores.

Calculando el peso de Hamming de su propio código fuente:

Peso Hamming HPPPL

Respuesta

05AB1E , peso 17 (4 bytes )

ÇbSO 

Pruébelo en línea o verifique algunos casos de prueba más .

Explicación:

 Ç # 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  

Respuesta

Perl 6 , 102

Pruébelo en línea

Si bien esto no es golf de código, la solución más corta también parece tener el peso de martillado más pequeño …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *