Kaynak kodu ekolojik ayak izi


102

Az önce bir Alman otomobil imalat şirketi tarafından işe alındınız. Bir mühendis olarak ilk göreviniz, ASCII dizelerinin ekolojik ayak izlerini hesaplayan bir program yazmaktır.

Karakterin ekolojik ayak izi şu şekilde hesaplanır:

Karakterin ASCII kodunu ikilik olarak yazın ve 1 sayısını sayın.

Örneğin, A2'lik bir alan var ancak O5 alanlı daha kirli.

Bir dizgenin global ayak izi, karakterlerinin ayak izlerinin toplamıdır. Boş bir dizgenin ayak izi sıfırdır.

Programınız bir ASCII dizesini parametre olarak (komut satırı veya giriş yoluyla) kabul etmeli, ekolojik ayak izini hesaplamalı ve çıkarmalıdır. Programın kendisi ASCII kodlu olmalıdır.

Yine de bir hıçkırık var. Şirketiniz daha katı çevre kuralları olan yeni bir pazara girmek istediğinden, programınızı "test modunda" farklı davranacak şekilde ayarlamanız gerekir. Böylece:

Program dizeyi testparametre olarak aldığında 0 vermelidir .

puanlama

En küçük ekolojik ayak izine sahip kaynak kodu kazanır (ve evet, cevap testyasaktır!)


36
Üzgünüm, haberlere yetişmedim, fakat daha yeni okudum. Alman otomobil şirketine kesinlikle Volkswagen denmediğini varsayabilir miyiz?
Seviye Nehri St

7
Referans için, en \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
pahalıdan

19
@steveverrill Kurgusal bir şirket, ancak adı gerçekten V ile başlıyor ve ortasında bir yerde W var. Ancak gerçeklikle herhangi bir benzerlik sadece bir tesadüf, en azından birileri bizi dava ediyor.
Mindwin

1
İşlevlere izin verilir (programlar yerine)?
Luis Mendo

12
Sana yalan söylüyorlar! 1'ler, ekolojik olarak 0'dan daha kolay. Kanıt ister misin? Kaynak kodunuzu ikili olarak yazdırın. 0'lar 1'lerin neredeyse iki katı mürekkep kullanırlar. Ve koyu renkli bir arka plana sahipseniz, ekranınızda görüntülemek için daha fazla elektrik harcarlar. (Beyaz bir arka plana kod yazarsanız, zaten tüm bu beyazı oluşturan elektronları boşa harcıyorsunuzdur, bu nedenle açıkça çevre dostu olan herhangi bir programcının editöründe siyah bir arka plan kullanması gerekir.) Boşluk ...
Darrel Hoffman

Yanıtlar:


45

CJam, 33 31

"",AA#b:c~

1130000000000000000003400000001160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Kod eşdeğerdir

11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000098
AA#b:c~

çevrimiçi olarak test edilebilir .

Bu nasıl çalışır

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

Bu nasıl çalışır

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.

Bu kaynak kodunun ekolojik ayak izi 75'dir.


3
Vay, bu çok zekice. Sanırım, ihtirasınız asla koşturamayacağınızdır, çünkü dünyadaki bütün hafıza bütün kodu tutamaz.
Reto Koradi 25:15

49
Bu küçük bir rahatsızlık. Doğaya bir fiyat koyamazsın.
Dennis,

Bu güzel bir püf noktası, ancak çalıştırılamazsa geçersiz
edc65

5
@PyRulez: Maddeden başka bir şeyden kurgulanmadığı ve uzaydan başka bir şeyi işgal etmediği sürece hiçbir şey tarafından değil.
vsz

5
Neden sadece Lenguage'i kullanmıyorsun?
jimmy23013

40

Lenguage , 0


Çıkış olan tekli oranlarda konuşma / Brainfuck 10 tabanına tamsayılar baskı aklı başında hiçbir yolu yoktur, çünkü.

Gerçek kaynak kodu içerir

22360559967824444567791709913713659826044558304969374451791514225490473373040212332757409553558758107085015797320276213515502796255082717802632399123502087743818475438512153373406931103005017157351410347278489842099128517039634739852783737052963203448945756470632484148121769939122103257063633371522287190530269279693540898545359211009781370158317748609540216376596783541124510013448091325488601732964773653391702083563797082990404753843419895799343996435988722965711513708742853668363743953430527328863418281733901770990932025503662188187254784985474815936854540100376410040743052620419372327997519047616042603909398552951490180076364164838561112002025592431155898041427468731461614504254168899805662501979953318388813759833797929243626668399650485310047043700001093878284174322463350892654886806075148010832042248607926124030339950499631072150856939786062937034833055717723216663269161130154002679878012158315587925933383341827053312086716181702533743607685576475754259877651521989944802973721727159955208722180232955193930065862370838526521351991966172723976565264862909528310162816593997640732796289501819499741414526385058421824690665542546821941125191276568479078107133076037506211133628962099403163812267452274532219562823184225236020523509355625620557197876838014050964240952738109101849512504021041103516630358995290177306585560988278630098667702211916671663291473843258785929522017507744814910480115446168939335008597569919072874897148594826036210511162928991890818427747059833051607455121463371211282760364668765311589329918870071117807132901910082663054895226456039171170783440772764031568108965851688162729239711772886386306884508520204834432674839183166053019421652064937613583258148354531835035461504442885024563141848164279928769795684221364984104923764359842286827870778678989243517189772102669283996930513577004801536579491093711362942690905779844535371088542020595945700544234301668098553671685123172583259206072965508639556627967633275762621813851479909708616154198658896714629908456913467267354690109885368211752176196164620615081464122410029328694509842558492529684841818953632659248840216891072110853731776562597900145806210691868173380612838327841104919352821441230296200143603175486627682007399030356592930049570084097858148122367

null bayt ve aşağıdaki Brainfuck programına eşdeğerdir:

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

Brainfuck.tk adresinde çevrimiçi olarak deneyin .

Brainfuck kodunun uzunluğu oldukça düşüktür - yeni başlayanlar için tüm ASCII karakterlerinin ayak izlerini kodladım - ancak puan 0, puan 0 ...


Hayır, Lenguage aslında boş baytları destekliyor mu ?!
Beta Çürüme

20
Bunun gibi bir cevabın halka saygı duymadığını hissediyorum: hile yapmak ve sistemi oynamak ... Ama sonuçta bu zorluğun asıl amacı budur. +1
edc65

1
Lenguage / Brainfuck, 10 tabanındaki tamsayıları yazdırmanın mantıklı bir yoluna sahip olmadığı için çıktı birleşik. ” . Lenguage / Brainfuck'ın amacının bir kısmının bir şey yapmanın aklı başında bir yolu olmadığını :) sanmıştım.
Adam

9
Verdiğiniz tanımdan programınızı yeniden oluşturmaya çalıştığımda bu benim için pek işe yaramadı. Lütfen Lenguage kaynağının tamamını gönderir misiniz, böylece programınızın yeniden oluşturma girişimimden farklı olduğunu nerede görebilirim? ;-)
Cort Ammon

1
Beni şaşırtan şey Lenguage'ın boşları desteklemesi değil, BF'de böyle bir program yapmayı başarmanızdır.
Perili

12

PowerShell, 337 344 304 puan

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

SİZE AŞAĞIDAKİ OLANAK HAZIRLANIYOR!

Girdileri alır $A, sonra karakter dizisi olarak atlar, sonra her karakter için bir for-for döngüsünü tekrar eder [convert]::ToString(), karakteri bu pozisyondaki ikiliye dönüştürmek için gülünç wordy kullanır , 0 harflerini hiçbir şeyle değiştirmez, sonra uzunluğu sayar ve buna ekler $B. Sonunda, dinamik bir dizi (yani, eğer içine indeksine bir eşdeğerlik kullanır $Aolup test, daha sonra -CEQisimli $TRUEikinci eleman, bu nedenle dizinler 0).

Edit1 - Düzeltilmiş test senaryosu "TEST"
Edit2 - Endekslerinden ziyade karakterleri kendi üzerinde yineleyerek -replaceve hiçbir şeyle değiştirmiyorsanız, ikinci bir parametreye ihtiyaç duymadığını hatırlayarak birkaç puan topladı .


Çifte alıntı " 00100010tek bir alıntıdan daha çevre dostudur ' 00100111.
Jacob Krall

Girdi için hatalı değeri 0 döndürür"TEST"
Jacob Krall

1
@JacobKrall Çift tırnak üzerinde iyi yakalama ". Ayrıca büyük / -CEQküçük harf duyarlılığı için düzeltildi . Puanları biraz arttırdı, çünkü ' 'testlerimde doğru şekilde sınırlamadığım için hatalı puan verdim.
AdmBorkBork

9

Pyth - 52 49

@ Orlp sayesinde üç puan tasarruf edin.

*/.BQ`1nQ"test

Ayakizi tasarrufu için tırnak içine girdi.

Test Takımı .


Ah, neredeyse seninle aynı şekilde oldum, ama cevabım çok benzer ve önce sen gönderdin. 3 @,0ile *tasarruf yapmak için değiştirin :)
orlp

1
@Maltysen Üç puan bulduğunuzu söylüyorsunuz ama kaynak hala söylüyor @,0, değiştirmeyi unuttun mu?
alkış

@ConfusedMr_C evet. Ben sadece kalıcı bağlantıyı değiştirdim ve gerçek cevabı unuttum.
Maltysen

7

Ortak Lisp, 294 281 235

Puanı düşürmek için değişken isimleri olarak @(maliyet 1) ve !(maliyet 2) kullandım (düzenleme: ve @fonksiyonda en fazla meydana gelen değişken için kullanmam daha iyi olur ). TOO SHOUTING AM daha ucuz olduğu için.

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

Oldukça baskılı

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

Eh, skor 294'e benziyor;)
Cabbie407 25:15

@ Cabbie407 Puanlama ile ilgili kısmı özledim, üzgünüm :-)
coredump

1
@ Cabbie407 Birkaç dakikalığına çok düşük bir puan alabilmeye garip hissettim ...
coredump

1
Sadece size bildirmek istedim, çünkü puanlama yöntemini bilmek, muhtemelen kodunuza farklı bir açıdan bakarsınız. Ve görüyorum ki zaten bir şeyi değiştirmişsin.
Cabbie407

1
@ Cabbie407 Teşekkür etmeyi unuttum, btw. Teşekkürler.
coredump

6

JavaScript, 279

Hata düzeltmesini düzenle (her karakterin bit 1'ini saymadı)

Popup ile giriş ve çıkış yapabileceğiniz eksiksiz bir program. Firefox'ta test edilmiş, herhangi bir modern tarayıcıda çalışması gerekir.

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

Bazı araçlar (Firefox ile test edilmiştir)

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
Bu cevap geçersiz - test0 yerine 17 çıktı
veriyor

@ASCIIThenANSI değil tarayıcımda yok. Ama tekrar kontrol edeceğim
edc65 25:15

Bu komik ... Sayacınızla test ediyorum, 279 alıyorum ve kendisiyle test ediyorum, 277 alıyorum. Hangisinin doğru olduğunu merak ediyorum; newlines ile ilgisi olabilir mi?
ETHproductions

@ETHproductions Çifte kontrolden geçtim ve doğru sayı 279'du. Fakat yeni satır içeren bir dizgeyle çalışmıyor - promptişlevle ilgili bir sorun . Firefox'ta promptyeni satırları (2bit) boşluklara (1bit) çevirir, böylece 279 yerine 277 olur
edc65

@ETHproductions ... Chrome'da (Windows'ta) yeni satır bir CR LF çifti (3bit + 2bit) olur ve sayım yine yanlıştır
edc65

6

Julia, 254 246 232

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

count_onesİşlevi, giriş ikili gösteriminde olanların sayısını sayar.

FryAmTheEggman sayesinde ekolojik ayak izim azaldı!


1
Sorun değil, sadece çevreyi gerçekten önemsiyorum;)
FryAmTheEggman 25:15

6

Python 3, 271

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

3
Bir çok küçük değişiklik bana 228
FryAmTheEggman

2
Neden boollerin teker teker olduğu avantajından yararlanmıyorsunuz? z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test")).... @ FryAmTheEggman jinx?
NightShadeQueen

1
@NightShadeQueen Haha, bu bir günlüğüne gönderemeyeceğim anlamına mı geliyor? : X Her neyse bu siteye yeni bir kullanıcı için çok güzel bir yakalama, iyi iş! Neyse, PPCG'ye hoş geldiniz! :) Ayrıca, konu hakkında daha fazlası, noktalı virgül, yeni bir satırdan biraz daha pahalıya mal olduğu için kaldırılabilir.
FryAmTheEggman 25:15

5

Perl, 136 118 73

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

Tümünü @ile değiştir\0

Kullanım örneği:

perl -p entry.pl entry.pl

5

MATLAB, 198 194 bayt

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

İlk olarak, string STDIN'den inputfonksiyon aracılığıyla okunur . Bu olduğunda, giriş dizesini dizeyle karşılaştırırız test. Sonuç değilse test , her karakteri ASCII koduna ve sonra ikili gösterimini dönüştürürüz dec2bin. Bu işlevin güzel bir sonucu, bir dize gönderirseniz, ASCII kodunun ikili gösteriminin satır başına bir karakter olarak sınırlandırılmasıdır.

Örnek olarak:

>> dec2bin('ABCD')

ans =

1000001
1000010
1000011
1000100

dec2binbir karakter dizisi çıkarır. Bu gerçekleştiğinde, matriks double0s ve 1s'den oluşacak şekilde dönüştürülmek üzere 0 için ASCII kodu olan 48 değerini çıkarın . Bu gerçekleştiğinde, nnzbu matristeki toplam sıfır olmayan öğelerin sayısını sayar. Bu sonucun, dize ile karşılaştırılan dizenin karşıtı ile çarpıldığına dikkat edin test. Dize olmasa da testayak izi hesaplamasını alırız. Eşitse, çarpma 0 ile sonuçlanır.

Bazı örnekler:

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

İletişim Araç Kutusu'nu kullanmanıza izin verilirse, de2bibunun yerine kullanabilir ve -48sayısal bir türe (işlev adındaki 2 fazla karakterin yanı sıra) çevirmekten kaçınabilirsiniz .
kabı

5

darbe 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

Oldukça basit. Girişteki karakterleri önce ascii'ye çevirir (önce printf %dve 'sonra sayının başında ikili (ile bc) olur, sıfırları çıkarır ve karakter sayısını sayar.

Harika bir cevap değil, henüz bir bash girişimi görmemiştim.

İlk cevabım giriş dizgisinin sadece komut satırında verilmesine izin verdiği için değiştirildi (yani, eğer kelimelerin çoğaltılması durumunda birden fazla giriş paragrafı oldu) fakat diğer bazı cevapları okuduktan sonra, alıntı yapıldığını varsayabileceğimi düşünüyorum. $1


1
Programlama Bulmacaları ve Kod Golf'üne Hoş Geldiniz! 1. doile {ve doneile değiştirebilirsiniz }. 2. Ayrıca etraftaki boşluklara ihtiyacınız yok <<<. 3. \nBir değişmez satır besleme ile değiştirebilirsiniz .
Dennis,

Teşekkürler @Dennis. Bu sitedeki zorluklardan biri de "iyi alışkanlıklar" bir demet öğrenmektir :).
Adam,

3
Kesinlikle öyle. Henüz yapmadıysanız, Bash’de golf oynamak için İpuçları’ı incelemenizi öneririz . Harika bir kaynak.
Dennis,

3
Bu zorluk golf standartlarına göre bile garip! Ekstra karakterler hala puan kazandırabilir. Kullanmak =ve ||15 maliyeti ise kullanırken !=ve &&sadece 13! Ekstra bir karakter ancak iki puan kazandırır ...
Adam

5

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

Bu orjinal, asılsızdı:

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

Bu, argümanı bir komut satırı parametresinden alır ... process.arguments, (muhtemelen boş) bir dizeler dizisidir, bu nedenle bunlardan birini kullanmadan önce gerçekten olup olmadığını kontrol etmemiz gerekir. Diğer durumda bir hata mesajı veriyoruz (bu, soru için gerekli değildir ve sonraki sürümlerde atılacaktır).

Ceylon'un sumişlevi boş bırakmayan, tatmin etmesi gereken Summable, yani plusInteger gibi bir metoda sahip olan bir tür öğeden tekrarlanabilir . (Boş dizilerle çalışmaz, çünkü her bir Summable türünün kendi sıfıra sahip olması ve çalışma süresinin hangisinin ne demek olduğunu bilme şansı yoktur.)

Bir dizgenin elemanları veya bir tamsayının bitleri, boş olmayan bir yinelenemez değildir. Bu nedenle burada bazı unsurları belirleyerek tekrarlanabilir bir yapı oluşturmak için özelliğini, ardından bir “anlama” (sıfıra veya daha fazla eleman olarak değerlendirilecek) kullanıyoruz. Bu yüzden karakter harfine bir tane ekliyoruz (ancak karşılık gelen bit ayarlandığında), dizge harfine karakterlerin sonucunu ekliyoruz. (Kavrama, ancak alma işlevi gerçekte yinelendiğinde değerlendirilir, yinelemeyi oluştururken değil.)

Bakalım bunu nasıl daraltabileceğimizi görelim. İlk olarak, işlevlerin her biri yalnızca bir yerde çağrılır, bu nedenle onları satır içi yapabiliriz. Ayrıca, yukarıda belirtildiği gibi hata mesajından kurtulun. (764 ayak izi noktaları.)

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

Aslında iç içe yuvaya ihtiyacımız yok sum, bunu büyük bir kavrayış haline getirebiliriz. (Bu, bize sum({0,})sonunda en sonunda elimine edilecek olan beyaz alan için 37 ayakiz puanını ve biraz daha fazlasını kurtarıyor .) Bu, 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 }));
        }
    }
}

Özel kasalı "test"dizgeye benzer bir prensip uygulayabiliriz : bu durumda sonuç 0'dır (yani, hiçbiri toplama katkısı yoktur), bunu sadece toplamın bir parçası olarak yapabiliriz (ancak koşulu tersine çevirmeliyiz) . Bu, esas olarak bizi print(0);, bazı parantezleri ve bir sürü girinti alanını, 571'in kapladığı alandan kurtarıyor :

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

Birincisi için de aynısını yapıyoruz, ifşimdi hiçbir argüman vermeyen yan etki ile 0hiçbir şey yapmamak yerine çıktılar . (En azından burada olacağını düşünmüştüm, bunun yerine ebedi bir döngü ile asılı gibi görünüyor? Garip.)

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

Aslında buradaki ()for sumişlevini ihmal edebiliriz ; bunun yerine , kullanan ve alternatif ifadeleri yinelenebilir argümanlara dolduracak alternatif bir işlev çağrısı sözdizimi kullanabilirsiniz. Bu ayak izi 538 var:{...}()

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

İşlev ismini footprint(40) p(3) ile değiştirmek, 37 puan daha kaydeder ve bizi 501'e getirir. (Ceylon işlev isimleri küçük harf karakterlerle başlamalıdır, bu nedenle 3 noktadan az alamayız.)

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

Değişken isimleri s(5) ve c(4), i(4), aynı zamanda optimal değildir. Onları a(argüman), d(hane?) Ve b(bit indeksi) ile değiştirelim. Ayak izi 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 });
}

Kalan boşluk olmayan optimizasyon göremiyorum, bu yüzden gerekli olmayan boşlukları kaldıralım (her alan için 1 nokta, iki satır sonunun her biri için iki tane):

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'ye göz atarken, Character.hash öğesinin integerözniteliği ile aynı değeri döndürdüğünü gördüm . Fakat 30 yerine sadece 14 puan kaldı, bu yüzden 451'e düştük!

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

edit - 'test' vakasını unuttum ... çok fazla pahalı.

editedit - bir UPPERCASE fırsatını kaçırdı.

editeditedit - yorum önerilerini bir araya getirdi (Thanks TimmyD).

düzenleme 4 - D, C (2 ve 3) 'den daha ucuz bir değişkendir.

düzenleme 5 - Büyük / küçük harf duyarlılığı kontrolü nedeniyle 295'e dön.

Dize üzerinde dolaşır ve ASCII değerindeki karakterlerden kayan 1leri sayar.

TimmyD'ye Hatt bahşişi büyük harfli karakterler kullanma ve sonunda dizi indeksini kullanma öngörüsünü verdi.


1
Güzel yaklaşım! Golfs Bir çift aşağı getiriyor (sıfır varsayılan olacaktır olarak, $ B başlatma kaldırıldı, birkaç parens kaldırıldı bazı noktalı virgül kaldırıldı) 293 PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
AdmBorkBork

"Güzel yaklaşım!" Okuduğumda ne anlama geliyor? ve Wii Golf'ün sesini duydunuz mu? İşaretçiler için teşekkürler! PowerShell konsolunda test ederken başlatma beni tetikliyordu ve içeride bıraktım. Aksi halde bilmek güzel.
Kırk3

Evet - konsolu kullanıyorsanız, bu bir REPL ortamıdır, atanan değişkenlerde bir satırdan diğerine kalır. Bir .ps1 olarak kaydederseniz, aynı kabuktan yukarı ok-enter tuşuna bassanız bile, $ B (ve diğer tüm değişkenler) yeniden başlatılır. Örneğin,PS C:\scripts> .\ecological-footprint.ps1
AdmBorkBork

Girdi için hatalı değeri 0 döndürür"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

Netlik için yeni satırlar (puana dahil edilmedi) eklendi. Değişken isimlerini büyük harfe dönüştürerek 360'a yükseltilebilir, ancak daha iyi bir şeyler düşünmeye çalışacağım.

Giriş, komut satırı üzerinden gerçekleşir, bunun anlamı yok girişinde farklılaşmadır. Stdin aracılığıyla girdi için daha kötü bir puan bekliyorum.

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 Ekolojik Ayak İzi (hala çok fazla) , 102 91 Bayt

PHP'nin sadece test modunda çevre dostu olduğu anlaşılıyor. ;)

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

Komut satırından şöyle çalışır:

php footprint.php hello
php footprint.php test

whileforAynı karakter sayısını paylaşmalarına rağmen çevre dostu . Ayrıca büyük değişken değişken isimleri küçük harf emsallerinden daha iyi bir yer kaplar.

Düzenle

  • büyük harf işlev isimleri kullanarak 40 puan kaydetti.
  • decbinyerine 38 puan kazandıbase_convert

1
@Adam İşte bildirimler hakkında ve burada PHP açılış etiketleriyle ilgili bir tartışma . Umarım bu sizin için yararlıdır.
insertusernamehere 9:15

4

VBA, 475 418

57 puan için teşekkürler Jacob

  • Dizeyi Bayt Dizisine Dönüştürür (128, "Dizeyi Unicode'dan sistemin varsayılan kod sayfasına dönüştürür" için vba kısayoludur "Mac'te çalışmaz ....)

  • Yine de bayt dizisini İkiliye çeviren ve her şeyi bir araya getiren döngüler.

  • test için kontrol eder
  • Tüm 0'ların hiçbir şeyle değiştirilmediği dizenin uzunluğunu yazdırır

VBA neden golf oynamakta bu kadar kötüsün ... :(

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 büyük-küçük harf duyarlı değildir, bu nedenle küçük harf karakter başına bir nokta kaydetmek için her yerde büyük harf kullanmanız gerekir! ( "test"elbette hariç )
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)

Çifte alıntı " 00100010tek bir alıntıdan daha çevre dostudur ' 00100111.
Jacob Krall

3

Pyth, 64

?qz"test"0l`sS.Bz

Girişin test edilip edilmediğini kontrol eder ve eğer değilse, girişin ikili gösteriminde 1 sayısını sayar.


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

Burada söylenecek fazla bir şey yok: her karakteri ascii değerine ( fromEnum) çevirin ve 1s'yi (üzerinden a) hesaplayın . Tüm sonuçları toplayın.


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)

Bu benim bir JavaScript golfündeki ilk denemem, bu yüzden muhtemelen çok ungolfed.


Genellikle JavaScript golfünün örtük dışında bir tür çıktıya ihtiyaç duyduğu konusunda fikir birliğine varıldı. Bu bir uyarı, document.write veya bir işlev dönüşü olabilir.
Mwr247

Bilgi istemi atamanızı, parantezle çevrili if ifadesinde bir kaç bayt kaydetmek için ilk 'ler' e taşıyabilirsiniz. CharCodeAt içindeki '0'ı da kaldırabilirsiniz. Ayrıca, yapabileceğiniz büyük bir tasarruf, if / else ifadeleri yerine üçlü işlecini kullanmaktır =)
Mwr247 25:15

Çok teşekkürler! Olursa, istemi atama için parantez yerine virgül kullandım; başka bir bayt kaydeder. (: @ Mwr247
Zach Gates

s.split ('') yerine s.split`` olabilir, 2 byte tasarruf
Dendrobium

1
Per Dendrobium'un yukarıdaki yorumunda @JocobKrall
Zach Gates

3

Ruby, 316 313

Çok basit, daha fazla golf yapma imkanı arıyor:

b=gets.chomp;b=='test'?0:b.chars.map{|i|i.ord.to_s(2).count('1')}.inject(:+)
  • 3 puan kazanmak byerine kullanılır x.

Sen kullanabilirsiniz $*[0]yerine gets.chomp(bir komut satırı argümanı olarak girdi alır)
mhmd

Çifte alıntı " 00100010tek bir alıntıdan daha çevre dostudur ' 00100111.
Jacob Krall

Büyük harf değişken isimleri de eşdeğer küçük harflerden daha çevrecidir. aynı sebepten Hdaha iyidir I.
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 cevabımın bir limanı, yukarıda.

Giriş bir dize olarak alınır (tırnak işaretleri ile):

"ABC"

1
Çifte alıntı " 00100010tek bir alıntıdan daha çevre dostudur ' 00100111.
Jacob Krall

Bir kaç temel değişiklik A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]243 puanla elde etti.
Kade


2

Pyth, 96

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

CJam cevabımın bir limanı, üstünde / altında.


Sadece bazı Pyth genel notları: üçlüyü Ikullanmaya çalışmak yerine ?, ancak bu durumda bir bool olduğundan, sadece *( nyerine geçtikten sonra q) kullanabileceğiniz, kotomatik olarak ""ve sdizelerde aynıdır a jk. Umarım eğlenceli öğrenme pyth var! :)
FryAmTheEggman 25:15

Bu benim ilk Pyth cevabımdı: P Bu haha, eğlenceli olsa da almak için yeterince zordu. İpuçları için teşekkürler! @FryAmTheEggman
Zach Gates

2

CJam, 83 81 79 77

Birkaç varyasyon denedikten sonra şimdiye kadarki en iyisi:

l0$"test"=!\:i2fbe_1b*

Çevrimiçi deneyin

Açıklama:

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

Girdideki tüm baytlar ve her bayttaki tüm bitler arasında döngü oluşturma, değişkene toplanır d.

d-2'ye ilklendirildi çünkü hgirdideki sonlandırıcı yeni satırı içeriyor (2 bit değerinde) ve bunu saymak istemiyoruz.

Benzer şekilde takip eden bir yeni satır hiçerecektir test, bu nedenle karşılaştırma değerine bir yeni satır eklenmelidir.

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

Oldukça kendini açıklayıcı.
Testler:

> 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 yer kaplayan, 98 bayt

Başka bir C çözümü:

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

Bunun çalışma şekli s'nin genellikle 0 olarak başlatılmasıdır, ancak komut satırı bağımsız değişkeni "test" ise -17 olur (strcmp eşit dizelerde 0 döndürür, farklı dizelerde sıfır olmaz, bu durumda dizge 1 ise ters çevirir "test" tir). -17 sayısı, "test" için hesaplanacak olan 17 ayakizini telafi etmek için seçildi. Ayakizi hesaplaması bitsel operatörler ile kolaydır.

Tuttur! Başlangıçta "en kısa ayakizi kazancı" nı kaçırdım, bu yüzden en kısa kodu hedefliyordum ... "Ayakizi" ni daha küçük yapıp yapamayacağımı göreceğim.


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 çok yeşil değil.

Ungolfed versiyonu:

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

DBir ilan edilir Integeryüzden erişebilir Integer'ın statik bitCount, çevre bilincine şekilde yöntemle. bitCountYöntem davranır chartamsayı olarak S ve uçlardan sayısını verir.


1
Java'yı Seylan'la karşılaştırmak ilginç ... Java, kazan plakası nedeniyle biraz ek yüke ve daha uzun bir bildiriye sahip. BitCount yardımcı olur, ancak Ceylon'da bu yoktur. Ceylon'un komut satırı parametrelerine erişmek için daha uzun bir yolu vardır ve ayrıca gerçekten verilip verilmediklerini de kontrol etmeleri gerekir (programınız yalnızca bir ArrayIndexOutOfBoundsException atacak). Ceylon'un toplam işlevi kesinlikle Ceylon'a manuel olarak eklemekten daha kısadır (ancak Java’nın anlama hakkı yoktur, bu nedenle el ile ekleme kendiniz yinelenebilir bir yapı oluşturmaktan daha iyidir).
Paŭlo Ebermann 28:15
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.