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
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 usa0
..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 debase
. 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*
aplicando2base~
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
.
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:
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
+*.ords>>.base(2).comb(~1)
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 …
0x20
/ ASCII 32 como referencia, ¿no es ‘ t el zumbido dehello world
10 en lugar de 11?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.~
Yo
.