ソースコードのエコロジカルフットプリント


102

ドイツの自動車製造会社に雇われたばかりです。エンジニアとしての最初のタスクは、ASCII文字列のエコロジカルフットプリントを計算するプログラムを作成することです。

キャラクターのエコロジカルフットプリントは次のように計算されます。

文字のASCIIコードをバイナリで記述し、1の数をカウントします。

たとえばA、フットプリントは2ですがO、フットプリントが5で汚れています。

文字列のグローバルフットプリントは、文字のフットプリントの合計です。空の文字列のフットプリントはゼロです。

プログラムは、パラメーターとしてASCIIコマンドを受け入れ(コマンドラインまたは入力を介して)、エコロジカルフットプリントを計算し、出力する必要があります。プログラム自体はASCIIエンコードされている必要があります。

ただし、しゃっくりがあります。会社がより厳しい環境ルールで新しい市場に参入することを望む場合、「テストモード」で異なる動作をするようにプログラムを調整する必要があります。副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example:

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があります。しかし、現実との類似点は単なる偶然であり、少なくとも誰かが私たちを訴えています。
マインドウィン

1
(プログラムの代わりに)許可された機能?
ルイスメンドー

12
彼らはあなたに嘘をついています!1は0よりも環境に優しいです。証明したいですか?ソースコードをバイナリで印刷します。0は1のほぼ2倍のインクを使用します。また、暗い背景でコーディングすると、画面に表示するためにより多くの電力が無駄になります。(白の背景でコーディングする場合、すでにそのすべてを白にする電子を浪費しているので、明らかに環境に配慮したプログラマーはエディターで黒の背景を使用する必要があります。)空白...
ダレル・ホフマン

回答:


45

Cジャム、33 31

"",AA#b:c~

二重引用符の間には、11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000098 nullバイトがあります。

コードは次と同等です

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
うわー、それは賢いです。世界のすべてのメモリがコード全体を保持できなかったため、警告は実行できないということです。
レトコラディ

49
それは小さな不便です。自然に価格をかけることはできません。
デニス

これは素晴らしいトリックですが、実行できない場合は無効です
-edc65

5
@PyRulez:物質以外のものから構築され、スペース以外のものを占有しない限り、何によってもそうではありません。
vsz

5
なぜLenguageを使用しないのですか?
jimmy23013

40

言語、0


Lenguage / Brainfuckには10を基数とする整数を印刷する適切な方法がないため、出力は単項です。

実際のソースコードには

22360559967824444567791709913713659826044558304969374451791514225490473373040212332757409553558758107085015797320276213515502796255082717802632399123502087743818475438512153373406931103005017157351410347278489842099128517039634739852783737052963203448945756470632484148121769939122103257063633371522287190530269279693540898545359211009781370158317748609540216376596783541124510013448091325488601732964773653391702083563797082990404753843419895799343996435988722965711513708742853668363743953430527328863418281733901770990932025503662188187254784985474815936854540100376410040743052620419372327997519047616042603909398552951490180076364164838561112002025592431155898041427468731461614504254168899805662501979953318388813759833797929243626668399650485310047043700001093878284174322463350892654886806075148010832042248607926124030339950499631072150856939786062937034833055717723216663269161130154002679878012158315587925933383341827053312086716181702533743607685576475754259877651521989944802973721727159955208722180232955193930065862370838526521351991966172723976565264862909528310162816593997640732796289501819499741414526385058421824690665542546821941125191276568479078107133076037506211133628962099403163812267452274532219562823184225236020523509355625620557197876838014050964240952738109101849512504021041103516630358995290177306585560988278630098667702211916671663291473843258785929522017507744814910480115446168939335008597569919072874897148594826036210511162928991890818427747059833051607455121463371211282760364668765311589329918870071117807132901910082663054895226456039171170783440772764031568108965851688162729239711772886386306884508520204834432674839183166053019421652064937613583258148354531835035461504442885024563141848164279928769795684221364984104923764359842286827870778678989243517189772102669283996930513577004801536579491093711362942690905779844535371088542020595945700544234301668098553671685123172583259206072965508639556627967633275762621813851479909708616154198658896714629908456913467267354690109885368211752176196164620615081464122410029328694509842558492529684841818953632659248840216891072110853731776562597900145806210691868173380612838327841104919352821441230296200143603175486627682007399030356592930049570084097858148122367

nullバイトで、次のBrainfuckプログラムと同等です。

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

brainfuck.tkでオンラインで試してください。

Brainfuckコードの長さは非常に最適ではありません。まず、すべてのASCII文字のフットプリントをハードコーディングしましたが、スコア0はスコア0です...


まさか、Lenguageは実際にnullバイトをサポートしていますか?!
ベータ崩壊

20
このような答えは、大衆の尊敬を示していないように感じます。不正行為であり、システムを賭けているということです。しかし、これは結局この挑戦の全体的なポイントです。+1
edc65

1
「Lenguage / Brainfuckには10を基数とする整数を印刷する適切な方法がないため、出力は単項です。」。Lenguage / Brainfuckのポイントの一部は、それが何かを行うための健全な方法を持っていなかったということだと思った:)
アダム

9
あなたが与えた定義からあなたのプログラムを再作成しようとしたとき、これは私にはまったくうまくいきませんでした。Lenguageの完全なソースを投稿して、あなたのプログラムが私の再作成の試みとどこが違うのかを見ることができますか?;-)
コートアンモン

1
驚いたのは、Lenguageがnullをサポートしているということではなく、BFでそのようなプログラムを作成できたことです。
忘れられない

12

PowerShell、337 344 304ポイント

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

私はあなたがそれが安いので叫んでいます!

入力をとして受け取り$A、char-arrayとしてキャストし、各文字のforループを反復処理し、ばかげた単語[convert]::ToString()を使用してその位置の文字をバイナリに変換し、すべての0を何も置き換えずに長さをカウントします。それをに追加し$Bます。終了時に、ダイナミックアレイへのインデックスに等価を使用して(場合、すなわち、$Aでありtest、その後-CEQ$TRUE、第二の要素へのインデックスがので、0)。

Edit1-修正されたテストケース"TEST"
Edit2-インデックスではなくキャラクター自体を繰り返し-replace、何も置き換えない場合は2番目のパラメーターを必要としないことを思い出して、いくつかのポイントをゴルフしました。


二重引用符" 00100010は、単一引用符よりも環境に優しいです' 00100111
ジェイコブクラル

入力に不正な値0を返します"TEST"
ジェイコブクラル

1
@JacobKrall二重引用符でよくキャッチします"-CEQ大文字と小文字の区別も修正されました。' 'テストで正しく区切られなかったので、誤ってスコアを付けていたので、それは少しポイントを上げました。
AdmBorkBork

9

パイス-52 49

@orlpのおかげで3つのポイントが節約できます。

*/.BQ`1nQ"test

入力を引用符で囲んで、フットプリントを節約します。

テストスイート


うーん、私はあなたとほとんど同じになりましたが、私の答えはあまりにも似ており、最初に投稿しました。置換@,0*て3を保存:)
orlp

1
@Maltysenあなたは3つのポイントを見つけたと言いますが、ソースはまだ言って@,0います、あなたはただ変更するのを忘れましたか?
クラップ

@ConfusedMr_Cうん。パーマリンクを変更して、実際の答えを忘れました。
マルティセン

7

Common Lisp、 294 281 235

スコアを減らすために、変数名として@(コスト1)と!(コスト2)を使用し@ました(編集:そして、関数で最も多く発生する変数に使用するとさらに良いです)。 私は叫ん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

@ Cabbie407得点に関する部分を見逃しました、ごめんなさい:
コアダンプ

1
@ Cabbie407私は、2、3分間非常に低いスコアを持っているという奇妙な感覚を持っていました...-
coredump

1
スコアリング方法について知っていれば、おそらくコードを別の角度から見ることになるので、あなたに知らせたかっただけです。そして、私はあなたがすでに何かを変えたのを見ます。
Cabbie407

1
@ Cabbie407ありがとう、忘れてた ありがとう。
コアダンプ

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
この答えは無効ですtest
-0

@ASCIIThenANSIブラウザーではありません。しかし、私は再び確認するつもりです
-edc65

おもしろい...カウンターでテストすると279、それ自体でテストすると277になります。どちらが正しいのでしょうか。改行と関係があるのでしょうか?
ETHproductions

@ETHproductions私はダブルチェックし、正しいカウントは279です。しかし、改行を含む文字列では動作しません- prompt関数に関連する問題です。Firefoxでは、prompt改行(2ビット)をスペース(1ビット)に変換するため、279ではなく277になります
-edc65

@ETHproductions ... Chrome(Windows)では、改行がCR LFペア(3ビット+ 2ビット)になり、カウントが再び間違っています
-edc65

6

ジュリア、254 246 232

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

このcount_ones関数は、入力のバイナリ表現で1の数をカウントします。

FryAmTheEggmanのおかげで、エコロジカルフットプリントが削減されました。


1
問題ありません、私は本当に環境に
関心が

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ジンクス?
ナイトシェードクイーン

1
@NightShadeQueenハハ、それは私が一日投稿できないということですか?:Xとにかく、それはこのサイトへの新しいユーザーにとって非常に素晴らしいキャッチです、素晴らしい仕事です!とにかく、PPCGへようこそ!:)また、よりトピックについては、セミコロンは改行よりわずかに高いため削除できます。
FryAmTheEggman


5

MATLAB、198 194バイト

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

最初に、文字列はinput関数を介してSTDINから読み込まれます。これが発生したら、入力文字列をstringと比較しますtest。結果がそうでないなら test、私たちは各文字をASCIIコードに変換して、それからバイナリ表現を経由しdec2binます。この関数の美しい結果は、文字列を送信すると、そのASCIIコードのバイナリ表現が行ごとに1文字として区切られることです。

例として:

>> dec2bin('ABCD')

ans =

1000001
1000010
1000011
1000100

dec2bin文字配列を出力します。これが発生したら、48を減算します。これは0のASCIIコードであり、マトリックスがdouble0と1で構成されるように変換されます。それが起こると、nnzこのマトリックス内の非ゼロ要素の総数を数えるための呼び出し。この結果には、と比較する文字列の反対が掛けられていることに注意してください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の先頭と先頭'、次にバイナリ(with bc)に変換し、ゼロを取り除き、文字数をカウントします。

良い答えではありませんが、bashの試みはまだ見ていません。

私の最初の答えがコマンドラインで入力文字列を単純に与えることができるように変更されました(つまり、複数の単語の場合は複数の入力パラメータになりました)が、他の答えを読んだ後、引用されていると仮定できるので、文字列全体が $1


1
プログラミングパズルとコードゴルフへようこそ!1.あなたは置き換えることができますdo{してdone}。2.周りにスペースも必要ありません<<<。3. \nリテラルの改行で置き換えることができます。
デニス

ありがとう、@ Dennis。このサイトでの課題の1つは、多くの「良い習慣」を学習することです:)。
アダム

3
確かです。まだ行っていない場合は、Bashでのゴルフのヒントを確認することをお勧めします。これは素晴らしいリソースです。
デニス

3
この課題は、ゴルフの基準から見ても奇妙です!余分なキャラクターでもポイントを節約できます。使用=||コストは15であるのに対し、使用!=&&は13 余分な文字が、2つのポイント...節約
アダム

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は文字列の(空の場合もある)シーケンスであるため、いずれかを使用する前に、実際に存在するかどうかを確認する必要があります。それ以外の場合は、エラーメッセージを出力します(これは質問では不要であり、次のバージョンでは破棄されます)。

Ceylonのsum関数は、満たす必要のあるタイプの要素の空でない Iterableを受け取ります。Summableつまりplus、Integerのようなメソッドを持っています。(各Summableタイプには独自のゼロがあるため、空のシーケンスでは機能せず、ランタイムはどちらが意味されるかを知る機会がありません。)

文字列の要素、または整数の1ビットは、空でない反復可能ではありません。したがって、ここでは、いくつかの要素を指定してイテレート可能オブジェクトを作成する機能を使用し、次に「理解」(ゼロ個以上の要素に評価されます)を指定します。そのため、文字の場合は1を追加しますが(対応するビットが設定されている場合のみ)、文字列の場合は文字の結果を追加します。(理解は、受信関数が実際に反復するときにのみ評価され、Iterableを構築するときは評価されません。)

これを縮小する方法を見てみましょう。まず、各関数は1か所でしか呼び出されないため、インライン化できます。また、上記のように、エラーメッセージを取り除きます。(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。これを1つの大きな理解にすることができます。(これにより、の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 }));
}

ここで関数の()for を実際に省略できます。代替の関数呼び出し構文を使用します。これはの代わりにを使用し、反復可能な引数に内包表記を入力します。これにはフットプリント538があります。sum{...}()

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

関数名footprint(40)をp(3)に置き換えると、さらに37ポイント節約され、501になります(Ceylon関数名は小文字で始まる必要があるため、ここでは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つの改行ごとに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属性と同じ値を返すことがわかりました。しかし、30ではなく14ポイントしかないので、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-大文字の機会を逃しました。

Editorialitedit-コメントの提案を組み込みました(TimmyDに感謝)。

編集4-DはCよりも安価な変数です(2対3)

編集5-大文字と小文字を区別するため、295に戻ります。

文字列をループし、文字のASCII値からシフトされる1をカウントします。

大文字を使用し、最後に配列インデックスを使用するという先見の明を与えてくれたTimmyDに感謝します。


1
素敵なアプローチ!golfsのカップル(それはゼロにデフォルト設定されますよう、カップルの括弧を削除し、いくつかのセミコロンを削除し、$ 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コンソールでテストするときに初期化が失敗するので、そのままにしておきました。
Forty3

ええ-コンソールを使用している場合、割り当てられた変数は1行から次の行にとどまるという点で、ほとんどREPL環境です。.ps1として保存すると、同じシェルで上矢印キーを押した場合でも、$ B(および他のすべての変数)が再初期化されます。例:PS C:\scripts> .\ecological-footprint.ps1
AdmBorkBork

入力に不正な値0を返します"TEST"
ジェイコブクラル

1
281PARAM($A)(([CHAR[]]$A|%{$B=$_;0..9|?{[INT]$B-SHR$_-BAND1}}).LENGTH,0)[("TEST"-EQ$A)]
トムカンディ


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代わりにbase_convert

1
@Adamここでは、通知に関する議論、PHPの開始タグについて説明します。これがあなたの役に立つことを願っています。
insertusernamehere

4

VBA、475 418

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"コースを除く)
ジェイコブクラル


3

Pyth、64

?qz"test"0l`sS.Bz

入力がテストかどうかをチェックし、テストされていない場合は、入力のバイナリ表現内の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ゴルフでは、暗黙的以外の何らかの形式の出力が必要であることは一般的に同意されています。これは、アラート、document.write、または関数の戻り値です。
Mwr247

プロンプトの割り当てを、括弧で囲まれたifステートメントの最初の「s」に移動して、数バイトを節約できます。charCodeAtの「0」を削除することもできます。また、if / elseステートメントの代わりに三項演算子を使用すると、大幅に節約できます=)
Mwr247

どうもありがとう!しかし、プロンプトの割り当てに括弧ではなくコンマを使用することになりました。別のバイトを保存します。(:@ Mwr247
ザック・ゲイツ

s.split( '')は代わりにs.split ''で、2バイト節約できます
デンドロビウム

1
@JacobKrall上記パーデンドロビウムさんのコメント
ザック・ゲイツ

3

ルビー、316 313

非常に簡単で、ゴルフの可能性をさらに探します。

b=gets.chomp;b=='test'?0:b.chars.map{|i|i.ord.to_s(2).count('1')}.inject(:+)
  • 3ポイントを節約するb代わりに使用さxれます。

$*[0]代わりに使用できますgets.chomp(コマンドライン引数として入力を受け取ります)
Mhmd

二重引用符" 00100010は、単一引用符よりも環境に優しいです' 00100111
ジェイコブクラル

大文字の変数名も、同等の小文字よりも環境に優しいです。同じ理由Hよりも優れていIます。
ジェイコブクラル

3

パイソン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
ジェイコブクラル

いくつかの基本的な修正A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]により、スコアは243になります。–
Kade


2

Pyth、96

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

上/下のCJam回答の移植版。


ただ、いくつかのPyth一般的な注意事項:代わりにI三元を使用しようとする?が、この場合、それはあなただけで使用できるブール値であるため*(に切り替えた後nの代わりにq)、k自動的にある""s、文字列に同じAですjk。楽しく学べることを願っています!:)
FryAmTheEggman

これが私の最初のPythの回答でした:P ヒントをありがとう!@FryAmTheEggman
ザックゲイツ

2

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

入力のすべてのバイトと各バイトのすべてのビットをループして、変数に合計する簡単なアプローチd

dh、入力からの改行(2ビットに相当)を含むため、-2に初期化されますが、それをカウントしたくありません。

同様htest、末尾に改行が含まれるので、比較値に改行を含める必要があります。

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」の場合は-17になります(strcmpは等しい文字列では0を返し、異なる文字列では0以外を返します。 「テスト」です)。「テスト」のために計算される17のフットプリントを補正するために、番号-17が選択されました。フットプリントの計算は、ビットごとの演算子で簡単です。

スナップ!最初は「最短フットプリントの勝利」を見逃していたので、最短コードを目指していました...「フットプリント」を小さくできるかどうかを確認します。


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はあまりグリーンではありません。

ゴルフされていないバージョン:

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を比較するのは興味深いことです... ただし、bitCountは役立ちますが、Ceylonにはこれがありません。Ceylonにはコマンドラインパラメーターにアクセスするためのより長い方法があり、パラメーターが実際に指定されているかどうかを確認する必要があります(プログラムがArrayIndexOutOfBoundsExceptionをスローするだけです)。Ceylonのsum関数は、Ceylonで手動で追加するよりも確かに短いです(ただし、Javaには理解がないため、手動で追加する方がIterableを作成するよりも優れています)。
パエロエベルマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.