Código fuente huella ecológica

102

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, Atiene una huella de 2, pero Oes 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 testcomo parámetro.

Puntuación

El código fuente con la huella ecológica más pequeña gana (y sí, ¡la respuesta testestá prohibida!)

Arnaud
fuente
36
Lo siento, no he estado al tanto de las noticias, pero lo acabo de leer. ¿Podemos suponer que la compañía de automóviles alemana definitivamente NO se llama Volkswagen?
Level River St
77
Como referencia, los personajes más costosos a los menos costosos:\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
Caridorc
19
@steveverrill Es una compañía ficticia, pero su nombre de hecho comienza con V y tiene una W en algún punto intermedio. Pero cualquier similitud con la realidad es mera coincidencia, al menos alguien nos demanda.
Mindwin
1
¿Funciones permitidas (en lugar de programas)?
Luis Mendo
12
¡Te están mintiendo! Los 1 son mucho más ecológicos que los 0. ¿Quieres pruebas? Imprima su código fuente en binario. Los 0 usan casi el doble de tinta que los 1. Y si codifica con un fondo oscuro, también desperdician más electricidad para mostrar en su pantalla. (Si codifica con un fondo blanco, ya está desperdiciando electrones que hacen que todo sea blanco, por lo que claramente cualquier programador con conciencia ambiental debería usar un fondo negro en su editor). Para ser más ecológicos, todos deberíamos escribir en Espacio en blanco ...
Darrel Hoffman

Respuestas:

45

CJam, 33 31

"",AA#b:c~

Hay 11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000000000049000000000000490000000000000049000000000000490000000000004900000000000000490000000102000000009800000000490000

El código es equivalente a

11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000098
AA#b:c~

que se puede probar en línea .

Como funciona esto

"",  e# Push the length of the string.
AA#  e# Push 10000000000.
b    e# Turn the length into the array of its base-10000000000 digits.
:c   e# Cast each digit to character. This pushes the following:
     e# q_"test"=!*:i2fb1fb1b
~    e# Evaluate the string.

Como funciona

q_     e# Read all input and push a copy.
"test" e# Push the string "test".
=!*    e# Check for inequality and repeat the string 0 or 1 times.
       e# This replaces input "test" with the empty string.
:i     e# Cast each character to integer
2fb    e# Replace each integer by the array of its base-2 digits.
1fb    e# Replace each array of base-2 digits by the sum of its digits.
1b     e# Add the sums of digits.

Este código fuente tiene una huella ecológica de 75.

Dennis
fuente
3
Wow, eso es inteligente. Supongo que la advertencia es que nunca podrías ejecutarlo, ya que toda la memoria del mundo no podría contener todo el código.
Reto Koradi
49
Eso es un inconveniente menor. No se puede poner precio a la naturaleza.
Dennis
Es un buen truco, pero no es válido si no se puede ejecutar
edc65
55
@PyRulez: No por nada a menos que se construya a partir de algo que no sea materia y que ocupe algo que no sea espacio.
vsz
55
¿Por qué no solo usar Lenguage?
jimmy23013
40

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

22360559967824444567791709913713659826044558304969374451791514225490473373040212332757409553558758107085015797320276213515502796255082717802632399123502087743818475438512153373406931103005017157351410347278489842099128517039634739852783737052963203448945756470632484148121769939122103257063633371522287190530269279693540898545359211009781370158317748609540216376596783541124510013448091325488601732964773653391702083563797082990404753843419895799343996435988722965711513708742853668363743953430527328863418281733901770990932025503662188187254784985474815936854540100376410040743052620419372327997519047616042603909398552951490180076364164838561112002025592431155898041427468731461614504254168899805662501979953318388813759833797929243626668399650485310047043700001093878284174322463350892654886806075148010832042248607926124030339950499631072150856939786062937034833055717723216663269161130154002679878012158315587925933383341827053312086716181702533743607685576475754259877651521989944802973721727159955208722180232955193930065862370838526521351991966172723976565264862909528310162816593997640732796289501819499741414526385058421824690665542546821941125191276568479078107133076037506211133628962099403163812267452274532219562823184225236020523509355625620557197876838014050964240952738109101849512504021041103516630358995290177306585560988278630098667702211916671663291473843258785929522017507744814910480115446168939335008597569919072874897148594826036210511162928991890818427747059833051607455121463371211282760364668765311589329918870071117807132901910082663054895226456039171170783440772764031568108965851688162729239711772886386306884508520204834432674839183166053019421652064937613583258148354531835035461504442885024563141848164279928769795684221364984104923764359842286827870778678989243517189772102669283996930513577004801536579491093711362942690905779844535371088542020595945700544234301668098553671685123172583259206072965508639556627967633275762621813851479909708616154198658896714629908456913467267354690109885368211752176196164620615081464122410029328694509842558492529684841818953632659248840216891072110853731776562597900145806210691868173380612838327841104919352821441230296200143603175486627682007399030356592930049570084097858148122367

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 ...

Dennis
fuente
¡De ninguna manera, Lenguage realmente admite bytes nulos ?!
Beta Decay
20
Siento que esa respuesta como esta no muestra respeto por el público: es trampa y juegos del sistema ... Pero después de todo, este es el objetivo de este desafío. +1
edc65
1
"La salida es unaria, ya que Lenguage / Brainfuck no tiene una forma sensata de imprimir enteros en la base 10". . Pensé que parte del punto de Lenguage / Brainfuck era que no tenía una forma sensata de hacer nada :)
Adam
99
Esto no funcionó para mí cuando intenté recrear tu programa a partir de la definición que diste. ¿Podría publicar la fuente completa de Lenguage para que pueda ver en qué difiere su programa de mi intento de recrearlo? ;-)
Cort Ammon
1
Lo que me sorprende no es que Lenguage admita nulos, sino que lograste hacer un programa de este tipo en BF. Haunting ...
Erik the Outgolfer
12

PowerShell, 337 344 304 puntos

PARAM([CHAR[]]$A)$A|%{$B+=([CONVERT]::TOSTRING(+$_,2)-REPLACE0).LENGTH};($B,0)[-JOIN$A-CEQ"test"]

¡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 $Aes test, entonces -CEQes $TRUE, por lo que se indexa al segundo elemento 0).

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 -replaceno necesita un segundo parámetro si lo reemplaza por nada.

AdmBorkBork
fuente
La comilla doble " 00100010es más ecológica que la comilla simple ' 00100111.
Jacob Krall
Devuelve un valor incorrecto 0 para la entrada"TEST"
Jacob Krall
1
@JacobKrall Buena captura de la comilla doble ". También corregido con -CEQmayúsculas y minúsculas. Aumentó un poco los puntos, porque estaba anotando incorrectamente, ' 'ya que no lo delimité correctamente en mis pruebas.
AdmBorkBork
9

Pyth - 52 49

Tres puntos ahorrados gracias a @orlp.

*/.BQ`1nQ"test

Toma información entre comillas para ahorrar huella.

Test Suite .

Maltysen
fuente
Ugh, casi tengo lo mismo que tú, pero mi respuesta es muy similar y publicaste primero. Reemplace @,0con *para guardar 3 :)
orlp
1
@Maltysen Dices que encontraste tres puntos pero la fuente aún dice @,0: ¿ Olvidaste cambiar?
aplaude el
@ConfusedMr_C sí. Acabo de cambiar el enlace permanente y olvidé la respuesta real.
Maltysen
7

Lisp común, 294 281 235

Para 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.

(LAMBDA(@)(IF(STRING="test"@)0(LOOP FOR ! ACROSS @ SUM(LOGCOUNT(CHAR-CODE !)))))

Bonito estampado

(LAMBDA (@)
  (IF (STRING= "test" @) 0
      (LOOP FOR ! ACROSS @ SUM (LOGCOUNT (CHAR-CODE !)))))
volcado de memoria
fuente
Bueno, la puntuación es más como 294;)
Cabbie407
@ Cabbie407 Perdí la parte sobre la puntuación, lo siento :-)
coredump
1
@ Cabbie407 Tuve la extraña sensación de tener un puntaje muy bajo durante un par de minutos ...
coredump
1
Solo quería que lo supieras, porque conociendo el método de puntuación probablemente mirarías tu código desde un ángulo diferente. Y veo que ya has cambiado algo.
Cabbie407
1
@ Cabbie407 Olvidé agradecerte, por cierto. Gracias.
coredump
6

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.

B=(P=prompt)(H=D=0)
while(B!="test"&&(A=B.charCodeAt(H++)))while(A)D+=A&1,A>>=1
P(D)

Algunas herramientas (probadas con Firefox)

w=c=>c.toString(2).split('').reduce(function(a,b){return a- -b})

t=[[],[],[],[],[],[],[],[],[]]
u=[[],[],[],[],[],[],[],[],[]]
for(c=1;c<256;c++)
  c<33|c>126&c<161 ? t[w(c)].push('\\'+c) : u[w(c)].push('&#'+c+';')
for(i=0; i++<8;)       
  T.innerHTML+=i+': '+u[i].concat(t[i]).join(' ')+'\n'

function Calc()
{
  var r='', t=0, b
  I.value.split('').forEach(function(c) {
    c = c.charCodeAt(), r += '\n&#'+c+' '+((256+c).toString(2).slice(1))+' : '
    for(b=0;c;c>>=1) b += c&1
    r += b, t += b
  })
  R.innerHTML='Total '+t+'\nDetail'+r
}
#I { width: 400px }
<b>Weight table</b><pre id=T></pre><br>
<b>Counter</b><br><textarea id=I></textarea><button onclick="Calc()">-></button> <pre id=R></pre>

edc65
fuente
1
Esta respuesta no es válida: genera 17 para en testlugar de 0.
ASCIIThenANSI
@ASCIIThenANSI no lo hace en mi navegador. Pero voy a verificar de nuevo
edc65
Eso es divertido ... Al probarlo con tu contador, obtengo 279, y al probarlo consigo mismo, obtengo 277. Me pregunto cuál es el correcto; ¿podría tener algo que ver con las nuevas líneas?
ETHproductions
@ETHproductions Verifiqué dos veces y el recuento correcto es 279. Pero no funciona con una cadena que contiene una nueva línea; es un problema relacionado con la promptfunción. En Firefox, prompttraduce las nuevas líneas (2 bits) en espacios (1 bit), por lo que obtenemos 277 en lugar de 279
edc65
@ETHproductions ... en Chrome (en Windows) se convierte en la nueva línea un par CR LF (3BIT + 2 bits) y el recuento es incorrecto otra vez
edc65
6

Julia, 254 246 232

P=readline()
print(P=="test"?0:sum([count_ones(1*A)for A=P]))

La count_onesfunción cuenta el número de unidades en la representación binaria de su entrada.

¡Reduje mi huella ecológica gracias a FryAmTheEggman!

Alex A.
fuente
1
No hay problema, realmente me importa el medio ambiente;)
FryAmTheEggman
6

Pitón 3, 271

z=input();print([sum([bin(ord(i)).count("1")for i in z]),0][z=="test"])
Azul
fuente
3
Muchos pequeños cambios me dan 228
FryAmTheEggman
2
¿Por qué no aprovechar que los bools son ints? z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test")).... @ FryAmTheEggman jinx?
NightShadeQueen
1
@ NightShadeQueen Jaja, ¿eso significa que no puedo publicar por un día? : X De todos modos, es una buena captura para un nuevo usuario en este sitio, ¡buen trabajo! De todos modos, ¡bienvenido a PPCG! :) Además, más sobre el tema, el punto y coma podría eliminarse ya que cuesta un poco más que una nueva línea.
FryAmTheEggman
5

Perl, 136 118 73

$_=unpack"B*";$_=y@1@@

Reemplace todo @con\0

Ejemplo de uso:

perl -p entry.pl entry.pl
Jarmex
fuente
5

MATLAB, 198 194 bytes

A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)

Primero, la cadena se lee desde STDIN a través de la inputfunción. Una vez que esto sucede, comparamos la cadena de entrada con la cadena test. Si el resultado no es test , convertimos cada carácter a su código ASCII y luego a su representación binaria a través de dec2bin. 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('ABCD')

ans =

1000001
1000010
1000011
1000100

dec2bingenera 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 en double0 y 1. Una vez que esto sucede, una llamada a la nnzcuenta 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 con test. Si la cadena no es test, obtenemos el cálculo de la huella. Si es igual, entonces la multiplicación resulta en 0.

Algunos ejemplos:

>> A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)
A

ans =

     2

>> A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)
O

ans =

     5

>> A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)
test

ans =

     0


>> A=input('','s');~strcmp('test',A)*nnz(dec2bin(A)-48)
  %// Note - no characters were added here.  Simply pushed Enter

ans =

     0
rayryeng
fuente
Si se le permite usar Communications Toolbox, puede usar de2bien su lugar y evitar la -48conversión a un tipo numérico (así como los 2 caracteres adicionales en el nombre de la función).
vaso de precipitados
5

Golpetazo 440 430 412 405 403

A=0
[ test != "$1" ]&&for((D=0;D<${#1};D++)){
A=$((A+`bc<<<$(printf "obase=2;%d" "'${1:$D:1}")|tr -d "0
"|wc -m`))
}
echo $A

Muy claro. Repite los caracteres en la entrada que se convierte primero a ascii (con printf %dy el inicio 'del número y luego a binario (con bc), 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

Adán
fuente
1
¡Bienvenido a Programming Puzzles & Code Golf! 1. Puede reemplazar docon {y donecon }. 2. Tampoco necesitas los espacios alrededor <<<. 3. Se puede reemplazar \ncon un salto de línea literal.
Dennis
Gracias a Dennis. Uno de los desafíos en este sitio es desaprender un montón de "buenos hábitos" :).
Adam
3
Seguro que lo es. Si aún no lo ha hecho, le recomiendo consultar Consejos para jugar al golf en Bash . Es un gran recurso.
Dennis
3
¡Este desafío es extraño incluso para los estándares de golf! Los personajes adicionales aún pueden ahorrar puntos. ¡Usa =y ||cuesta 15 mientras que usa !=y &&es solo 13! Un personaje extra pero ahorra dos puntos ...
Adam
5

Ceilán, 1431 , 764 , 697 , 571 , 547 , 538 , 501 , 493 , 467 , 451

shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.hash.get(b))1});}

Este fue el original, sin golf:

Integer footprintCharacter(Integer b) {
    return sum({0, for(i in 0..7) if(b.get(i)) 1 });
}
Integer footPrintString(String s) {
    if(s == "test") {return 0;}
    return sum({0, for(c in s) footprintCharacter(c.integer)});
}
shared void footprint() {
     if(exists s = process.arguments[0]) {
         print(footPrintString(s));
     } else {
         print("This program needs at least one parameter!");
     }
}

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 sumfunción de Ceylon toma un Iterable no vacío de elementos de algún tipo que necesita satisfacer Summable, es decir, tiene un plusmé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).

shared void footprint() {
    if (exists s = process.arguments[0]) {
        if (s == "test") {
            print(0);
        } else {
            print(sum({ 0, for (c in s) sum({ 0, for (i in 0..7) if (c.integer.get(i)) 1 }) }));
        }
    }
}

En realidad no necesitamos el anidado interno sum, podemos hacer que esta sea una gran comprensión. (Esto nos ahorra 37 puntos de huella sum({0,})y un poco más para los espacios en blanco, que de todos modos se eliminarán al final). Esto es 697:

shared void footprint() {
    if (exists s = process.arguments[0]) {
        if (s == "test") {
            print(0);
        } else {
            print(sum({ 0, for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
        }
    }
}

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 principalmente print(0);, algunas llaves y un montón de espacios de sangría, reduciéndose a una huella de 571:

shared void footprint() {
    if (exists s = process.arguments[0]) {
        print(sum({ 0, if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
    }
}

Hacemos lo mismo para el primero if, con el efecto secundario de que ahora no dar argumentos también genera resultados en 0lugar de no hacer nada. (¿Al menos pensé que pasaría aquí, en lugar de eso parece colgar con un lazo eterno? Extraño).

shared void footprint() {
    print(sum({ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 }));
}

En realidad, podemos omitir el ()para la sumfunció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:

shared void footprint() {
    print(sum{ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 });
}

Reemplazar el nombre de la función footprint(40) por p(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í).

shared void p() {
    print(sum{ 0, if (exists s = process.arguments[0]) if (s != "test") for (c in s) for (i in 0..7) if (c.integer.get(i)) 1 });
}

Los nombres de las variables s(5) y c(4), i(4) tampoco son óptimos. Vamos a reemplazarlos por a(argumento), d(dígito?) Y b(índice de bits). Huella 493:

shared void p() {
    print(sum{ 0, if (exists a = process.arguments[0]) if (a != "test") for (c in a) for (b in 0..7) if (c.integer.get(b)) 1 });
}

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):

shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.integer.get(b))1});}

Al navegar por la API, descubrí que Character.hash en realidad devuelve el mismo valor que su integeratributo. Pero tiene solo 14 puntos en lugar de 30, ¡así que bajamos a 451!

shared void p(){print(sum{0,if(exists a=process.arguments[0])if(a!="test")for(c in a)for(b in 0..7)if(c.hash.get(b))1});}
Paŭlo Ebermann
fuente
4

PowerShell, 273 336 328 324 293 288 295

PARAM($A)[CHAR[]]$A|%{$D=[INT]$_;WHILE($D){$B+=$D-BAND0X1;$D=$D-SHR1}};($B,0)[$A-CEQ"test"]

edit - 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.

Cuarenta3
fuente
1
Buen enfoque! Un par de campos de golf (eliminó la inicialización de $ B, ya que por defecto será cero, eliminó un par de parens, eliminó algunos puntos y coma), lo reduce a 293 PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
AdmBorkBork
¿Qué significa cuando leo "Buen enfoque!" y escuchaste la voz de Wii Golf? Gracias por los punteros! La inicialización me estaba tropezando cuando lo probé en la consola PowerShell y lo dejé adentro. Es bueno saber lo contrario.
Cuarenta
Sí, si está utilizando la consola, es prácticamente un entorno REPL, en el que las variables asignadas permanecen de una línea a la siguiente. Si lo guarda como .ps1, el $ B (y todas las demás variables) se reinicia, incluso si presiona la flecha hacia arriba desde el mismo shell. Por ejemplo,PS C:\scripts> .\ecological-footprint.ps1
AdmBorkBork
Devuelve el valor incorrecto 0 para la entrada"TEST"
Jacob Krall
1
281PARAM($A)(([CHAR[]]$A|%{$B=$_;0..9|?{[INT]$B-SHR$_-BAND1}}).LENGTH,0)[("TEST"-EQ$A)]
tomkandy
4

Matlab, 320

A=(input('','s'));nnz(floor(rem(bsxfun(@times,[A 0],2.^(-7:0)'),2)))*~strcmp(A,'test')
Luis Mendo
fuente
4

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

i,t;
main(int c,char**v){
for(;c=v[i][i/8];i++)t+=(c>>i%8)&1;
printf("%d",strcmp(v[1],"test")?t:0);
}
Level River St
fuente
4

PHP, 377 337 299 Huella ecológica (todavía mucho) , 102 91 Bytes

Parece que PHP es favorable al medio ambiente solo en modo de prueba. ;)

WHILE($D<STRLEN($A=$argv[1]))$B+=SUBSTR_COUNT(DECBIN(ORD($A[$D++])),1);ECHO"test"!=$A?$B:0;

Se ejecuta desde la línea de comandos como:

php footprint.php hello
php footprint.php test

whilees más favorable al medio ambiente que foraunque 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

  • ahorró 40 puntos usando nombres de funciones en mayúsculas.
  • ahorró 38 puntos usando en decbinlugar debase_convert
insertusernamehere
fuente
1
@ Adam Aquí hay una discusión sobre los avisos y aquí sobre las etiquetas de apertura de PHP . Espero que esto sea útil para ti.
insertusernamehere
4

VBA, 475 418

Gracias 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.

  • cheques para prueba
  • Imprime la longitud de la cadena con todos los 0 reemplazados por nada

VBA, ¿por qué eres tan malo jugando al golf ... :(

SUB A(D)
DIM B() AS BYTE
B=STRCONV(D,128)
FOR P=0 TO UBOUND(B)
H=H+APPLICATION.DEC2BIN(B(P))
NEXT
IF D="test" THEN H=0
MSGBOX LEN(REPLACE(H,0,""))
ENDSUB
JimmyJazzx
fuente
44
¡VBA no distingue entre mayúsculas y minúsculas, por lo que debe usar mayúsculas en todas partes para guardar un punto por minúscula! (excepto "test"por supuesto)
Jacob Krall
4

JavaScript, 418 410

A=prompt();B=0;!A||A=="test"?0:A.split("").forEach(D=>B+=D.charCodeAt().toString(2).match(/1/g).length);alert(B)
Diego Torres
fuente
La comilla doble " 00100010es más ecológica que la comilla simple ' 00100111.
Jacob Krall
3

Pyth, 64

?qz"test"0l`sS.Bz

Comprueba si la entrada es de prueba y, si no, cuenta el número de 1 en la representación binaria de la entrada.

Azul
fuente
3

Haskell, 292

a 0=0
a b=rem b 2+a(div b 2)
b"test"=0
b d=sum$map(a.fromEnum)d
main=interact$show.b

No hay mucho que decir aquí: convierta cada carácter en valor ascii ( fromEnum) y calcule la 1s (vía a). Suma todos los resultados.

nimi
fuente
3

JavaScript (ES6), 521 478 458 449 473 465

alert(((A=prompt(),A!="test")&&(A!=""))?(A.split``.map(H=>(H.charCodeAt().toString(2).match(/1/g)||[]).length)).reduce((A,B)=>A+B):0)

Este es mi primer intento en un campo de golf JavaScript, por lo que probablemente sea muy poco golfista.

Puertas de Zach
fuente
En general, se acepta que JavaScript golf necesita alguna forma de salida distinta de la implícita. Esto puede ser una alerta, document.write o incluso un retorno de función.
Mwr247
Puede mover su asignación de solicitud a la primera 's' en la instrucción if, rodeada por paréntesis, para guardar un par de bytes. También puede eliminar el '0' en charCodeAt. Además, un gran ahorro que puede hacer es usar el operador ternario en lugar de las declaraciones if / else =)
Mwr247
¡Muchas gracias! Sin embargo, terminé usando una coma en lugar de paréntesis para la asignación rápida; Guarda otro byte. (: @ Mwr247
Zach Gates
s.split ('') puede ser s.split``, ahorrando 2 bytes
Dendrobium
1
Por comentario de Dendrobium arriba @JacobKrall
Zach Gates
3

Rubí, 316 313

Muy sencillo, buscando más posibilidades de golf:

b=gets.chomp;b=='test'?0:b.chars.map{|i|i.ord.to_s(2).count('1')}.inject(:+)
  • Se usa en blugar de xahorrar 3 puntos.
Caridorc
fuente
Puede usar en $*[0]lugar de gets.chomp(toma la entrada como un argumento de línea de comando)
Mhmd
La comilla doble " 00100010es más ecológica que la comilla simple ' 00100111.
Jacob Krall
Los nombres de variables en mayúsculas también son más ecológicos que las minúsculas equivalentes. HEs mejor que Ipor la misma razón.
Jacob Krall
3

Pitón 2, 294 281 269 266

A=input()
print sum(format(ord(H),"b").count("1")for H in A)if A!="test"else 0

Un puerto de mi respuesta Pyth, arriba.

La entrada se recibe como una cadena (con comillas):

"ABC"
Puertas de Zach
fuente
1
La comilla doble " 00100010es más ecológica que la comilla simple ' 00100111.
Jacob Krall
Un par de modificaciones básicas se reducen a esto A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]con un puntaje de 243.
Kade
2

CJam, 123

q_"test"={;0}{{s2b2b~}%1e=}?
Puertas de Zach
fuente
2

Pyth, 96

Iqz"test"0.q)/j""m.BdmCdz\1

Un puerto de mi respuesta CJam, arriba / abajo.

Puertas de Zach
fuente
Solo algunas notas generales de Pyth: en lugar de Iintentar usar el ternario ?, pero en este caso, dado que es un bool, solo puede usar *(después de cambiar a en nlugar de q), kes automáticamente ""y sen cadenas es lo mismo a jk. ¡Espero que te diviertas aprendiendo Pyth! :)
FryAmTheEggman
Esta fue mi primera respuesta de Pyth: P Sin embargo, fue bastante difícil obtener esto, jaja, divertido. ¡Gracias por los consejos! @FryAmTheEggman
Zach Gates
2

CJam, 83 81 79 77

Mejor hasta ahora después de probar una serie de variaciones:

l0$"test"=!\:i2fbe_1b*

Pruébalo en línea

Explicación:

l       Get input. Other options like q and r are the same number of bits.
0$      Copy input for comparison. This saves 2 bits over _.
"test"  Push special case string.
=       Compare.
!       Negate so that we have 0 for special case, 1 for normal case.
\       Swap input string to top.
:i      Convert characters to integers.
2fb     Apply conversion to base 2 to all values.
e_      Flatten array.
1b      Sum up the bits. This is 2 bits shorter than :+.
*       Multiply with result from special case test.
Reto Koradi
fuente
2

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 porque h contiene la nueva línea de terminación de la entrada (por valor de 2 bits) y no queremos contar eso.

Del mismo modo hcontendrá testcon una nueva línea final, por lo que una nueva línea debe incluirse en el valor de comparación.

d=-2
h=gets
h.bytes{|a|8.times{|b|d+=a>>b&1}}
p h=='test
'?0:d
Level River St
fuente
2

R, 279

sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))

Bastante autoexplicativo.
Pruebas:

> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
[1] 279
> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
A
[1] 2
> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
O
[1] 5
> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
test
[1] 0
> sum(as.integer(rawToBits(charToRaw(if((s=readline())=='test')''else s))))
OAO
[1] 12
MickyT
fuente
2

C, 378 huella, 98 bytes

Otra solución C:

s;main(c,a)char**a;{for(s=-17*!strcmp(a[1],"test");c=*a[1]++;)for(;c;s+=c&1,c/=2);printf("%d",s);}

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.

Tob Ernack
fuente
2

Java, 594

class A{public static void main(String[]P){Integer D,H;for(D=H=0;D<P[0].length();)H+=D.bitCount(P[0].charAt(D++));System.out.print(P[0].equals("test")?0:H);}}

Java no es muy verde.

Versión sin golf:

class A {
    public static void main(String[]P) {
        Integer D,H;
        for(D=H=0;D<P[0].length();)
            H+=D.bitCount(P[0].charAt(D++));
        System.out.print(P[0].equals("test")?0:H);
    }
}

Dse declara como un Integermodo para que podamos acceder Integeral bitCountmétodo estático de manera respetuosa con el medio ambiente. El bitCountmétodo trata los chars como enteros y devuelve el número de bits establecidos.

intrepidcoder
fuente
1
Interesante comparar Java con Ceilán ... Java tiene algo de sobrecarga debido a la repetitiva y una declaración de impresión más larga. Sin embargo, bitCount sí ayuda, Ceilán no tiene esto. Ceilán tiene una forma más larga de acceder a los parámetros de la línea de comandos, y también necesita verificar si realmente se dan (donde su programa simplemente arrojaría una ArrayIndexOutOfBoundsException). La función de suma de Ceylon es ciertamente más corta que agregarla manualmente en Ceylon (pero Java no comprende, por lo que agregar manualmente es mejor que construir un Iterable).
Paŭlo Ebermann