Acaba de ser contratado por una empresa alemana de fabricación de automóviles. Su primera tarea, como ingeniero, es escribir un programa que calcule la huella ecológica de las cadenas ASCII.
La huella ecológica del personaje se calcula de la siguiente manera:
Escriba el código ASCII del personaje en binario y cuente el número de 1.
Por ejemplo, A
tiene una huella de 2, pero O
es más sucia con una huella de 5.
La huella global de una cadena es la suma de las huellas de sus caracteres. Una cadena vacía tiene una huella de cero.
Su programa debe aceptar una cadena ASCII como parámetro (a través de la línea de comando o entrada), calcular su huella ecológica y generarla. El programa en sí debe estar codificado en ASCII.
Sin embargo, hay un hipo. Como su empresa desea ingresar a un nuevo mercado con reglas ambientales más estrictas, debe ajustar su programa para que se comporte de manera diferente en el "modo de prueba". Así:
El programa debería generar 0 cuando recibe la cadena
test
como parámetro.
Puntuación
El código fuente con la huella ecológica más pequeña gana (y sí, ¡la respuesta test
está prohibida!)
fuente
\x7F}~_?{ow7yvu/s\x1F;=znm>k|OW[]^gc\x1Ex\x1D\eef\\'ZY+-VU.St\x173iNM5K6r\x0FG9:q<ljQ\x15\x13pC\aEF8IJL4\x0E21\x16RTh,X*)\x19\v&%\x1A#d\x1C\rab`!\"$(\x180\x05A\x14B\x12\x11DHP\x03\f\x06\n\t\x80\x10\x01@\x04\b\x02 \x00
Respuestas:
CJam,
3331Hay 11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000000000049000000000000490000000000000049000000000000490000000000004900000000000000490000000102000000009800000000490000
El código es equivalente a
que se puede probar en línea .
Como funciona esto
Como funciona
Este código fuente tiene una huella ecológica de 75.
fuente
Lenguage , 0
La salida es unaria , ya que Lenguage / Brainfuck no tiene una forma sensata de imprimir enteros en la base 10.
El código fuente real contiene
bytes nulos y es equivalente al siguiente programa Brainfuck:
Pruébelo en línea en brainfuck.tk .
La longitud del código Brainfuck es muy subóptima: para empezar, he codificado las huellas de todos los caracteres ASCII, pero el puntaje 0 es el puntaje 0 ...
fuente
PowerShell,
337344304 puntos¡TE GRITO PORQUE ES MÁS BARATO!
Toma datos como
$A
, luego los convierte como una matriz de caracteres, luego itera sobre un bucle for en cada carácter, usa el ridículamente prolijo[convert]::ToString()
para convertir el carácter en esa posición a binario, reemplaza todos los 0 con nada, luego cuenta la longitud y agrega eso a$B
. Al final, utiliza una equivalencia para indexar en una matriz dinámica (es decir, si$A
estest
, entonces-CEQ
es$TRUE
, por lo que se indexa al segundo elemento0
).Edit1 - Caso de prueba corregido
"TEST"
Edit2 - Golfed un par de puntos iterando sobre los propios personajes en lugar de sus índices, y recordando que
-replace
no necesita un segundo parámetro si lo reemplaza por nada.fuente
" 00100010
es más ecológica que la comilla simple' 00100111
."TEST"
"
. También corregido con-CEQ
mayúsculas y minúsculas. Aumentó un poco los puntos, porque estaba anotando incorrectamente,' '
ya que no lo delimité correctamente en mis pruebas.Pyth -
5249Tres puntos ahorrados gracias a @orlp.
Toma información entre comillas para ahorrar huella.
Test Suite .
fuente
@,0
con*
para guardar 3 :)@,0
: ¿ Olvidaste cambiar?Lisp común,
294281235Para reducir el puntaje, usé
@
(costo 1) y!
(costo 2) como nombres de variables (editar: y es aún mejor si uso@
para la variable que ocurre más en la función). YO SOY gritando TOO porque es más barato.Bonito estampado
fuente
;)
JavaScript, 279
Editar corrección de errores (no contó el bit 1 de cada char)
Un programa completo, con entrada y salida a través de ventanas emergentes. Probado en Firefox, debería funcionar en cualquier navegador moderno.
Algunas herramientas (probadas con Firefox)
fuente
test
lugar de 0.prompt
función. En Firefox,prompt
traduce las nuevas líneas (2 bits) en espacios (1 bit), por lo que obtenemos 277 en lugar de 279Julia,
254246232La
count_ones
función cuenta el número de unidades en la representación binaria de su entrada.¡Reduje mi huella ecológica gracias a FryAmTheEggman!
fuente
Pitón 3, 271
fuente
z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test"))
.... @ FryAmTheEggman jinx?Perl,
13611873Reemplace todo
@
con\0
Ejemplo de uso:
fuente
MATLAB,
198194 bytesPrimero, la cadena se lee desde STDIN a través de la
input
función. Una vez que esto sucede, comparamos la cadena de entrada con la cadenatest
. Si el resultado no estest
, convertimos cada carácter a su código ASCII y luego a su representación binaria a través dedec2bin
. Una hermosa consecuencia de esta función es que si envía una cadena, la representación binaria de su código ASCII se delimita como un carácter por línea.Como ejemplo:
dec2bin
genera una matriz de caracteres. Una vez que esto suceda, reste por 48, que es el código ASCII para 0 para que la matriz se convierta endouble
0 y 1. Una vez que esto sucede, una llamada a lannz
cuenta hasta el número total de elementos distintos de cero en esta matriz. Tenga en cuenta que este resultado se multiplica por el opuesto de la cadena en comparación contest
. Si la cadena no estest
, obtenemos el cálculo de la huella. Si es igual, entonces la multiplicación resulta en 0.Algunos ejemplos:
fuente
de2bi
en su lugar y evitar la-48
conversión a un tipo numérico (así como los 2 caracteres adicionales en el nombre de la función).Golpetazo
440430412405403Muy claro. Repite los caracteres en la entrada que se convierte primero a ascii (con
printf %d
y el inicio'
del número y luego a binario (conbc
), elimina los ceros y cuenta el número de caracteres.No es una gran respuesta, pero aún no había visto un intento de golpe.
Modificado ya que mi primera respuesta permitió que la cadena de entrada se proporcione simplemente en la línea de comando (es decir, se convirtió en múltiples parámetros de entrada si se usan varias palabras), pero después de leer algunas otras respuestas, creo que puedo suponer que se cita, por lo que toda la cadena viene como
$1
fuente
do
con{
ydone
con}
. 2. Tampoco necesitas los espacios alrededor<<<
. 3. Se puede reemplazar\n
con un salto de línea literal.=
y||
cuesta 15 mientras que usa!=
y&&
es solo 13! Un personaje extra pero ahorra dos puntos ...Ceilán,
1431,764,697,571,547,538,501,493,467, 451Este fue el original, sin golf:
Esto toma el argumento de un parámetro de línea de comando ... process.arguments es una secuencia (posiblemente vacía) de cadenas, por lo que antes de usar una de ellas, debemos verificar si realmente existe. En el otro caso, enviamos un mensaje de error (esto no es requerido por la pregunta y será descartado en las próximas versiones).
La
sum
función de Ceylon toma un Iterable no vacío de elementos de algún tipo que necesita satisfacerSummable
, es decir, tiene unplus
método, como Integer. (No funciona con secuencias vacías porque cada tipo Summable tendrá su propio cero, y el tiempo de ejecución no tiene oportunidad de saber a qué se refiere).Los elementos de una cadena, o los bits de un entero, no son un iterable no vacío. Por lo tanto, estamos usando aquí la característica para construir un iterable especificando algunos elementos, luego una "comprensión" (que se evaluará a cero o más elementos). Entonces, en el caso de los caracteres, estamos agregando unos (pero solo cuando se establece el bit correspondiente), en el caso de la cadena estamos agregando el resultado de los caracteres. (La comprensión solo se evaluará cuando la función de recepción realmente repita sobre ella, no cuando se construye el Iterable).
Veamos cómo podemos reducir esto. Primero, cada una de las funciones solo se llama en un lugar, por lo que podemos incorporarlas. Además, como se mencionó anteriormente, elimine el mensaje de error. (764 puntos de huella).
En realidad no necesitamos el anidado interno
sum
, podemos hacer que esta sea una gran comprensión. (Esto nos ahorra 37 puntos de huellasum({0,})
y un poco más para los espacios en blanco, que de todos modos se eliminarán al final). Esto es 697:Podemos aplicar un principio similar a la
"test"
cadena especial en mayúsculas: como en ese caso el resultado es 0 (es decir, no se aporta nada a la suma), podemos hacer esto como parte de la suma (pero tenemos que invertir la condición) . Esto nos ahorra principalmenteprint(0);
, algunas llaves y un montón de espacios de sangría, reduciéndose a una huella de 571:Hacemos lo mismo para el primero
if
, con el efecto secundario de que ahora no dar argumentos también genera resultados en0
lugar de no hacer nada. (¿Al menos pensé que pasaría aquí, en lugar de eso parece colgar con un lazo eterno? Extraño).En realidad, podemos omitir el
()
para lasum
función aquí, usando una sintaxis de llamada a función alternativa , que usa en{...}
lugar de()
, y completará las comprensiones en argumentos iterables. Esto tiene huella 538:Reemplazar el nombre de la función
footprint
(40) porp
(3) ahorra otros 37 puntos, llevándonos a 501. (Los nombres de las funciones de Ceilán tienen que comenzar con letras minúsculas, por lo que no podemos obtener menos de 3 puntos aquí).Los nombres de las variables
s
(5) yc
(4),i
(4) tampoco son óptimos. Vamos a reemplazarlos pora
(argumento),d
(dígito?) Yb
(índice de bits). Huella 493:No veo ninguna optimización restante que no sea un espacio en blanco, así que eliminemos el espacio en blanco no necesario (1 punto por cada espacio, dos por cada uno de los dos saltos de línea):
Al navegar por la API, descubrí que Character.hash en realidad devuelve el mismo valor que su
integer
atributo. Pero tiene solo 14 puntos en lugar de 30, ¡así que bajamos a 451!fuente
PowerShell,
273336328324293288295edit - olvidé el caso de 'prueba' ... demasiado caro.
editedit - perdí una oportunidad MAYÚSCULAS.
editeditedit - incorporó las sugerencias de comentarios (Gracias TimmyD).
edit 4 - D es una variable más barata que C (2 vs. 3)
edit 5 - Volver a 295 debido a la verificación de mayúsculas y minúsculas.
Recorre la cadena y cuenta los 1 que se desplazan del valor ASCII de los caracteres.
Saludo a TimmyD por darme la previsión de usar caracteres en mayúscula Y usar el índice de matriz al final.
fuente
PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
PS C:\scripts> .\ecological-footprint.ps1
"TEST"
PARAM($A)(([CHAR[]]$A|%{$B=$_;0..9|?{[INT]$B-SHR$_-BAND1}}).LENGTH,0)[("TEST"-EQ$A)]
Matlab, 320
fuente
C, 374
Se agregaron nuevas líneas (no incluidas en el puntaje) para mayor claridad. Podría mejorarse a 360 simplemente cambiando los nombres de las variables a mayúsculas, pero intentaré pensar en algo mejor.
La entrada es a través de la línea de comandos, lo que significa que se da por defecto en la entrada ausente. Espero una puntuación peor para la entrada a través de stdin
fuente
PHP,
377337299 Huella ecológica (todavía mucho) ,10291 BytesParece que PHP es favorable al medio ambiente solo en modo de prueba. ;)
Se ejecuta desde la línea de comandos como:
while
es más favorable al medio ambiente quefor
aunque comparten el mismo número de personajes. Además, los nombres de variables en mayúscula tienen una mejor huella que sus equivalentes en minúsculas.Editar
decbin
lugar debase_convert
fuente
VBA,
475418Gracias Jacob por 57 puntos de descuento
Convierte una cadena en una matriz de bytes (128 es el método abreviado vba para "Convierte la cadena de Unicode a la página de códigos predeterminada del sistema", por lo que no funcionará en Mac ...)
Bucles a través de la matriz de bytes que se convierte en binario y concatena todo junto.
VBA, ¿por qué eres tan malo jugando al golf ... :(
fuente
"test"
por supuesto)JavaScript,
418410fuente
" 00100010
es más ecológica que la comilla simple' 00100111
.Pyth, 64
Comprueba si la entrada es de prueba y, si no, cuenta el número de 1 en la representación binaria de la entrada.
fuente
Haskell, 292
No hay mucho que decir aquí: convierta cada carácter en valor ascii (
fromEnum
) y calcule la1
s (víaa
). Suma todos los resultados.fuente
JavaScript (ES6),
521478458449473465Este es mi primer intento en un campo de golf JavaScript, por lo que probablemente sea muy poco golfista.
fuente
Rubí,
316313Muy sencillo, buscando más posibilidades de golf:
b
lugar dex
ahorrar 3 puntos.fuente
$*[0]
lugar degets.chomp
(toma la entrada como un argumento de línea de comando)" 00100010
es más ecológica que la comilla simple' 00100111
.H
Es mejor queI
por la misma razón.Pitón 2,
294281269266Un puerto de mi respuesta Pyth, arriba.
La entrada se recibe como una cadena (con comillas):
fuente
" 00100010
es más ecológica que la comilla simple' 00100111
.A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]
con un puntaje de 243.CJam, 123
fuente
Pyth, 96
Un puerto de mi respuesta CJam, arriba / abajo.
fuente
I
intentar usar el ternario?
, pero en este caso, dado que es un bool, solo puede usar*
(después de cambiar a enn
lugar deq
),k
es automáticamente""
ys
en cadenas es lo mismo ajk
. ¡Espero que te diviertas aprendiendo Pyth! :)CJam,
83817977Mejor hasta ahora después de probar una serie de variaciones:
Pruébalo en línea
Explicación:
fuente
Rubí, 247
Enfoque directo en bucle a través de todos los bytes de la entrada y todos los bits en cada byte, sumando a variable
d
.d
se inicializa a -2 porqueh
contiene la nueva línea de terminación de la entrada (por valor de 2 bits) y no queremos contar eso.Del mismo modo
h
contendrátest
con una nueva línea final, por lo que una nueva línea debe incluirse en el valor de comparación.fuente
R, 279
Bastante autoexplicativo.
Pruebas:
fuente
C, 378 huella, 98 bytes
Otra solución C:
La forma en que esto funciona es que s generalmente se inicializa a 0, pero se convierte en -17 si el argumento de la línea de comandos es "test" (strcmp devuelve 0 en cadenas iguales y no cero en cadenas distintas, por lo que al invertirlo se obtiene 1 si la cadena es "prueba"). El número -17 fue elegido para compensar la huella de 17 que se calculará para "prueba". El cálculo de la huella es fácil con operadores bit a bit.
¡Chasquido! Inicialmente me perdí las "victorias de huella más corta", así que estaba buscando el código más corto ... Veré si puedo hacer que la "huella" sea más pequeña.
fuente
Java, 594
Java no es muy verde.
Versión sin golf:
D
se declara como unInteger
modo para que podamos accederInteger
albitCount
método estático de manera respetuosa con el medio ambiente. ElbitCount
método trata loschar
s como enteros y devuelve el número de bits establecidos.fuente