Mã nguồn dấu chân sinh thái


102

Bạn vừa được một công ty sản xuất xe hơi của Đức thuê. Nhiệm vụ đầu tiên của bạn, là một kỹ sư, là viết một chương trình tính toán dấu chân sinh thái của các chuỗi ASCII.

Dấu chân sinh thái của nhân vật được tính như sau:

Viết mã ASCII của ký tự thành nhị phân và đếm số lượng 1.

Ví dụ, Acó dấu chân là 2, nhưng Obẩn hơn với dấu chân là 5.

Dấu chân toàn cầu của một chuỗi là tổng số dấu chân của các ký tự của chuỗi. Một chuỗi rỗng có dấu chân bằng không.

Chương trình của bạn phải chấp nhận chuỗi ASCII làm tham số (thông qua dòng lệnh hoặc đầu vào), tính toán dấu chân sinh thái của nó và xuất ra chuỗi đó. Chương trình phải được mã hóa ASCII.

Có một tiếng nấc mặc dù. Vì công ty của bạn muốn tham gia vào một thị trường mới với các quy tắc môi trường chặt chẽ hơn, bạn cần điều chỉnh chương trình của mình để nó hoạt động khác đi trong "chế độ thử nghiệm". Do vậy:

Chương trình sẽ xuất 0 khi nhận chuỗi testdưới dạng tham số.

Chấm điểm

Mã nguồn có dấu chân sinh thái nhỏ nhất sẽ thắng (và vâng, câu trả lời testbị cấm!)


36
Tôi xin lỗi, tôi đã không theo kịp tin tức, nhưng tôi mới đọc nó. Chúng ta có thể cho rằng công ty xe hơi của Đức chắc chắn KHÔNG được gọi là Volkswagen?
Cấp sông St

7
Để tham khảo, các nhân vật tốn kém nhất đến ít tốn kém hơn:\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 Đây là một công ty hư cấu, nhưng tên của nó thực sự bắt đầu bằng V và có W ở đâu đó ở giữa. Nhưng bất kỳ sự tương đồng với thực tế chỉ là sự trùng hợp ngẫu nhiên, ít nhất có ai đó kiện chúng tôi.
Mindwin

1
Chức năng được phép (thay vì chương trình)?
Luis Mendo

12
Họ đang nói dối bạn! 1 là thân thiện với sinh thái hơn nhiều so với 0. Muốn chứng minh? In ra mã nguồn của bạn trong nhị phân. 0 'sử dụng gần gấp đôi lượng mực của 1. Và nếu bạn viết mã với nền tối, chúng cũng lãng phí nhiều điện hơn để hiển thị trên màn hình của bạn. . Khoảng trắng ...
Darrel Hoffman

Câu trả lời:


45

CJam, 33 31

"",AA#b:c~

Có 11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000000

Mã tương đương với

11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000098
AA#b:c~

có thể được kiểm tra trực tuyến .

Làm thế nào điều này hoạt động

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

Làm thế nào mà hoạt động

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.

Mã nguồn này có dấu chân sinh thái là 75.


3
Wow, thật thông minh. Tôi đoán rằng hãy cẩn thận là bạn không bao giờ có thể chạy nó, vì tất cả bộ nhớ trên thế giới không thể chứa toàn bộ mã.
Reto Koradi

49
Đó là một bất tiện nhỏ. Bạn không thể đặt giá vào thiên nhiên.
Dennis

Đó là một mẹo hay, nhưng không hợp lệ nếu không thể chạy
edc65

5
@PyRulez: Không phải bởi bất cứ điều gì trừ khi nó sẽ được xây dựng từ một thứ khác ngoài vật chất và chiếm giữ một thứ khác ngoài không gian.
vsz

5
Tại sao không chỉ sử dụng Lenguage?
jimmy23013

40

Chiều dài , 0


Đầu ra là đơn nhất , vì Lenguage / Brainfuck không có cách in ấn số nguyên trong cơ sở 10.

Mã nguồn thực tế chứa

22360559967824444567791709913713659826044558304969374451791514225490473373040212332757409553558758107085015797320276213515502796255082717802632399123502087743818475438512153373406931103005017157351410347278489842099128517039634739852783737052963203448945756470632484148121769939122103257063633371522287190530269279693540898545359211009781370158317748609540216376596783541124510013448091325488601732964773653391702083563797082990404753843419895799343996435988722965711513708742853668363743953430527328863418281733901770990932025503662188187254784985474815936854540100376410040743052620419372327997519047616042603909398552951490180076364164838561112002025592431155898041427468731461614504254168899805662501979953318388813759833797929243626668399650485310047043700001093878284174322463350892654886806075148010832042248607926124030339950499631072150856939786062937034833055717723216663269161130154002679878012158315587925933383341827053312086716181702533743607685576475754259877651521989944802973721727159955208722180232955193930065862370838526521351991966172723976565264862909528310162816593997640732796289501819499741414526385058421824690665542546821941125191276568479078107133076037506211133628962099403163812267452274532219562823184225236020523509355625620557197876838014050964240952738109101849512504021041103516630358995290177306585560988278630098667702211916671663291473843258785929522017507744814910480115446168939335008597569919072874897148594826036210511162928991890818427747059833051607455121463371211282760364668765311589329918870071117807132901910082663054895226456039171170783440772764031568108965851688162729239711772886386306884508520204834432674839183166053019421652064937613583258148354531835035461504442885024563141848164279928769795684221364984104923764359842286827870778678989243517189772102669283996930513577004801536579491093711362942690905779844535371088542020595945700544234301668098553671685123172583259206072965508639556627967633275762621813851479909708616154198658896714629908456913467267354690109885368211752176196164620615081464122410029328694509842558492529684841818953632659248840216891072110853731776562597900145806210691868173380612838327841104919352821441230296200143603175486627682007399030356592930049570084097858148122367

null byte và tương đương với chương trình Brainfuck sau:

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

Hãy thử trực tuyến trên brainfuck.tk .

Độ dài của mã Brainfuck rất tối ưu - đối với người mới bắt đầu, tôi đã mã hóa dấu chân của tất cả các ký tự ASCII - nhưng điểm 0 là điểm 0 ...


Không thể nào, Lenguage thực sự hỗ trợ byte rỗng?!
Beta Decay

20
Tôi cảm thấy câu trả lời như thế này cho thấy không có sự tôn trọng của công chúng: đó là gian lận và chơi game hệ thống ... Nhưng cuối cùng thì đây là toàn bộ thách thức của thử thách này. +1
edc65

1
"Đầu ra là đơn nhất, vì Lenguage / Brainfuck không có cách in ấn số nguyên trong cơ sở 10." . Tôi nghĩ một phần quan điểm của Lenguage / Brainfuck là nó không có cách làm lành mạnh nào cả :)
Adam

9
Điều này không hoàn toàn phù hợp với tôi khi tôi cố gắng tạo lại chương trình của bạn từ định nghĩa bạn đưa ra. Bạn có thể vui lòng đăng toàn bộ nguồn Lenguage để tôi có thể thấy chương trình của bạn khác với nỗ lực của tôi trong việc tạo lại nó không? ;-)
Cort Ammon

1
Điều làm tôi ngạc nhiên không phải là Lenguage hỗ trợ null, mà là bạn đã quản lý để tạo ra một chương trình như vậy trong BF. Ám ảnh ...
Erik the Outgolfer

12

PowerShell, 337 344 304 điểm

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

TÔI CHƯA TỪNG BẠN TRỞ THÀNH VÌ VẬY!

Đưa đầu vào thành $A, sau đó chuyển thành một mảng char, sau đó lặp qua một vòng lặp for trên mỗi ký tự, sử dụng từ lố bịch [convert]::ToString()để chuyển đổi ký tự ở vị trí đó thành nhị phân, thay thế tất cả 0 bằng không, sau đó đếm độ dài và thêm vào đó $B. Cuối cùng, sử dụng một sự tương đương để lập chỉ mục thành một mảng động (nghĩa là, nếu $Atest, thì -CEQ$TRUE, vì vậy nó lập chỉ mục cho phần tử thứ hai, 0).

Edit1 - Trường hợp kiểm tra "TEST"
chính xác Edit2 - Đánh một vài điểm bằng cách lặp lại chính các ký tự thay vì chỉ số của chúng và bằng cách nhớ rằng -replacekhông cần tham số thứ hai nếu bạn không thay thế nó.


Báo giá đôi " 00100010thân thiện với môi trường hơn so với trích dẫn đơn ' 00100111.
Jacob Krall

Trả về giá trị 0 không chính xác cho đầu vào"TEST"
Jacob Krall

1
@JacobKrall Bắt tốt trên báo giá kép ". Cũng sửa chữa -CEQcho trường hợp nhạy cảm. Nó tăng điểm một chút, bởi vì tôi đã ghi điểm không chính xác ' 'vì tôi đã không phân định chính xác trong bài kiểm tra của mình.
admBorkBork

9

Bình - 52 49

Ba điểm tiết kiệm nhờ @orlp.

*/.BQ`1nQ"test

Đưa đầu vào trong dấu ngoặc kép để lưu dấu chân.

Phòng thử nghiệm .


Ugh, tôi gần như giống bạn, nhưng câu trả lời của tôi quá giống nhau và bạn đã đăng lên trước. Thay thế @,0bằng *để lưu 3 :)
orlp

1
@Maltysen Bạn nói rằng bạn đã tìm thấy ba điểm nhưng nguồn vẫn nói @,0, bạn có quên thay đổi không?
vỗ tay

@ConfuseMr_C yep. Tôi chỉ thay đổi permalink và quên câu trả lời thực tế.
Maltysen

7

Lisp thường gặp 294 281 235

Để giảm điểm, tôi đã sử dụng @(chi phí 1) và !(chi phí 2) làm tên biến (chỉnh sửa: và thậm chí còn tốt hơn nếu tôi sử dụng @cho biến xảy ra nhiều nhất trong hàm). TÔI HÉT TOO vì nó là rẻ hơn.

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

In đẹp

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

Chà, điểm số giống như 294;)
Cabbie407

@ Cabbie407 Tôi đã bỏ lỡ phần về ghi bàn, xin lỗi :-)
coredump

1
@ Cabbie407 Tôi có cảm giác kỳ lạ khi có số điểm rất thấp trong vài phút ...
coredump

1
Chỉ muốn cho bạn biết, bởi vì biết về phương pháp tính điểm, có lẽ bạn sẽ nhìn mã của mình từ một góc độ khác. Và tôi thấy bạn đã thay đổi một cái gì đó rồi.
Cabbie407

1
@ Cabbie407 Tôi quên cảm ơn bạn, btw. Cảm ơn.
coredump

6

JavaScript, 279

Chỉnh sửa sửa lỗi (không tính bit 1 của mỗi char)

Một chương trình hoàn chỉnh, với đầu vào và đầu ra thông qua cửa sổ bật lên. Đã thử nghiệm trong Firefox, nên hoạt động trong mọi trình duyệt hiện đại.

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

Một số công cụ (Đã thử nghiệm với 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
Câu trả lời này không hợp lệ - nó xuất ra 17 testthay vì 0.
ASCIIThenANSI

@ASCIIThenANSI không phải trong trình duyệt của tôi. Nhưng tôi sẽ kiểm tra lại
edc65

Điều đó thật buồn cười ... Thử nghiệm nó với bộ đếm của bạn, tôi nhận được 279 và tự mình kiểm tra nó, tôi nhận được 277. Tôi tự hỏi cái nào là chính xác; nó có thể có một cái gì đó để làm với các dòng mới?
Sản xuất ETH

@ETHproductions Tôi đã kiểm tra hai lần và số đếm đúng là 279. Nhưng nó không hoạt động với một chuỗi chứa một dòng mới - đó là một vấn đề liên quan đến promptchức năng. Trong Firefox, promptdịch các dòng mới (2 bit) trong khoảng trắng (1 bit), vì vậy chúng tôi nhận được 277 thay vì 279
edc65

@ETHproductions ... trong Chrome (trên Windows), dòng mới trở thành cặp CR LF (3 bit + 2 bit) và số đếm lại bị sai
edc65

6

Julia, 254 246 232

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

Các count_oneschức năng đếm số người trong biểu diễn nhị phân của đầu vào của nó.

Giảm dấu chân sinh thái của tôi nhờ FryAmTheEggman!


1
Không có vấn đề gì, tôi chỉ thực sự quan tâm đến môi trường;)
FryAmTheEggman

6

Trăn 3, 271

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

3
Rất nhiều thay đổi nhỏ mang lại cho tôi 228
FryAmTheEggman

2
Tại sao không tận dụng rằng bools là ints? z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test")).... @ FryAmTheEggman jinx?
NightShadeQueen

1
@NightShadeQueen Haha, điều đó có nghĩa là tôi không thể đăng trong một ngày? : X Dù sao đó là một điểm thu hút rất tốt cho người dùng mới vào trang web này, công việc tuyệt vời! Dù sao, chào mừng bạn đến với PPCG! :) Ngoài ra, nhiều hơn về chủ đề, dấu chấm phẩy có thể được loại bỏ vì nó có giá cao hơn một chút so với một dòng mới.
FryAmTheEggman

5

Perl, 136 118 73

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

Thay thế tất cả @bằng\0

Ví dụ sử dụng:

perl -p entry.pl entry.pl

5

MATLAB, 198 194 byte

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

Đầu tiên, chuỗi được đọc từ STDIN thông qua inputchức năng. Khi điều này xảy ra, chúng tôi so sánh chuỗi đầu vào với chuỗi test. Nếu kết quả không test , chúng tôi chuyển đổi từng ký tự thành mã ASCII và sau đó biểu diễn nhị phân của nó thông qua dec2bin. Một kết quả tuyệt vời của hàm này là nếu bạn gửi một chuỗi, biểu diễn nhị phân của mã ASCII của nó được phân định thành một ký tự trên mỗi dòng.

Ví dụ:

>> dec2bin('ABCD')

ans =

1000001
1000010
1000011
1000100

dec2binxuất ra một mảng ký tự. Khi điều này xảy ra, hãy trừ 48, là mã ASCII cho 0 để ma trận được chuyển đổi thành doublebao gồm 0 và 1. Khi điều đó xảy ra, một cuộc gọi để nnzđếm tổng số phần tử khác không trong ma trận này. Hãy lưu ý rằng kết quả này được nhân với đối diện của chuỗi so sánh với test. Nếu chuỗi không được test, chúng ta có được tính toán dấu chân. Nếu nó bằng nhau, thì phép nhân kết quả bằng 0.

Vài ví dụ:

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

Nếu bạn được phép sử dụng Hộp công cụ truyền thông, bạn có thể sử dụng de2bithay vào đó và tránh sử dụng -48để chuyển nó thành loại số (cũng như 2 ký tự phụ trong tên hàm).
cốc

5

Bash 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

Khá đơn giản. Vòng lặp các ký tự trong đầu vào chuyển đổi đầu tiên thành ascii (với printf %dvà dẫn đầu 'về số sau đó thành nhị phân (với bc), loại bỏ các số không và đếm số lượng ký tự.

Không phải là một câu trả lời tuyệt vời nhưng chưa thấy một nỗ lực bash nào.

Được sửa đổi vì câu trả lời đầu tiên của tôi cho phép chuỗi đầu vào được đưa ra đơn giản trên dòng lệnh (nghĩa là nó trở thành nhiều thông số đầu vào nếu nhiều từ) nhưng sau khi đọc một số câu trả lời khác, tôi nghĩ rằng tôi có thể giả sử nó được trích dẫn, vì vậy toàn bộ chuỗi là $1


1
Chào mừng bạn đến với Câu đố lập trình & Code Golf! 1. Bạn có thể thay thế dobằng {donevới }. 2. Bạn cũng không cần không gian xung quanh <<<. 3. Bạn có thể thay thế \nbằng một dòng thức ăn theo nghĩa đen.
Dennis

Cảm ơn @Dennis. Một trong những thách thức trên trang web này là bỏ qua một loạt các "thói quen tốt" :).
Adam

3
Chắc chắn rồi. Nếu bạn chưa có, tôi khuyên bạn nên kiểm tra Mẹo chơi gôn ở Bash . Đó là một nguồn tài nguyên tuyệt vời.
Dennis

3
Thách thức này là kỳ lạ ngay cả theo tiêu chuẩn golf! Nhân vật phụ vẫn có thể lưu điểm. Sử dụng =||chi phí 15 trong khi sử dụng !=&&chỉ có 13! Một nhân vật phụ nhưng tiết kiệm hai điểm ...
Adam

5

Tích Lan, 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});}

Đây là bản gốc, chưa được chỉnh sửa:

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

Điều này lấy tham số từ một tham số dòng lệnh ... process.argument là một chuỗi (có thể trống) của chuỗi, vì vậy trước khi sử dụng một trong số chúng, chúng ta cần kiểm tra xem nó có thực sự tồn tại không. Trong trường hợp khác, chúng tôi đưa ra một thông báo lỗi (câu hỏi này không bắt buộc và sẽ bị loại bỏ trong các phiên bản tiếp theo).

sumHàm của Ceylon có một phần tử lặp không rỗng của một số loại cần thỏa mãn Summable, tức là có một plusphương thức, như Integer. (Nó không hoạt động với các chuỗi trống vì mỗi loại Summable sẽ có số 0 riêng và thời gian chạy không có cơ hội để biết loại nào có nghĩa.)

Các phần tử của một chuỗi, hoặc một bit của một số nguyên, không phải là một phép lặp không trống. Do đó, chúng tôi đang sử dụng tính năng này để xây dựng một lần lặp bằng cách chỉ định một số phần tử, sau đó là "mức độ hiểu" (sẽ được đánh giá bằng 0 hoặc nhiều phần tử). Vì vậy, trong trường hợp ký tự, chúng ta sẽ thêm các ký tự (nhưng chỉ khi bit tương ứng được đặt), trong trường hợp chuỗi chúng ta sẽ thêm kết quả của các ký tự. (Mức độ hiểu sẽ chỉ được đánh giá khi chức năng nhận thực sự lặp lại trên nó, chứ không phải khi xây dựng Iterable.)

Chúng ta hãy xem làm thế nào chúng ta có thể thu nhỏ điều này xuống. Đầu tiên, mỗi hàm chỉ được gọi ở một nơi, vì vậy chúng ta có thể nội tuyến chúng. Ngoài ra, như đã đề cập ở trên, thoát khỏi thông báo lỗi. (764 điểm dấu chân.)

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

Chúng ta không thực sự cần nội tâm lồng vào nhau sum, chúng ta có thể làm cho điều này trở nên lớn hơn. (Điều này giúp chúng tôi tiết kiệm được 37 điểm cho dấu chân sum({0,})và một số điểm khác cho khoảng trắng sẽ bị loại bỏ ở cuối mọi cách.) Đây là 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 }));
        }
    }
}

Chúng ta có thể áp dụng một nguyên tắc tương tự cho "test"chuỗi có vỏ đặc biệt : vì trong trường hợp đó, kết quả là 0 (nghĩa là không có gì được đóng góp vào tổng), chúng ta chỉ có thể thực hiện điều này như một phần của phép tính tổng (nhưng chúng ta phải đảo ngược điều kiện) . Điều này chủ yếu giúp chúng tôi tiết kiệm print(0);, một số niềng răng và một loạt các không gian thụt đầu dòng, đi xuống dấu chân của 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 }));
    }
}

Chúng tôi làm tương tự cho lần đầu tiên if, với hiệu ứng phụ mà bây giờ không đưa ra đối số nào cũng xuất ra 0thay vì không làm gì cả. (Ít nhất tôi nghĩ điều đó sẽ xảy ra ở đây, thay vào đó nó dường như bị treo với một vòng lặp vĩnh cửu? Lạ thật.)

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

Chúng ta thực sự có thể bỏ qua hàm ()cho sumở đây, bằng cách sử dụng cú pháp gọi hàm thay thế , sử dụng {...}thay vì ()và sẽ điền vào các hiểu biết vào các đối số có thể lặp lại. Điều này có dấu chân 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 });
}

Thay thế tên hàm footprint(40) bằng p(3) sẽ tiết kiệm thêm 37 điểm, đưa chúng tôi tới 501. (Tên hàm Ceylon phải bắt đầu bằng các ký tự chữ thường, vì vậy chúng tôi không thể có ít hơn 3 điểm ở đây.)

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

Tên biến s(5) và c(4), i(4) cũng không tối ưu. Hãy thay thế chúng bằng a(đối số), d(chữ số?) Và b(chỉ mục bit). Dấu chân 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 });
}

Tôi không thấy bất kỳ tối ưu hóa không phải khoảng trắng nào còn lại, vì vậy, hãy xóa khoảng trắng không cần thiết (1 điểm cho mỗi khoảng trắng, hai điểm cho mỗi lần ngắt hai dòng):

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

Khi duyệt API, tôi thấy rằng Character.hash thực sự trả về cùng giá trị với integerthuộc tính của nó . Nhưng nó chỉ có 14 điểm thay vì 30, vì vậy chúng tôi giảm xuống còn 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"]

chỉnh sửa - quên trường hợp 'kiểm tra' ... rất tốn kém.

đã chỉnh sửa - bỏ lỡ một cơ hội UPPERCASE.

đã chỉnh sửa - kết hợp các đề xuất nhận xét (Cảm ơn TimmyD).

chỉnh sửa 4 - D là một biến có giá rẻ hơn C (2 so với 3)

chỉnh sửa 5 - Quay lại 295 do kiểm tra độ nhạy trường hợp.

Vòng lặp trên chuỗi và đếm số 1 được chuyển khỏi giá trị ASCII của các ký tự.

Hat-tip cho TimmyD vì đã cho tôi tầm nhìn xa để sử dụng các ký tự viết hoa VÀ để sử dụng chỉ số mảng ở cuối.


1
Cách tiếp cận tốt đẹp! Một vài golf (đã loại bỏ khởi tạo $ B, vì nó sẽ mặc định là 0, loại bỏ một cặp parens, loại bỏ một số dấu chấm phẩy), đưa nó xuống 293 PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
admBorkBork

Điều đó có nghĩa là gì khi tôi đọc "Cách tiếp cận tốt đẹp!" và nghe giọng nói từ Wii Golf? Cảm ơn các con trỏ! Việc khởi tạo đã làm tôi vấp ngã khi thử nghiệm nó trong bảng điều khiển PowerShell và tôi đã để nó lại. Thật tốt khi biết điều khác.
Bốn mươi3

Vâng - nếu bạn đang sử dụng bảng điều khiển, đó gần như là môi trường REPL, trong đó các biến được gán vẫn duy trì từ dòng này sang dòng tiếp theo. Nếu bạn lưu nó dưới dạng .ps1, thì $ B (và mọi biến khác) sẽ được khởi tạo lại, ngay cả khi bạn nhấn up-mũi tên-nhập từ cùng một vỏ. Ví dụ:PS C:\scripts> .\ecological-footprint.ps1
admBorkBork

Trả về giá trị 0 không chính xác cho đầu vào"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

Dòng mới (không bao gồm trong điểm) được thêm vào cho rõ ràng. Có thể được cải thiện thành 360 chỉ bằng cách thay đổi tên biến thành chữ hoa, nhưng tôi sẽ cố gắng nghĩ về thứ gì đó tốt hơn.

Đầu vào là thông qua dòng lệnh, có nghĩa là nó tách biệt trên đầu vào vắng mặt. Tôi mong đợi một điểm số tồi tệ hơn cho đầu vào thông qua 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 Dấu chân sinh thái (vẫn còn rất nhiều) , 102 91 Byte

Có vẻ như PHP chỉ thân thiện với môi trường trong chế độ thử nghiệm. ;)

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

Chạy từ dòng lệnh như:

php footprint.php hello
php footprint.php test

whilethân thiện với môi trường hơn formặc dù họ có chung số lượng nhân vật. Ngoài ra tên biến chữ hoa có dấu chân tốt hơn so với tên viết thường của chúng.

Biên tập

  • lưu 40 điểm bằng cách sử dụng tên hàm viết hoa.
  • đã lưu 38 điểm bằng cách sử dụng decbinthay vìbase_convert

1
@Adam Đây là một cuộc thảo luận về các thông báo và ở đây về các thẻ mở PHP . Hy vọng điều này hữu ích cho bạn.
insertusernamehere

4

VBA, 475 418

Cảm ơn Jacob đã giảm 57 điểm

  • Chuyển đổi chuỗi thành mảng Byte (128 là phím tắt vba cho "Chuyển đổi chuỗi từ Unicode sang trang mã mặc định của hệ thống" Vì vậy, sẽ không hoạt động trên Mac ....)

  • Vòng lặp mặc dù mảng byte chuyển đổi thành Nhị phân và Ghép mọi thứ lại với nhau.

  • kiểm tra kiểm tra
  • In độ dài của chuỗi với tất cả 0 được thay thế bằng không có gì

VBA tại sao bạn chơi golf quá tệ ... :(

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 không phân biệt chữ hoa chữ thường, vì vậy bạn nên sử dụng chữ hoa ở mọi nơi để lưu điểm trên mỗi ký tự chữ thường! ( "test"tất nhiên ngoại trừ )
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)

Báo giá đôi " 00100010thân thiện với môi trường hơn so với trích dẫn đơn ' 00100111.
Jacob Krall

3

Bình thường, 64

?qz"test"0l`sS.Bz

Kiểm tra xem đầu vào có được kiểm tra không và nếu không, hãy đếm số lượng 1 trong biểu diễn nhị phân của đầu vào.


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

Không có gì nhiều để nói ở đây: biến mọi ký tự thành giá trị ascii ( fromEnum) và tính 1s (thông qua a). Tổng hợp tất cả các kết quả.


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)

Đây là nỗ lực đầu tiên của tôi tại một sân golf JavaScript, vì vậy có lẽ nó rất vô dụng.


Nói chung, mọi người đều đồng ý rằng JavaScript golf cần một số dạng đầu ra khác hơn là ẩn. Đây có thể là một cảnh báo, document.write hoặc thậm chí là trả về hàm.
Mwr247

Bạn có thể di chuyển dấu nhắc nhanh của mình vào 's' đầu tiên trong câu lệnh if, được bao quanh bởi dấu ngoặc đơn, để lưu một vài byte. Bạn cũng có thể xóa '0' trong charCodeAt. Ngoài ra, một khoản tiết kiệm lớn bạn có thể thực hiện là sử dụng toán tử ternary thay vì câu lệnh if /
other

Cảm ơn rất nhiều! Tôi đã kết thúc bằng cách sử dụng dấu phẩy thay vì dấu ngoặc đơn cho phép gán nhanh chóng; nó lưu một byte khác. (: @ Mwr247
Zach Gates

s.split ('') thay vào đó có thể là s.split``, tiết kiệm 2 byte
Dendrobium

1
Nhận xét của Dendrobium ở trên @JacobKrall
Zach Gates

3

Ruby, 316 313

Rất đơn giản, tìm kiếm một số khả năng chơi gôn hơn:

b=gets.chomp;b=='test'?0:b.chars.map{|i|i.ord.to_s(2).count('1')}.inject(:+)
  • Được sử dụng bthay vì xđể tiết kiệm 3 điểm.

Bạn có thể sử dụng $*[0]thay vì gets.chomp(lấy đầu vào làm đối số dòng lệnh)
Mhmd

Báo giá đôi " 00100010thân thiện với môi trường hơn so với trích dẫn đơn ' 00100111.
Jacob Krall

Tên biến chữ hoa cũng thân thiện với môi trường hơn chữ thường tương đương. Hlà tốt hơn Icho cùng một lý do.
Jacob Krall

3

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

Một cổng của câu trả lời Pyth của tôi, ở trên.

Đầu vào được nhận dưới dạng một chuỗi (có dấu ngoặc kép):

"ABC"

1
Báo giá đôi " 00100010thân thiện với môi trường hơn so với trích dẫn đơn ' 00100111.
Jacob Krall

Một vài sửa đổi cơ bản có được điều này A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]với số điểm 243.
Kade


2

Bình hoa, 96

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

Một cổng của câu trả lời CJam của tôi, trên / dưới.


Chỉ cần một số lưu ý chung về Pyth: thay vì Icố gắng sử dụng ternary ?, nhưng trong trường hợp này vì nó là một bool bạn chỉ có thể sử dụng *(sau khi chuyển sang nthay vì q), klà tự động ""strên các chuỗi là như nhau a jk. Hy vọng bạn có niềm vui học tập pyth! :)
FryAmTheEggman

Đây là câu trả lời Pyth đầu tiên của tôi: P Thật khó để có được điều này, haha, mặc dù rất vui. Cảm ơn vì những lời khuyên! @FryAmTheEggman
Zach Gates

2

CJam, 83 81 79 77

Tốt nhất cho đến nay sau khi thử một số biến thể:

l0$"test"=!\:i2fbe_1b*

Dùng thử trực tuyến

Giải trình:

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

Ruby, 247

Cách tiếp cận đơn giản lặp qua tất cả các byte của đầu vào và tất cả các bit trong mỗi byte, tổng hợp thành biến d.

d được khởi tạo thành -2 vì h chứa dòng mới kết thúc từ đầu vào (trị giá 2 bit) và chúng tôi không muốn tính điều đó.

Tương tự như vậy hsẽ chứa testmột dòng mới, do đó, một dòng mới phải được bao gồm trong giá trị so sánh.

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

Khá tự giải thích.
Các xét nghiệm:

> 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, dấu chân 378, 98 byte

Một giải pháp C khá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);}

Cách thức hoạt động của nó là s thường được khởi tạo thành 0, nhưng trở thành -17 nếu đối số dòng lệnh là "test" (strcmp trả về 0 trên các chuỗi bằng nhau và khác không trên các chuỗi riêng biệt, do đó đảo ngược nó sẽ cho 1 nếu chuỗi là "kiểm tra"). Số -17 được chọn để bù cho dấu chân của 17 sẽ được tính cho "thử nghiệm". Việc tính toán dấu chân rất dễ dàng với các toán tử bitwise.

Chộp lấy! Ban đầu tôi đã bỏ lỡ "chiến thắng dấu chân ngắn nhất" vì vậy tôi đã nhắm đến mã ngắn nhất ... Tôi sẽ xem liệu tôi có thể làm cho "dấu chân" nhỏ hơn không.


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 không phải là rất xanh.

Phiên bản bị đánh cắp:

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được tuyên bố như là một cách Integerđể chúng ta có thể truy cập phương thức Integertĩnh bitCounttheo cách có ý thức về môi trường. Các bitCountphương pháp xử lý các chars như số nguyên và trả về số set bit.


1
Thú vị khi so sánh Java với Ceylon ... Java có một số chi phí do bản tóm tắt và câu lệnh in dài hơn. Mặc dù vậy, bitCount không giúp được gì, Ceylon không có thứ này. Ceylon có một cách dài hơn để truy cập vào các tham số dòng lệnh, và cũng cần kiểm tra xem chúng có thực sự được đưa ra không (trong đó chương trình của bạn chỉ đơn giản là ném một ArrayIndexOutOfBoundException). Hàm tổng của Ceylon chắc chắn ngắn hơn so với việc thêm thủ công vào Ceylon (nhưng Java không có sự hiểu biết, vì vậy, thêm thủ công sẽ tốt hơn là tự xây dựng một Iterable).
Paŭlo Ebermann
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.