Kode sumber jejak ekologis


102

Anda baru saja dipekerjakan oleh perusahaan manufaktur mobil Jerman. Tugas pertama Anda, sebagai insinyur, adalah menulis sebuah program yang menghitung jejak ekologis string ASCII.

Jejak ekologis karakter dihitung sebagai berikut:

Tulis kode ASCII karakter dalam biner, dan hitung angka 1-nya.

Misalnya, Amemiliki jejak 2, tetapi Olebih kotor dengan jejak 5.

Jejak global dari sebuah string adalah jumlah dari jejak kaki karakternya. String kosong memiliki jejak nol.

Program Anda harus menerima string ASCII sebagai parameter (melalui baris perintah atau input), menghitung jejak ekologisnya, dan mengeluarkannya. Program itu sendiri harus dikodekan ASCII.

Namun ada masalah. Karena perusahaan Anda ingin memasuki pasar baru dengan aturan lingkungan yang lebih ketat, Anda perlu menyesuaikan program Anda sehingga berperilaku berbeda dalam "mode uji". Jadi:

Program harus menampilkan 0 ketika menerima string testsebagai parameter.

Mencetak gol

Kode sumber dengan jejak ekologis terkecil menang (dan ya, jawabannya testdilarang!)


36
Maaf, saya belum mengikuti berita, tapi saya baru saja membacanya. Bisakah kita menganggap perusahaan mobil Jerman TIDAK disebut Volkswagen?
Level River St

7
Untuk referensi, karakter yang paling mahal hingga yang lebih murah:\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 Ini adalah perusahaan fiksi, tetapi namanya memang dimulai dengan V dan memiliki huruf W di tengah. Tetapi kesamaan dengan kenyataan hanyalah kebetulan, paling tidak seseorang menuntut kita.
Mindwin

1
Fungsinya diizinkan (bukan program)?
Luis Mendo

12
Mereka berbohong padamu! 1 lebih ramah secara ekologis daripada 0. Ingin bukti? Cetak kode sumber Anda dalam biner. 0's menggunakan tinta hampir dua kali lipat dari 1. Dan jika Anda kode dengan latar belakang gelap, mereka juga membuang lebih banyak listrik untuk ditampilkan di layar Anda. (Jika Anda membuat kode dengan latar belakang putih, Anda sudah membuang-buang elektron untuk merender semua putih itu, jadi jelas setiap programmer yang sadar lingkungan harus menggunakan latar belakang hitam di editor mereka.) Untuk menjadi lebih ramah lingkungan, kita semua harus menulis dalam Ruang putih ...
Darrel Hoffman

Jawaban:


45

CJam, 33 31

"",AA#b:c~

Ada 113000000009500000034000000011110000101000000001150000000116000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000000000000000000

Kode ini setara dengan

11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000000420000000058000000010500000000500000000102000000009800000000490000000102000000009800000000490000000098
AA#b:c~

yang dapat diuji secara online .

Bagaimana ini bekerja?

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

Bagaimana cara kerjanya

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.

Kode sumber ini memiliki jejak ekologis 75.


3
Wow, itu pintar. Saya kira peringatannya adalah Anda tidak pernah bisa menjalankannya, karena semua memori di dunia tidak dapat menampung seluruh kode.
Reto Koradi

49
Itu sedikit ketidaknyamanan. Anda tidak bisa memberi harga pada alam.
Dennis

Itu trik yang bagus, tetapi tidak valid jika tidak dapat dijalankan
edc65

5
@PyRulez: Bukan oleh apa pun kecuali itu akan dibangun dari sesuatu selain materi dan menempati sesuatu selain ruang.
vsz

5
Mengapa tidak hanya menggunakan Bahasa?
jimmy23013

40

Bahasa , 0


Keluarannya dalam kondisi unary , karena Bahasa / Brainfuck tidak memiliki cara waras untuk mencetak bilangan bulat di basis 10.

Kode sumber aktual berisi

22360559967824444567791709913713659826044558304969374451791514225490473373040212332757409553558758107085015797320276213515502796255082717802632399123502087743818475438512153373406931103005017157351410347278489842099128517039634739852783737052963203448945756470632484148121769939122103257063633371522287190530269279693540898545359211009781370158317748609540216376596783541124510013448091325488601732964773653391702083563797082990404753843419895799343996435988722965711513708742853668363743953430527328863418281733901770990932025503662188187254784985474815936854540100376410040743052620419372327997519047616042603909398552951490180076364164838561112002025592431155898041427468731461614504254168899805662501979953318388813759833797929243626668399650485310047043700001093878284174322463350892654886806075148010832042248607926124030339950499631072150856939786062937034833055717723216663269161130154002679878012158315587925933383341827053312086716181702533743607685576475754259877651521989944802973721727159955208722180232955193930065862370838526521351991966172723976565264862909528310162816593997640732796289501819499741414526385058421824690665542546821941125191276568479078107133076037506211133628962099403163812267452274532219562823184225236020523509355625620557197876838014050964240952738109101849512504021041103516630358995290177306585560988278630098667702211916671663291473843258785929522017507744814910480115446168939335008597569919072874897148594826036210511162928991890818427747059833051607455121463371211282760364668765311589329918870071117807132901910082663054895226456039171170783440772764031568108965851688162729239711772886386306884508520204834432674839183166053019421652064937613583258148354531835035461504442885024563141848164279928769795684221364984104923764359842286827870778678989243517189772102669283996930513577004801536579491093711362942690905779844535371088542020595945700544234301668098553671685123172583259206072965508639556627967633275762621813851479909708616154198658896714629908456913467267354690109885368211752176196164620615081464122410029328694509842558492529684841818953632659248840216891072110853731776562597900145806210691868173380612838327841104919352821441230296200143603175486627682007399030356592930049570084097858148122367

null byte dan setara dengan program Brainfuck berikut:

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

Cobalah online di brainfuck.tk .

Panjang kode Brainfuck sangat suboptimal - sebagai permulaan, saya telah membuat hardcode jejak kaki semua karakter ASCII - tetapi skor 0 adalah skor 0 ...


Tidak mungkin, Bahasa sebenarnya mendukung byte nol ?!
Beta Decay

20
Saya merasa jawaban seperti ini tidak menunjukkan rasa hormat kepada publik: itu curang, dan bermain sistem ... Tapi inilah inti dari tantangan ini. +1
edc65

1
"Keluarannya di unary, karena Bahasa / Brainfuck tidak memiliki cara waras mencetak bilangan bulat di basis 10." . Saya pikir bagian dari titik bahasa / Brainfuck adalah bahwa ia tidak memiliki cara yang waras untuk melakukan apa pun :)
Adam

9
Ini tidak berhasil bagi saya ketika saya mencoba membuat ulang program Anda dari definisi yang Anda berikan. Bisakah Anda memposting sumber bahasa lengkap sehingga saya bisa melihat di mana program Anda berbeda dari upaya saya untuk membuatnya kembali? ;-)
Cort Ammon

1
Yang mengherankan saya adalah bahwa Bahasa tidak mendukung nulls, tetapi bahwa Anda berhasil membuat program seperti itu di BF. Menghantui ...
Erik the Outgolfer

12

PowerShell, 337 344 304 poin

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

AKU BERHENTI PADA ANDA KARENA ITU LEBIH MURAH!

Mengambil input sebagai $A, lalu melemparkan sebagai array-char, kemudian beralih pada for-loop pada setiap karakter, menggunakan kata bertele-tele [convert]::ToString()untuk mengubah karakter pada posisi itu menjadi biner, menggantikan semua 0 dengan tidak ada apa pun, kemudian menghitung panjangnya, dan menambahkan itu ke $B. Pada akhirnya, gunakan ekuivalensi untuk mengindeks ke dalam array dinamis (yaitu, jika $Aadalah test, maka -CEQadalah $TRUE, sehingga indeks ke elemen kedua, 0).

"TEST"
Sunting1 - Koreksi test case Sunting2 - Golf beberapa poin dengan iterasi karakter sendiri daripada indeks mereka, dan dengan mengingat bahwa -replacetidak memerlukan parameter kedua jika Anda menggantinya dengan apa-apa.


Kutipan ganda " 00100010lebih ramah lingkungan daripada kutipan tunggal ' 00100111.
Jacob Krall

Mengembalikan nilai 0 yang salah untuk input"TEST"
Jacob Krall

1
@ JacobKrall Bagus menangkap double-quote ". Juga dikoreksi dengan -CEQsensitivitas case. Ini menaikkan poin sedikit, karena saya salah mencetak ' 'karena saya tidak membatasi dengan benar pada tes saya.
AdmBorkBork

9

Pyth - 52 49

Hemat tiga poin berkat @orlp.

*/.BQ`1nQ"test

Mengambil input dalam tanda kutip untuk menghemat jejak.

Test Suite .


Ugh, saya hampir sama dengan Anda, tetapi jawaban saya terlalu mirip dan Anda diposting terlebih dahulu. Ganti @,0dengan *untuk menyimpan 3 :)
orlp

1
@Maltysen Anda mengatakan bahwa Anda menemukan tiga poin tetapi sumbernya masih mengatakan @,0, apakah Anda hanya lupa untuk berubah?
bertepuk tangan

@ConfusedMr_C ya Saya baru saja mengubah permalink dan lupa jawaban yang sebenarnya.
Maltysen

7

Gangguan umum, 294 281 235

Untuk mengurangi skor, saya menggunakan @(biaya 1) dan !(biaya 2) sebagai nama variabel (edit: dan bahkan lebih baik jika saya menggunakan @untuk variabel yang paling banyak terjadi dalam fungsi). AKU BERTERIAK TERLALU karena lebih murah.

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

Dicetak cantik

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

Yah skornya lebih seperti 294;)
Cabbie407

@ Cabbie407 Saya melewatkan bagian tentang penilaian, maaf :-)
coredump

1
@ Cabbie407 Saya merasa aneh memiliki skor yang sangat rendah selama beberapa menit ...
coredump

1
Hanya ingin memberi tahu Anda, karena mengetahui tentang metode penilaian Anda mungkin akan melihat kode Anda dari sudut yang berbeda. Dan saya melihat Anda sudah mengubah sesuatu.
Cabbie407

1
@ Cabbie407 Saya lupa mengucapkan terima kasih, btw. Terima kasih.
coredump

6

JavaScript, 279

Edit perbaikan Bug (tidak menghitung bit 1 dari setiap karakter)

Program lengkap, dengan input dan output melalui popup. Diuji di Firefox, harus berfungsi di browser modern apa pun.

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

Beberapa alat (Diuji dengan 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
Jawaban ini tidak valid - hasilnya 17 untuk testbukannya 0.
ASCIIThenANSI

@ ASCIIThenANSI bukan tidak di browser saya. Tapi saya akan periksa lagi
edc65

Itu lucu ... Mengujinya dengan counter Anda, saya mendapatkan 279, dan mengujinya sendiri, saya mendapatkan 277. Saya bertanya-tanya mana yang benar; mungkinkah itu ada hubungannya dengan baris baru?
ETHproduksi

@ ETHproductions Saya memeriksa dua kali dan jumlah yang tepat adalah 279. Tapi itu tidak bekerja dengan string yang mengandung baris baru - ini masalah yang terkait dengan promptfungsi. Di Firefox, promptterjemahkan baris baru (2bit) dalam spasi (1bit), jadi kami mendapatkan 277 alih-alih 279
edc65

@ETHproductions ... di Chrome (di Windows) baris baru menjadi sepasang CR LF (3bit + 2bit) dan hitungannya salah lagi
edc65

6

Julia, 254 246 232

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

The count_onesFungsi menghitung jumlah orang dalam representasi biner dari input.

Mengurangi jejak ekologis saya berkat FryAmTheEggman!


1
Tidak masalah, saya benar-benar peduli dengan lingkungan;)
FryAmTheEggman

6

Python 3, 271

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

3
Banyak perubahan kecil memberi saya 228
FryAmTheEggman

2
Mengapa tidak memanfaatkan bools sebagai int? z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test")).... @ FryAmTheEggman jinx?
NightShadeQueen

1
@NightShadeQueen Haha, apakah itu berarti saya tidak dapat memposting selama sehari? : X Pokoknya itu tangkapan yang sangat bagus bagi pengguna baru ke situs ini, pekerjaan yang bagus! Bagaimanapun, selamat datang di PPCG! :) Juga, lebih pada topik, tanda koma bisa dihapus karena harganya sedikit lebih dari baris baru.
FryAmTheEggman

5

Perl, 136 118 73

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

Ganti semua @dengan\0

Contoh penggunaan:

perl -p entry.pl entry.pl

5

MATLAB, 198 194 byte

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

Pertama, string dibaca dari STDIN melalui inputfungsi. Setelah ini terjadi, kami membandingkan string input ke string test. Jika hasilnya tidak test , kami mengkonversi setiap karakter ke kode ASCII dan kemudian representasi binernya melalui dec2bin. Konsekuensi yang indah dari fungsi ini adalah bahwa jika Anda mengirim string, representasi biner dari kode ASCII-nya dibatasi sebagai satu karakter per baris.

Sebagai contoh:

>> dec2bin('ABCD')

ans =

1000001
1000010
1000011
1000100

dec2binmenghasilkan array karakter. Setelah ini terjadi, kurangi dengan 48, yang merupakan kode ASCII untuk 0 sehingga matriks dikonversi menjadi doubleterdiri dari 0s dan 1s. Setelah itu terjadi, panggilan untuk nnzmenghitung jumlah elemen non-nol dalam matriks ini. Perhatikan bahwa hasil ini dikalikan dengan kebalikan dari string dibandingkan dengan test. Harus string tidak menjadi test, kita mendapatkan perhitungan jejak. Jika sama, maka hasil perkalian dalam 0.

Beberapa contoh:

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

Jika Anda diizinkan menggunakan Kotak Alat Komunikasi, Anda dapat menggunakan de2bidan menghindari -48untuk melemparkannya ke tipe numerik (serta 2 karakter tambahan dalam nama fungsi).
Gelas

5

Pesta 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

Cukup mudah. Ulangi karakter di input yang dikonversi terlebih dahulu ke ascii (dengan printf %ddan yang terdepan 'pada angka kemudian ke biner (dengan bc), hapus angka nol dan hitung jumlah karakter.

Bukan jawaban yang bagus tetapi belum melihat upaya bash.

Dimodifikasi sejak jawaban pertama saya memungkinkan string input untuk diberikan hanya pada baris perintah (yaitu menjadi beberapa input params jika kata-kata multipe) tetapi setelah membaca beberapa jawaban lain saya pikir saya dapat menganggap itu dikutip, sehingga seluruh string datang sebagai $1


1
Selamat Datang di Programming Puzzles & Code Golf! 1. Anda dapat mengganti dodengan {dan donedengan }. 2. Anda juga tidak perlu ruang di sekitar <<<. 3. Anda dapat mengganti \ndengan linefeed literal.
Dennis

Terima kasih @Dennis. Salah satu tantangan di situs ini adalah mempelajari banyak "kebiasaan baik" :).
Adam

3
Pastilah itu. Jika Anda belum melakukannya, saya sarankan memeriksa Tips untuk bermain golf di Bash . Ini sumber yang bagus.
Dennis

3
Tantangan ini aneh bahkan menurut standar golf! Karakter tambahan masih dapat menyimpan poin. Penggunaan =dan ||biaya 15 saat menggunakan !=dan &&hanya 13! Karakter ekstra tetapi menghemat dua poin ...
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});}

Ini yang asli, tidak diserang:

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

Ini mengambil argumen dari parameter baris perintah ... process.arguments adalah urutan string (mungkin kosong), jadi sebelum menggunakan salah satunya, kita perlu memeriksa apakah itu benar-benar ada. Dalam kasus lain kami menampilkan pesan kesalahan (ini tidak diperlukan oleh pertanyaan dan akan dibuang di versi berikutnya).

sumFungsi Ceylon mengambil elemen Iterable yang tidak kosong dari beberapa jenis yang perlu dipenuhi Summable, yaitu memiliki plusmetode, seperti Integer. (Itu tidak bekerja dengan urutan kosong karena setiap tipe Summable akan memiliki nol sendiri, dan runtime tidak memiliki kesempatan untuk mengetahui yang mana yang dimaksudkan.)

Elemen-elemen string, atau satu bit integer, bukan iterable yang tidak kosong. Oleh karena itu kami menggunakan fitur ini untuk membangun iterable dengan menentukan beberapa elemen, lalu "pemahaman" (yang akan dievaluasi menjadi nol atau lebih elemen). Jadi dalam case karakter kita menambahkan yang (tetapi hanya ketika bit yang sesuai diatur), dalam case string kita menambahkan hasil dari karakter. (Pemahaman hanya akan dievaluasi ketika fungsi penerima benar-benar beralih di atasnya, bukan ketika membangun Iterable.)

Mari kita lihat bagaimana kita bisa mengecilkan ini. Pertama, masing-masing fungsi hanya dipanggil di satu tempat, jadi kita bisa sebarisinya. Juga, seperti disebutkan di atas, singkirkan pesan kesalahan. (764 titik jejak.)

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

Kita tidak benar-benar membutuhkan sarang dalam sum, kita bisa membuat pemahaman yang besar ini. (Ini menghemat kami untuk 37 titik jejak kaki sum({0,}), dan beberapa lagi untuk spasi putih, yang akan dihilangkan pada akhirnya.) Ini adalah 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 }));
        }
    }
}

Kita dapat menerapkan prinsip yang mirip dengan "test"string cased khusus : seperti dalam kasus ini hasilnya adalah 0 (yaitu tidak ada yang berkontribusi pada penjumlahan), kita dapat melakukan ini sebagai bagian dari penjumlahan (tetapi kita harus membalikkan kondisinya) . Ini terutama menyelamatkan kita print(0);, beberapa kawat gigi dan sekelompok ruang lekukan, turun ke jejak 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 }));
    }
}

Kami melakukan hal yang sama untuk yang pertama if, dengan efek samping yang sekarang tidak memberikan argumen juga menghasilkan 0bukannya melakukan apa-apa. (Setidaknya saya pikir itu akan terjadi di sini, alih-alih sepertinya menggantung dengan loop abadi? Aneh.)

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

Kita sebenarnya bisa menghilangkan fungsi ()untuk di sumsini, menggunakan sintaks pemanggilan fungsi alternatif , yang menggunakan {...}alih-alih (), dan akan mengisi pemahaman menjadi argumen yang dapat diubah. Ini memiliki tapak 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 });
}

Mengganti nama fungsi footprint(40) dengan p(3) menyimpan 37 poin lagi, membawa kami ke 501. (Nama fungsi Ceylon harus dimulai dengan karakter huruf kecil, jadi kami tidak bisa mendapatkan kurang dari 3 poin di sini.)

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

Nama variabel s(5) dan c(4), i(4) juga tidak optimal. Mari kita ganti dengan a(argumen), d(digit?) Dan b(bit-index). Jejak 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 });
}

Saya tidak melihat sisa optimasi non-spasi putih, jadi mari kita hapus spasi putih yang tidak diperlukan (1 poin untuk setiap ruang, dua untuk masing-masing dari dua jeda baris):

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

Saat menjelajah API, saya menemukan bahwa Character.hash sebenarnya mengembalikan nilai yang sama dengan integeratributnya. Tapi itu hanya memiliki 14 poin, bukan 30, jadi kami turun ke 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"]

sunting - lupa case 'test' ... sangat mahal.

editedit - melewatkan peluang UPPERCASE.

editeditedit - memasukkan saran komentar (Terima kasih TimmyD).

sunting 4 - D lebih murah daripada C (2 vs. 3)

sunting 5 - Kembali ke 295 karena pemeriksaan sensitivitas kasus.

Simpulkan string dan hitung 1s yang dapat digeser dari nilai ASCII karakter.

Hat-tip untuk TimmyD untuk memberi saya pandangan ke depan untuk menggunakan karakter huruf besar DAN untuk menggunakan indeks array di akhir.


1
Pendekatan yang bagus! Beberapa golf (menghapus inisialisasi $ B, karena akan menjadi nol, menghapus beberapa parens, menghapus beberapa titik koma), membawanya ke 293 PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
AdmBorkBork

Apa artinya ketika saya membaca "Pendekatan yang bagus!" dan mendengar suara dari Wii Golf? Terima kasih untuk petunjuknya! Inisialisasi tersandung saya ketika mengujinya di konsol PowerShell dan saya meninggalkannya. Baik untuk mengetahui sebaliknya.
Forty3

Ya - jika Anda menggunakan konsol, itu cukup banyak lingkungan REPL, dalam variabel yang ditugaskan tetap dari satu baris ke yang berikutnya. Jika Anda menyimpannya sebagai .ps1, maka $ B (dan setiap variabel lainnya) diinisialisasi ulang, bahkan jika Anda menekan panah atas-masukkan dari shell yang sama. Misalnya,PS C:\scripts> .\ecological-footprint.ps1
AdmBorkBork

Mengembalikan nilai 0 untuk input yang salah"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

Baris baru (tidak termasuk dalam skor) ditambahkan untuk kejelasan. Bisa ditingkatkan menjadi 360 hanya dengan mengubah nama variabel menjadi huruf besar, tetapi saya akan mencoba memikirkan sesuatu yang lebih baik.

Input adalah melalui commandline, yang berarti segfault pada input yang tidak ada. Saya mengharapkan skor yang lebih buruk untuk input melalui 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 Jejak Ekologis (masih banyak) , 102 91 Bytes

Tampaknya PHP ramah lingkungan hanya dalam mode uji. ;)

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

Berjalan dari baris perintah seperti:

php footprint.php hello
php footprint.php test

whilelebih ramah lingkungan daripada formeskipun mereka berbagi jumlah karakter yang sama. Juga nama variabel huruf besar memiliki jejak yang lebih baik daripada rekan-rekan huruf kecil mereka.

Sunting

  • disimpan 40 poin dengan menggunakan nama fungsi huruf besar.
  • menyimpan 38 poin dengan menggunakan decbinsebagai gantinyabase_convert

1
@Adam Berikut ini adalah diskusi tentang pemberitahuan dan di sini tentang tag pembuka PHP . Semoga ini bermanfaat buat kamu.
masukkan nama pengguna di sini

4

VBA, 475 418

Terima kasih Jacob untuk 57 poin

  • Konversi String menjadi Byte Array (128 adalah cara pintas vba untuk "Mengubah string dari Unicode ke halaman kode default sistem" Jadi tidak akan berfungsi pada Mac ....)

  • Loops melalui byte array yang dikonversi ke Binary dan Concatenating semuanya bersama-sama.

  • memeriksa tes
  • Mencetak panjang string dengan semua 0 diganti dengan nol

VBA kenapa kamu begitu buruk dalam bermain golf ... :(

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 tidak peka huruf besar-kecil, jadi Anda harus menggunakan huruf besar di mana saja untuk menghemat satu poin per karakter huruf kecil! (kecuali "test"tentu saja)
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)

Kutipan ganda " 00100010lebih ramah lingkungan daripada kutipan tunggal ' 00100111.
Jacob Krall

3

Pyth, 64

?qz"test"0l`sS.Bz

Memeriksa apakah input adalah tes dan jika tidak, menghitung jumlah 1 dalam representasi biner dari input.


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

Tidak banyak yang bisa dikatakan di sini: ubah setiap karakter menjadi nilai ascii ( fromEnum) dan hitung 1s (via a). Jumlahkan semua hasil.


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)

Ini adalah upaya pertama saya di JavaScript golf, jadi mungkin sangat tidak disukai.


Secara umum disepakati bahwa JavaScript golf memerlukan beberapa bentuk keluaran selain implisit. Ini bisa berupa peringatan, document.write, atau bahkan fungsi kembali.
Mwr247

Anda dapat memindahkan tugas cepat Anda ke 's' pertama dalam pernyataan if, dikelilingi oleh tanda kurung, untuk menyimpan beberapa byte. Anda juga dapat menghapus '0' di charCodeAt. Juga, penghematan besar yang dapat Anda lakukan adalah menggunakan operator ternary alih-alih pernyataan if / else =)
Mwr247

Terima kasih banyak! Saya akhirnya menggunakan koma alih-alih tanda kurung untuk tugas cepat, meskipun; menghemat byte lain. (: @ Mwr247
Zach Gates

s.split ('') dapat berupa s.split``, menghemat 2 byte
Dendrobium

1
Komentar Per Dendrobium di atas @JacobKrall
Zach Gates

3

Ruby, 316 313

Sangat mudah, mencari beberapa kemungkinan bermain golf:

b=gets.chomp;b=='test'?0:b.chars.map{|i|i.ord.to_s(2).count('1')}.inject(:+)
  • Digunakan balih-alih xmenyimpan 3 poin.

Anda dapat menggunakan $*[0]sebagai gantinya gets.chomp(mengambil input sebagai argumen baris perintah)
Mhmd

Kutipan ganda " 00100010lebih ramah lingkungan daripada kutipan tunggal ' 00100111.
Jacob Krall

Nama variabel huruf besar juga lebih ramah lingkungan daripada huruf kecil setara. Hlebih baik daripada Iuntuk alasan yang sama.
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

Port jawaban Pyth saya, di atas.

Input diterima sebagai string (dengan kutipan):

"ABC"

1
Kutipan ganda " 00100010lebih ramah lingkungan daripada kutipan tunggal ' 00100111.
Jacob Krall

Beberapa modifikasi dasar mendapatkan ini A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]dengan skor 243.
Kade


2

Pyth, 96

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

Port jawaban CJam saya, di atas / di bawah.


Hanya beberapa catatan umum Pyth: alih-alih Imencoba menggunakan terner ?, tetapi dalam kasus ini karena ini adalah bool yang dapat Anda gunakan *(setelah beralih ke nalih-alih q), ksecara otomatis ""dan spada string adalah sama a jk. Semoga Anda bersenang-senang belajar pyth! :)
FryAmTheEggman

Ini adalah jawaban Pyth pertama saya: P Cukup sulit untuk mendapatkan ini, haha, menyenangkan. Terima kasih atas tipsnya! @FryAmTheEggman
Zach Gates

2

CJam, 83 81 79 77

Terbaik sejauh ini setelah mencoba sejumlah variasi:

l0$"test"=!\:i2fbe_1b*

Cobalah online

Penjelasan:

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

Pendekatan langsung perulangan melalui semua byte input dan semua bit dalam setiap byte, menjumlahkan variabel d.

ddiinisialisasi ke -2 karena hmengandung terminating newline dari input (bernilai 2 bit) dan kami tidak ingin menghitungnya.

Demikian pula hakan berisi testdengan trailing newline, jadi newline harus dimasukkan dalam nilai perbandingan.

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

Cukup jelas.
Tes:

> 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 tapak, 98 byte

Solusi C lain:

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

Cara kerjanya adalah s biasanya diinisialisasi ke 0, tetapi menjadi -17 jika argumen baris perintah adalah "test" (strcmp mengembalikan 0 pada string yang sama, dan non-nol pada string yang berbeda, jadi membalikkannya memberikan 1 jika string adalah "test"). Angka -17 dipilih untuk mengkompensasi jejak 17 yang akan dihitung untuk "tes". Perhitungan jejak mudah dengan operator bitwise.

Jepret! Saya awalnya merindukan "kemenangan jejak terpendek" jadi saya bertujuan untuk kode terpendek ... Saya akan melihat apakah saya dapat membuat "jejak" lebih kecil.


2

Jawa, 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 tidak terlalu hijau.

Versi tidak disatukan:

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

Ddideklarasikan sebagai suatu cara Integeragar kita dapat mengakses metode Integerstatis dengan bitCountcara yang sadar lingkungan. The bitCountMetode memperlakukan charsebagai bilangan bulat dan mengembalikan jumlah set bit.


1
Menarik membandingkan Java dengan Ceylon ... Java memiliki beberapa overhead karena boilerplate, dan pernyataan cetak yang lebih panjang. BitCount memang membantu, meskipun, Ceylon tidak memiliki ini. Ceylon memiliki cara yang lebih panjang untuk mengakses parameter baris perintah, dan juga perlu memeriksa apakah mereka benar-benar diberikan (di mana program Anda hanya akan melempar ArrayIndexOutOfBoundsException). Fungsi penjumlahan Ceylon tentu saja lebih pendek daripada menambahkannya secara manual di Ceylon (tetapi Java tidak memiliki pemahaman, sehingga menambahkan secara manual lebih baik daripada membangun Iterable sendiri).
Paŭlo Ebermann
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.