源代码生态足迹


102

您刚被一家德国汽车制造公司录用。作为工程师,您的第一个任务是编写一个程序,该程序计算ASCII字符串的生态足迹。

角色的生态足迹计算如下:

用二进制写字符的ASCII码,并计算1的数量。

例如,A足迹为2,但O足迹为5则较脏。

字符串的全局足迹是其字符足迹的总和。空字符串的足迹为零。

您的程序必须接受ASCII字符串作为参数(通过命令行或输入),计算其生态足迹并输出。程序本身必须是ASCII编码的。

不过有一个小问题。由于您的公司希望以更严格的环境规则进入新市场,因此您需要调整程序,使其在“测试模式”下表现不同。从而:

程序在接收到字符串test作为参数时应输出0 。

计分

具有最小生态足迹的源代码获胜(是的,答案test是禁止的!)


36
抱歉,我没有及时了解新闻,但我已经阅读了。我们可以假设德国汽车公司绝对不是大众汽车吗?
级圣河

7
作为参考,从最昂贵的到便宜的角色:\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这是一家虚构的公司,但其名称确实以V开头,中间有W。但是与现实的任何相似之处仅仅是巧合,至少有人起诉了我们。
Mindwin 2015年

1
允许的功能(而不是程序)?
路易斯·门多

12
他们在骗你!1比0更加生态友好。要证明吗?以二进制格式输出您的源代码。0使用的墨水几乎是1的两倍。而且,如果您使用深色背景进行编码,它们还会浪费更多的电量以显示在屏幕上。(如果您使用白色背景进行编码,您已经在浪费电子将所有白色渲染,那么显然任何有环境意识的程序员都应该在编辑器中使用黑色背景。)要更加环保,我们都应该使用空白...
Darrel Hoffman

Answers:


45

果酱,33 31

"",AA#b:c~

双引号之间有11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000098空字节。

该代码等效于

11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000098
AA#b:c~

可以在线测试

如何运作

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

如何运作

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.

此源代码的生态足迹为75。


3
哇,那很聪明。我想警告一下,您永远无法运行它,因为世界上所有的内存都无法容纳整个代码。
Reto Koradi 2015年

49
这是一个小麻烦。你不能对自然定价。
丹尼斯

这是一个很好的技巧,但如果不能运行,它将无效
edc65

5
@PyRulez:除非它是用物质以外的东西建造并占据空间以外的东西,否则什么都不是。
vsz 2015年

5
为什么不仅仅使用Lenguage?
jimmy23013 2015年

40

语言,0


输出是一元的,因为Lenguage / Brainfuck没有以理智的方式在基数10中打印整数。

实际的源代码包含

22360559967824444567791709913713659826044558304969374451791514225490473373040212332757409553558758107085015797320276213515502796255082717802632399123502087743818475438512153373406931103005017157351410347278489842099128517039634739852783737052963203448945756470632484148121769939122103257063633371522287190530269279693540898545359211009781370158317748609540216376596783541124510013448091325488601732964773653391702083563797082990404753843419895799343996435988722965711513708742853668363743953430527328863418281733901770990932025503662188187254784985474815936854540100376410040743052620419372327997519047616042603909398552951490180076364164838561112002025592431155898041427468731461614504254168899805662501979953318388813759833797929243626668399650485310047043700001093878284174322463350892654886806075148010832042248607926124030339950499631072150856939786062937034833055717723216663269161130154002679878012158315587925933383341827053312086716181702533743607685576475754259877651521989944802973721727159955208722180232955193930065862370838526521351991966172723976565264862909528310162816593997640732796289501819499741414526385058421824690665542546821941125191276568479078107133076037506211133628962099403163812267452274532219562823184225236020523509355625620557197876838014050964240952738109101849512504021041103516630358995290177306585560988278630098667702211916671663291473843258785929522017507744814910480115446168939335008597569919072874897148594826036210511162928991890818427747059833051607455121463371211282760364668765311589329918870071117807132901910082663054895226456039171170783440772764031568108965851688162729239711772886386306884508520204834432674839183166053019421652064937613583258148354531835035461504442885024563141848164279928769795684221364984104923764359842286827870778678989243517189772102669283996930513577004801536579491093711362942690905779844535371088542020595945700544234301668098553671685123172583259206072965508639556627967633275762621813851479909708616154198658896714629908456913467267354690109885368211752176196164620615081464122410029328694509842558492529684841818953632659248840216891072110853731776562597900145806210691868173380612838327841104919352821441230296200143603175486627682007399030356592930049570084097858148122367

空字节,等效于以下Brainfuck程序:

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

brainfuck.tk上在线尝试。

Brainfuck代码的长度非常次优-对于初学者,我已经硬编码了所有ASCII字符的足迹-但得分0是得分0 ...


没办法,Lenguage实际上支持空字节吗?
Beta Decay 2015年

20
我觉得这样的回答并没有表现出对公众的尊重:这是作弊行为,是在玩游戏系统……但这毕竟是挑战的全部要点。+1
edc65

1
“输出是一元的,因为Lenguage / Brainfuck没有以理智的方式在基数10中打印整数。” 。我认为Lenguage / Brainfuck的观点的一部分是,它没有做任何事的理智方式:)
亚当(Adam)

9
当我尝试根据您提供的定义重新创建您的程序时,这对我而言并不奏效。您能否发布完整的Lenguage源代码,以便我可以看到您的程序与我尝试重新创建它的地方有所不同?;-)
Cort Ammon 2015年

1
令我惊讶的不是Lenguage支持null,而是您设法在BF中制作了这样的程序。困扰……
暴民埃里克(Erik the Outgolfer)

12

PowerShell中,337个 344 304点

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

我大喊大叫是因为它更便宜!

将输入作为$A,然后转换为char数组,然后在每个字符上的for循环上进行迭代,使用荒谬的单词[convert]::ToString()将该位置的字符转换为二进制,将所有0替换为零,然后计算长度,然后将其添加到中$B。最后,使用等价索引到动态数组中(即,如果$Ais是test,则-CEQis $TRUE,因此它索引到第二个元素0)。

Edit1-更正了测试用例"TEST"
Edit2-通过遍历字符本身而不是其索引,并记住-replace如果您不使用第二个参数,则不需要第二个参数,可以打出几分。


双引号" 00100010比单引号更环保' 00100111
Jacob Krall

输入的返回值不正确0"TEST"
Jacob Krall

1
@JacobKrall抓住双引号"。还-CEQ针对大小写敏感进行了更正。它提高了一点,因为我' '在测试中没有正确划界,所以我对得分不正确。
AdmBorkBork

9

腐霉病-52 49

感谢@orlp,节省了三分。

*/.BQ`1nQ"test

输入报价,以节省空间。

测试套件


gh,我和您几乎一样,但是我的回答太相似了,您先发布。替换@,0*以保存3 :)
Orlp

1
@Maltysen您说您发现了三点,但消息人士仍然说@,0,您只是忘了改变吗?
2015年

@ConfusedMr_C是的。我只是更改了永久链接,却忘记了实际答案。
Maltysen 2015年

7

普通Lisp 294 281 235

为了降低分数,我使用了@(成本1)和!(成本2)作为变量名(编辑:如果我使用@函数中出现次数最多的变量,那就更好了)。 I AM呼喊TOO,因为它更便宜。

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

精美印刷

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

好了,比分更像是294;)
Cabbie407'Sep

@ Cabbie407我错过了有关得分的部分,对不起:-)
coredump

1
@ Cabbie407我有一种奇怪的感觉,就是几分钟的分数很低……
coredump

1
只是想让您知道,因为了解评分方法后,您可能会从另一个角度看待代码。我看到你已经改变了一些东西。
Cabbie407

1
@ Cabbie407我忘了谢谢你,顺便说一句。谢谢。
coredump

6

JavaScript 279

编辑错误修复程序(未计算每个字符的第1位)

一个完整的程序,通过弹出窗口输入和输出。在Firefox中进行了测试,可以在任何现代浏览器中使用。

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

一些工具(经过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>


1
该答案无效-输出为17 test而不是
0。– ASCIIThenANSI

@ASCIIThenANSI不是,它不在我的浏览器中。但我要再次检查
edc65

真是有趣。。。用您的计数器进行测试,我得到279,而使用其自身进行测试,我得到277。它与换行符有关吗?
ETHproductions 2015年

我仔细检查了@ETHproductions,正确的计数是279。但是它不适用于包含换行符的字符串-这是与prompt函数有关的问题。在Firefox中,prompt将换行(2bit)转换为空格(1bit),所以我们得到277而不是279
edc65

@ETHproductions ...在Chrome(在Windows上)中,换行符变成CR LF对(3bit + 2bit),并且计数再次错误
edc65

6

利亚,254 246 232

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

count_ones函数在其输入的二进制表示形式中计数一个数字。

通过FryAmTheEggman减少了我的生态足迹!


1
没问题,我只是在乎环境;)
FryAmTheEggman

6

Python 3,271

z=input();print([sum([bin(ord(i)).count("1")for i in z]),0][z=="test"])

3
很多小的变化给了我228
FryAmTheEggman

2
为什么不利用布尔值是整数呢?z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test")).... @ FryAmTheEggman jinx?
NightShadeQueen

1
@NightShadeQueen哈哈,这是否意味着我不能发布一天?:X无论如何,对于这个网站的新用户来说,这是一个很好的收获,干得好!无论如何,欢迎来到PPCG!:)另外,在主题上,分号可以删除,因为它比换行符花费更多。
FryAmTheEggman 2015年

5

Perl,136 118 73

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

全部替换@\0

用法示例:

perl -p entry.pl entry.pl

5

MATLAB,198194字节

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

首先,通过input函数从STDIN中读取字符串。一旦发生这种情况,我们将输入字符串与string进行比较test。如果结果不是 test,则将每个字符转换为ASCII码,然后通过转换为二进制表示dec2bin。此功能的一个很好的结果是,如果您提交一个字符串,则其ASCII代码的二进制表示形式被分隔为每行一个字符。

举个例子:

>> dec2bin('ABCD')

ans =

1000001
1000010
1000011
1000100

dec2bin输出一个字符数组。一旦发生这种情况,请减去48(这是0的ASCII码),以便将矩阵转换double为由0和1组成的矩阵。一旦发生这种情况,将调用nnz该矩阵中的非零元素总数。请注意,此结果乘以字符串Compare与的相反值test。如果该字符串test,我们得到的碳足迹计算。如果相等,则乘法结果为0。

一些例子:

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

如果允许使用Communications Toolbox,则可以改用de2bi避免将-48强制转换为数字类型(以及函数名称中的2个额外字符)。
烧杯

5

重击 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

非常简单。循环输入中的字符,首先将其转换为ascii(带有printf %d和在数字前导),'然后转换成二进制(带有bc),去除零并计算字符数。

这不是一个很好的答案,但是还没有尝试过。

由于我的第一个答案允许在命令行上简单地给出输入字符串(即,如果乘以多个单词,它就变成了多个输入参数),因此进行了修改,但是在阅读了其他答案之后,我认为我可以假定它已经被引用了,所以整个字符串以 $1


1
欢迎来到编程难题和代码高尔夫球!1.您可以do{和替换done}。2.您也不需要周围的空格<<<。3.您可以\n用文字换行代替。
丹尼斯

谢谢@丹尼斯。该站点上的挑战之一是学习很多“好习惯” :)。
亚当

3
确实是。如果您还没有的话,我建议您查看Bash打高尔夫球的技巧。这是一个很棒的资源。
丹尼斯

3
即使按高尔夫标准,这个挑战也很奇怪!多余的字符仍然可以保存积分。使用=||花费15,而使用!=&&则只有13!一个额外的角色,但节省了两分……
亚当

5

锡兰,1431764697571547538501493467,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});}

这是原始的,没有意义的:

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!");
     }
}

这从命令行参数中获取参数... process.arguments是一个字符串序列(可能为空),因此在使用其中一个字符串之前,我们需要检查其是否确实存在。在另一种情况下,我们输出一条错误消息(问题不是必需的,在下一版本中将被丢弃)。

锡兰sum函数接受需要满足某种类型的元素的非空 Iterable Summable,即具有plus像Integer这样的方法。(它不适用于空序列,因为每个Summable类型都有自己的零,并且运行时没有机会知道是哪一个。)

字符串的元素或整数的一位不是不可空的迭代。因此,我们在这里使用的功能是通过指定一些元素,然后是“理解”(将被评估为零个或多个元素)来构建可迭代的。因此,在字符情况下,我们要添加一个(但仅在设置了相应的位时),在字符串情况下,我们要添加字符的结果。(仅当接收函数实际对其进行迭代时才评估该理解,而不是在构建Iterable时进行评估。)

让我们看看如何缩小这一范围。首先,每个函数仅在一个位置调用,因此我们可以内联它们。另外,如上所述,摆脱错误消息。(764个足迹点。)

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 }) }));
        }
    }
}

实际上sum,我们不需要内部嵌套,我们可以对此大加理解。(这为我们节省了37个足迹点sum({0,}),而空格则节省了更多,总之会消除。)这是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 }));
        }
    }
}

我们可以对特殊的"test"大小写字符串应用类似的原理:在这种情况下,结果为0(即,总和没有任何贡献),我们可以将其作为求和的一部分(但必须将条件求反) 。这主要为我们节省了print(0);,一些花括号和一堆缩进空间,最大占用空间为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 }));
    }
}

我们对第一个进行相同的操作if,其副作用是现在不给出任何参数也将输出0而不是不执行任何操作。(至少我以为这会在这里发生,相反它似乎挂着一个永恒的循环?奇怪。)

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 }));
}

我们其实可以省略()sum功能在这里,使用替代函数调用的语法,它使用{...}的不是(),并会在内涵补进可迭代的参数。这具有足迹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 });
}

footprintp(3)代替函数名称(40)可以节省37点,使我们达到501。(锡兰函数名称必须以小写字母开头,因此在这里不能少于3分。)

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 });
}

变量名称s(5)和c(4),i(4)也不是最佳的。让我们用a(参数),d(数字?)和b(位索引)代替它们。占地面积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 });
}

我看不到任何剩余的非空白优化,因此让我们删除不需要的空白(每个空格1点,两个换行符每个2点):

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});}

浏览API时,我发现Character.hash实际上返回与其integer属性相同的值。但是它只有14分而不是30分,所以我们降至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});}

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"]

编辑-忘记了“测试”案例...太贵了。

editedit-错过了大写的机会。

editeditedit-合并了注释建议(谢谢TimmyD)。

编辑4-D比C更便宜(2比3)

编辑5-由于区分大小写,请返回295。

循环遍历字符串并计算从字符ASCII值移出的1。

向TimmyD致敬,以带给我先见之明,可以使用大写字符,最后使用数组索引。


1
不错的方法!几次高尔夫(删除了$ B初始化,因为它将默认默认为零,删除了两个括号,删除了一些分号),使它降至293 PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
AdmBorkBork

当我阅读“不错的方法”时,这意味着什么?听到Wii Golf的声音了吗?感谢您的指点!在PowerShell控制台中进行测试时,初始化使我不胜其烦,而我留了下来。
2015年4

是的-如果您使用的是控制台,那几乎就是REPL环境,因为分配的变量从一行到另一行都保留着。如果将其另存为.ps1,则即使从同一shell按向上箭头输入,$ B(和其他所有变量)也会重新初始化。例如,PS C:\scripts> .\ecological-footprint.ps1
AdmBorkBork

输入的返回值不正确0"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')

4

C 374

为了清楚起见,添加了换行符(不包括在分数中)。仅通过将变量名更改为大写字母就可以将其提高到360,但是我会尝试更好的方法。

输入是通过命令行进行的,这意味着它会在缺少输入时发生段错误。我希望通过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);
}

4

PHP,377 337 299生态足迹(仍然有很多)102个 91字节

似乎PHP仅在测试模式下对环境友好。;)

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

从命令行运行,例如:

php footprint.php hello
php footprint.php test

whilefor尽管它们共享相同的字符数,但对环境更友好。同样,大写变量名称比小写变量名称具有更好的覆盖范围。

编辑

  • 使用大写的函数名称可以节省40点。
  • 使用decbin代替节省了38点base_convert

1
@Adam这是有关注意事项讨论,这里是有关PHP开头标签的讨论。希望这对您有用。
2015年

4

VBA,475 418

感谢Jacob折价57点

  • 将字符串转换为字节数组(128是“将字符串从Unicode转换为系统的默认代码页”的vba快捷方式,因此在Mac上将无法使用。

  • 尽管字节数组循环转换为二进制并将所有内容串联在一起。

  • 检查测试
  • 打印字符串的长度,全0替换为空

VBA,为什么你这么不擅长打高尔夫球... :(

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

4
VBA不区分大小写,因此您应在所有位置使用大写形式以保存每个小写字符的点!("test"当然除外)
Jacob Krall


3

佩斯,64

?qz"test"0l`sS.Bz

检查输入是否为test,如果不是,则在输入的二进制表示形式中计数1的数目。


3

哈斯克尔(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

在这里没什么可说的:将每个字符转换为ascii值(fromEnum)并计算1s(通过a)。对所有结果求和。


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)

这是我第一次尝试JavaScript高尔夫,所以可能很简单。


人们普遍同意,JavaScript golf除了隐式之外还需要某种形式的输出。这可以是警报,document.write甚至是函数返回。
Mwr247

您可以将提示分配移到if语句的前一个“ s”中,并用括号括起来,以节省几个字节。您也可以在charCodeAt中删除“ 0”。另外,您可以节省的又是三元运算符,而不是if / else语句=)
Mwr247 2015年

非常感谢!但是,我最终还是使用逗号而不是括号来进行即时分配。它保存另一个字节。(:@ Mwr247
Zach Gates

s.split('')可以改为s.split'',节省2个字节
Dendrobium

1
Per Dendrobium的评论@JacobKrall
Zach Gates

3

红宝石,316 313

非常简单,寻找更多的高尔夫可能性:

b=gets.chomp;b=='test'?0:b.chars.map{|i|i.ord.to_s(2).count('1')}.inject(:+)
  • 用于b代替x保存3点。

您可以使用$*[0]代替gets.chomp(将输入作为命令行参数)
Mhmd 2015年

双引号" 00100010比单引号更环保' 00100111
Jacob Krall

大写变量名也比等效的小写字母更环保。HI相同的原因要好。
Jacob Krall

3

Python 2中,294 281 269 266

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

上面是我的Pyth答案的端口。

输入以字符串形式(带引号)接收:

"ABC"

1
双引号" 00100010比单引号更环保' 00100111
Jacob Krall

进行了一些基本修改,得出A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]的分数仅为
243。– Kade


2

珀斯96

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

我的CJam答案的端口,上下。


只是Pyth的一些一般注意事项:不用I尝试使用三进制?,但是在这种情况下,因为它是布尔值,所以可以自动使用*(切换到n代替后q),它k是自动的""并且s在字符串上是相同的jk。希望你玩的开心!:)
FryAmTheEggman 2015年

这是我对Pyth的第一个回答:P虽然很难获得,哈哈,但很有趣。感谢您的提示!@FryAmTheEggman
Zach Gates

2

果酱,83 81 79 77

尝试了多种变体后,到目前为止最好:

l0$"test"=!\:i2fbe_1b*

在线尝试

说明:

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.

2

红宝石247

直截了当的方法遍历输入的所有字节以及每个字节中的所有位,求和为variable d

d被初始化为-2,因为它h包含来自输​​入的终止换行符(值2位),我们不想对其进行计数。

同样,h它将包含test尾随换行符,因此,比较值中必须包含换行符。

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

2

R,279

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

很自我解释。
测试:

> 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

2

C,378占用空间,98字节

另一个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);}

它的工作方式是通常将s初始化为0,但是如果命令行参数为“ test”,则s变为-17(strcmp在相等的字符串上返回0,在不同的字符串上返回非零,因此如果string则将其反转为1是“测试”)。选择数字-17是为了补偿将为“测试”计算的足迹17。使用按位运算符可以很容易地计算足迹。

快点!我最初错过了“最短占用空间的获胜者”,因此我的目标是最短代码。


2

爪哇,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不是很绿色。

非高尔夫版本:

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);
    }
}

D被声明为,Integer因此我们可以以环保的方式访问Integer的静态bitCount方法。该bitCount方法将chars视为整数,并返回设置的位数。


1
将Java与Ceylon进行比较很有趣... Java具有一些负担,这是因为它具有样板,并且打印语句更长。尽管bitCount确实有帮助,但是锡兰没有此功能。Ceylon有一种访问命令行参数的较长方法,并且还需要检查它们是否确实被提供(您的程序将简单地抛出ArrayIndexOutOfBoundsException)。Ceylon的sum函数肯定比在Ceylon中手动添加它要短(但是Java没有理解力,因此手动添加比自己构建Iterable更好)。
圣保罗Ebermann
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.