소스 코드 생태 발자국


102

독일 자동차 제조 회사에서 방금 고용했습니다. 엔지니어로서의 첫 번째 작업은 ASCII 문자열의 생태 발자국을 계산하는 프로그램을 작성하는 것입니다.

캐릭터의 생태 발자국은 다음과 같이 계산됩니다.

문자의 ASCII 코드를 이진수로 작성하고 1의 수를 센다.

예를 들어 A발자국은 2이지만 O발자국은 5로 더럽습니다.

문자열의 전역 발자국은 해당 문자의 발자국의 합입니다. 빈 문자열의 발자국은 0입니다.

프로그램은 ASCII 문자열을 매개 변수 (명령 행 또는 입력을 통해)로 승인하고 생태 발자국을 계산하여 출력해야합니다. 프로그램 자체는 ASCII로 인코딩되어야합니다.

그래도 딸꾹질이 있습니다. 회사가보다 엄격한 환경 규칙을 사용하여 새로운 시장에 진입하려면 "테스트 모드"에서 다르게 작동하도록 프로그램을 조정해야합니다. 그러므로:

프로그램은 문자열 test을 매개 변수로 받을 때 0을 출력해야합니다 .

채점

가장 작은 생태 발자국을 가진 소스 코드가 승리합니다 (그렇습니다, 대답 test은 금지되어 있습니다!)


36
죄송합니다. 뉴스를 계속 읽지 않았지만 방금 읽었습니다. 독일 자동차 회사가 폭스 바겐이라고 불리는 것이 아닌가?
Level River St

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

1
프로그램 대신에 허용되는 기능?
Luis Mendo

12
그들은 당신에게 거짓말입니다! 1은 0보다 훨씬 친환경적입니다. 증거를 원하십니까? 소스 코드를 바이너리로 인쇄하십시오. 0은 1보다 거의 2 배 많은 잉크를 사용합니다. 어두운 배경으로 코딩하면 화면에 표시하기 위해 더 많은 전력이 소비됩니다. (흰색 배경으로 코딩하는 경우 이미 모든 흰색을 렌더링하는 전자를 낭비하고 있으므로 환경을 염두에 둔 모든 프로그래머는 편집기에서 검정색 배경을 사용해야합니다.) 환경 친화적으로 사용하려면 모두 작성해야합니다. 공백 ...
대럴 호프만

답변:


45

CJam, 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
와우, 그것은 영리하다. 세상의 모든 메모리가 전체 코드를 보유 할 수 없기 때문에 결코 실행할 수 없다는 경고가 있습니다.
Reto Koradi

49
약간의 불편 함이 있습니다. 당신은 자연에 가격을 걸 수 없습니다.
Dennis

좋은 트릭이지만 실행할 수없는 경우에는 유효하지 않습니다
edc65

5
@PyRulez : 물질 이외의 것으로 만들어지고 공간 이외의 것을 차지하지 않는 한 아무것도 아닙니다.
vsz

5
왜 Lenguage를 사용하지 않습니까?
jimmy23013

40

길이 , 0


Lenguage / Brainfuck에는 10 진법으로 정수를 인쇄하는 방법이 없으므로 출력은 단항 입니다.

실제 소스 코드에는

22360559967824444567791709913713659826044558304969374451791514225490473373040212332757409553558758107085015797320276213515502796255082717802632399123502087743818475438512153373406931103005017157351410347278489842099128517039634739852783737052963203448945756470632484148121769939122103257063633371522287190530269279693540898545359211009781370158317748609540216376596783541124510013448091325488601732964773653391702083563797082990404753843419895799343996435988722965711513708742853668363743953430527328863418281733901770990932025503662188187254784985474815936854540100376410040743052620419372327997519047616042603909398552951490180076364164838561112002025592431155898041427468731461614504254168899805662501979953318388813759833797929243626668399650485310047043700001093878284174322463350892654886806075148010832042248607926124030339950499631072150856939786062937034833055717723216663269161130154002679878012158315587925933383341827053312086716181702533743607685576475754259877651521989944802973721727159955208722180232955193930065862370838526521351991966172723976565264862909528310162816593997640732796289501819499741414526385058421824690665542546821941125191276568479078107133076037506211133628962099403163812267452274532219562823184225236020523509355625620557197876838014050964240952738109101849512504021041103516630358995290177306585560988278630098667702211916671663291473843258785929522017507744814910480115446168939335008597569919072874897148594826036210511162928991890818427747059833051607455121463371211282760364668765311589329918870071117807132901910082663054895226456039171170783440772764031568108965851688162729239711772886386306884508520204834432674839183166053019421652064937613583258148354531835035461504442885024563141848164279928769795684221364984104923764359842286827870778678989243517189772102669283996930513577004801536579491093711362942690905779844535371088542020595945700544234301668098553671685123172583259206072965508639556627967633275762621813851479909708616154198658896714629908456913467267354690109885368211752176196164620615081464122410029328694509842558492529684841818953632659248840216891072110853731776562597900145806210691868173380612838327841104919352821441230296200143603175486627682007399030356592930049570084097858148122367

null 바이트이며 다음 Brainfuck 프로그램과 같습니다.

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

brainfuck.tk에서 온라인으로 사용해보십시오 .

Brainfuck 코드의 길이는 매우 차선책입니다. 우선 모든 ASCII 문자의 풋 프린트를 하드 코딩했습니다. 그러나 점수 0은 점수 0입니다 ...


절대로, Lenguage는 실제로 널 바이트를 지원합니까?!
Beta Decay

20
나는 이런 답변이 대중을 존중하지 않는다고 느낀다. 그것이 부정 행위이고 게임을하는 것이다. 그러나 이것은 결국이 도전의 요점이다. +1
edc65

1
"Language / Brainfuck은 10 진법으로 정수를 인쇄하는 방법이 없으므로 출력은 단항입니다." . 나는 Lenguage / Brainfuck의 요점 중 하나가 아무 것도 할 수있는 제정신의 방법이 없다는 것입니다. :
Adam

9
당신이 준 정의에서 프로그램을 다시 만들려고했을 때 이것은 나에게 효과적이지 않았습니다. 프로그램을 다시 만들려는 시도와 다른 점을 알 수 있도록 전체 Lenguage 소스를 게시 해 주시겠습니까? ;-)
Cort Ammon

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가져온 다음 문자 배열로 캐스트 한 다음 각 문자에서 for 루프를 반복하고 엄청나게 wordy [convert]::ToString()를 사용하여 해당 위치의 문자를 이진수로 변환하고 모든 0을 아무것도 아닌 것으로 바꾼 다음 길이를 계산합니다. 에 추가합니다 $B. 마지막에, 동적 배열 (즉, 만일에 인덱스를 사용 등가 $A이며 test, 다음 -CEQIS $TRUE번째 요소, 그것은 그렇게 인덱스 0).

"TEST"
Edit1- 수정 된 테스트 사례 Edit2-인덱스 대신 문자 자체를 반복 -replace하고 아무것도 대체하지 않으면 두 번째 매개 변수가 필요하지 않음 을 기억하여 몇 가지 포인트를 골라냅니다 .


큰 따옴표 " 00100010는 작은 따옴표 보다 환경 친화적 ' 00100111입니다.
Jacob Krall

입력에 대해 잘못된 값 0을 반환합니다."TEST"
Jacob Krall

1
@JacobKrall 큰 따옴표를 잘 잡으십시오 ". -CEQ대소 문자 구분 을 위해 수정되었습니다 . ' '테스트에서 올바르게 구분하지 않았기 때문에 점수를 잘못 매 겼기 때문에 점수가 약간 올랐습니다.
AdmBorkBork

9

피시스 -52 49

@orlp 덕분에 세 가지 포인트가 절약됩니다.

*/.BQ`1nQ"test

발자국을 절약하기 위해 따옴표로 입력합니다.

테스트 스위트 .


어, 나는 거의 당신과 동일하지만 내 대답이 너무 비슷하고 당신이 먼저 게시했습니다. 교체 @,0와 함께 *3 : 저장
orlp

1
@ Maltysen 당신은 당신이 세 가지 포인트를 찾았지만 소스는 여전히 말한다 @,0, 당신은 그냥 변경하는 것을 잊었습니까?
박수

@ConfusedMr_C p. 나는 단지 permalink를 바꾸고 실제 대답을 잊었다.
Maltysen

7

일반적인 Lisp, 294 281 235

점수를 줄이기 위해 @(비용 1)과 !(비용 2)를 변수 이름으로 사용했습니다 (편집 : @함수에서 가장 많이 발생하는 변수에 사용하면 더 좋습니다 ). 나는 그것이 더 싸기 때문에 너무 외치고 있습니다.

(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 점수에 관한 부분을 놓쳤습니다, 죄송합니다 :-)
coredump

1
@ Cabbie407 몇 분 동안 매우 낮은 점수를받은 이상한 느낌이 들었습니다.
coredump

1
스코어링 방법에 대해 알고 있으면 코드를 다른 각도에서 볼 수 있기 때문에 알려 드리고 싶었습니다. 그리고 나는 당신이 이미 무언가를 바꾼 것을 봅니다.
Cabbie407

1
@ Babbie407 감사합니다. 감사.
coredump

6

자바 스크립트, 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
이 답변은 유효하지 않습니다. test0 대신 17을 출력 합니다.
ASCIIThenANSI

@ASCIIThenANSI 내 브라우저에 없습니다. 하지만 다시 확인
하겠습니다

재밌 네요. 카운터로 테스트하면 279가, 자체 테스트는 277이됩니다. 어떤 것이 올바른지 궁금합니다. 줄 바꿈과 관련이 있습니까?
ETHproductions

@ETHproductions 나는 두 번 확인했고 올바른 수는 279입니다. 그러나 개행 문자가 포함 된 문자열에서는 작동하지 않습니다- prompt함수 와 관련된 문제 입니다. Firefox에서는 prompt공백 (1 비트)에서 줄 바꿈 (2 비트)을 변환하므로 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
문제 없습니다, 난 정말 환경에 관심이 있습니다;)
FryAmTheEggman

6

파이썬 3, 271

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

3
작은 변화가 많이
생기면

2
부울이 정수라는 이점을 활용 해보십시오. z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test")).... @ FryAmTheEggman jinx?
NightShadeQueen

1
@NightShadeQueen Haha, 하루 동안 게시 할 수 없습니까? : X 어쨌든 그것은이 사이트에 새로운 사용자를위한 아주 좋은 캐치입니다, 좋은 일! 어쨌든 PPCG에 오신 것을 환영합니다! :) 또한 주제에 비해 세미콜론은 줄 바꾸기보다 약간 더 비싸므로 제거 할 수 있습니다.
FryAmTheEggman

5

136 118 73

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

모두 @로 교체\0

사용 예 :

perl -p entry.pl entry.pl

5

MATLAB, 198 194 바이트

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문자형 배열을 출력합니다. 이 문제가 발생하면 0의 ASCII 코드 인 48을 빼서 행렬이 double0과 1로 구성 되도록 변환합니다 . 그런 일이 발생하면 nnz이 행렬에서 0이 아닌 요소의 총 수 를 계산합니다. 이 결과에는 문자열 비교와의 반대가 곱해집니다 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와 최고의 '바이너리 (와 다음 수에 bc0을 밖으로 스트립 및 문자의 수를 계산).

큰 대답은 아니지만 아직 bash 시도를 보지 못했습니다.

첫 번째 답변에서 입력 문자열을 명령 줄에 간단하게 제공 할 수 있도록 수정 했으므로 (즉, 단어가 여러 개인 경우 여러 입력 매개 변수가 됨) 다른 답변을 읽은 후 인용 된 것으로 가정 할 수 있으므로 전체 문자열은 다음과 같습니다. $1


1
프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 1. 당신은 대체 할 수 do{done함께 }. 2. 당신은 또한 주위 공간이 필요하지 않습니다 <<<. 3. \n리터럴 줄 바꿈으로 바꿀 수 있습니다 .
Dennis

@Dennis에게 감사합니다. 이 사이트의 과제 중 하나는 "좋은 습관"을 많이 배우는 것입니다. :).
Adam

3
그것은 확실하다. 아직 골프를 치지 않았다면 Bash에서 골프 팁을 확인하는 것이 좋습니다 . 훌륭한 자료입니다.
Dennis

3
이 도전은 골프 표준으로도 이상합니다! 추가 문자는 여전히 포인트를 저장할 수 있습니다. 사용 =||사용하는 반면 15 비용 !=&&만 13! 추가 캐릭터이지만 두 점을 절약합니다 ...
Adam

5

실론, 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});}

이것은 원래 ungolfed였습니다.

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함수는 충족 해야하는 어떤 유형의 요소 , 즉 Integer와 같은 메소드 가 비어 있지 않은 Iterable을 취합니다 . (각 Summable 유형에는 고유 한 0이 있으며 런타임에서 어떤 유형을 의미하는지 알 수 없기 때문에 빈 시퀀스에서는 작동하지 않습니다.)Summableplus

문자열의 요소 또는 정수의 1 비트는 비어 있지 않은 반복이 아닙니다. 따라서 여기서는 일부 요소를 지정한 다음 "이해"(0 개 이상의 요소로 평가됨)를 지정하여 이터 러블을 빌드하는 기능을 사용하고 있습니다. 따라서 문자의 경우에는 비트를 추가하고 (해당 비트가 설정된 경우에만) 문자열의 경우에는 문자의 결과를 추가합니다. 이해력은 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 }));
    }
}

우리는 first에 대해 동일한 작업을 수행하지만 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 });
}

함수 이름 footprint(40)을 p(3)으로 바꾸면 37 포인트가 더 절약되어 501이됩니다.

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속성 과 동일한 값을 반환 한다는 것을 알았 습니다 . 그러나 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-대문자 기회를 놓쳤습니다.

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 콘솔에서 테스트 할 때 초기화가 저절로 넘어갔습니다.
Forty3

예-콘솔을 사용하는 경우 할당 된 변수가 한 줄에서 다음 줄로 유지된다는 점에서 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)]
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으로 개선 할 수는 있지만 더 나은 것을 생각하려고 노력할 것입니다.

입력은 명령 줄을 통해 이루어지며, 입력이 없으면 segfaults를 의미합니다. 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 시작 태그에 대한 설명 입니다. 이것이 당신에게 유용하기를 바랍니다.
insertusernamehere

4

VBA, 475 (418)

57 점을 주셔서 감사합니다.

  • 문자열을 바이트 배열로 변환합니다. 128은 "문자열을 유니 코드에서 시스템의 기본 코드 페이지로 변환합니다"라는 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

4

자바 스크립트, 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)

큰 따옴표 " 00100010는 작은 따옴표 보다 환경 친화적 ' 00100111입니다.
Jacob Krall

3

피스, 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) 으로 바꾸고을 1통해 s를 계산하십시오 a. 모든 결과를 합산하십시오.


3

자바 스크립트 (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 골프는 암시 적 이외의 출력 형식이 필요하다는 데 일반적으로 동의합니다. 경고, document.write 또는 함수 반환 일 수 있습니다.
Mwr247

괄호로 묶인 if 문의 첫 번째 's'로 프롬프트 할당을 이동하여 몇 바이트를 저장할 수 있습니다. charCodeAt에서 '0'을 제거 할 수도 있습니다. 또한 if / else 문 대신 삼항 연산자를 사용하면 크게 절약 할 수 있습니다. =)
Mwr247

고마워요! 그래도 프롬프트 할당에 괄호 대신 쉼표를 사용했습니다. 다른 바이트를 저장합니다. (: @ Mwr247
Zach Gates

s.split ( '') 대신 s.split ''를 사용하여 2 바이트를 절약 할 수 있습니다.
Dendrobium

1
위의 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(:+)
  • 3 포인트를 저장하는 b대신 사용 됩니다 x.

$*[0]대신 사용할 수 있습니다 gets.chomp(명령 행 인수로 입력
받음

큰 따옴표 " 00100010는 작은 따옴표 보다 환경 친화적 ' 00100111입니다.
Jacob Krall

대문자 변수 이름도 동등한 소문자보다 환경 친화적입니다. 같은 이유로 H보다 낫습니다 I.
Jacob Krall

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입니다.
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. pyth를 배우는 것이 재미 있기를 바랍니다! :)
FryAmTheEggman

이것은 나의 첫 번째 Pyth 답변이었습니다. : P, 이것을 얻는 것이 어려웠습니다. 팁 주셔서 감사합니다! @FryAmTheEggman
Zach Gates

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

variable의 합으로 입력의 모든 바이트와 각 바이트의 모든 비트를 반복하는 간단한 접근 방식 d.

dh입력에서 종료 줄 바꿈이 포함되어 있기 때문에 -2로 초기화되며 (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"인 경우 -17이됩니다 (strcmp는 동일한 문자열에서 0을 반환하고 고유 문자열에서 0이 아닌 값을 반환하므로 문자열을 변환하면 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);}}

자바는 그리 친환경적이지 않습니다.

언 골프 버전 :

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

DInteger우리 는 환경 적으로 양심적으로 Integer정적 bitCount메소드에 액세스 할 수 있도록 선언됩니다 . 이 bitCount메서드는 chars를 정수로 취급하고 설정된 비트 수를 반환합니다.


1
Java를 Ceylon과 비교하는 데 관심이 있습니다 ... Java는 상용구로 인해 약간의 오버 헤드가 있으며 더 긴 인쇄 문이 있습니다. bitCount는 도움이되지만 Ceylon에는이 기능이 없습니다. Ceylon은 명령 행 매개 변수에 더 오래 액세스 할 수 있으며, 실제로 제공되는지 확인해야합니다 (프로그램이 단순히 ArrayIndexOutOfBoundsException을 발생시키는 경우). Ceylon의 sum 함수는 Ceylon에서 수동으로 추가하는 것보다 확실히 짧습니다 (그러나 Java에는 이해가 없으므로 수동으로 추가하는 것이 Iterable을 직접 만드는 것보다 낫습니다).
Paŭlo Ebermann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.