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, A
memiliki jejak 2, tetapi O
lebih 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
test
sebagai parameter.
Mencetak gol
Kode sumber dengan jejak ekologis terkecil menang (dan ya, jawabannya test
dilarang!)
sumber
\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
Jawaban:
CJam,
3331Ada 113000000009500000034000000011110000101000000001150000000116000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000000000000000000
Kode ini setara dengan
yang dapat diuji secara online .
Bagaimana ini bekerja?
Bagaimana cara kerjanya
Kode sumber ini memiliki jejak ekologis 75.
sumber
Bahasa , 0
Keluarannya dalam kondisi unary , karena Bahasa / Brainfuck tidak memiliki cara waras untuk mencetak bilangan bulat di basis 10.
Kode sumber aktual berisi
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 ...
sumber
PowerShell,
337344304 poinAKU 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$A
adalahtest
, maka-CEQ
adalah$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
-replace
tidak memerlukan parameter kedua jika Anda menggantinya dengan apa-apa.sumber
" 00100010
lebih ramah lingkungan daripada kutipan tunggal' 00100111
."TEST"
"
. Juga dikoreksi dengan-CEQ
sensitivitas case. Ini menaikkan poin sedikit, karena saya salah mencetak' '
karena saya tidak membatasi dengan benar pada tes saya.Pyth -
5249Hemat tiga poin berkat @orlp.
Mengambil input dalam tanda kutip untuk menghemat jejak.
Test Suite .
sumber
@,0
dengan*
untuk menyimpan 3 :)@,0
, apakah Anda hanya lupa untuk berubah?Gangguan umum,
294281235Untuk 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.Dicetak cantik
sumber
;)
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.
Beberapa alat (Diuji dengan Firefox)
sumber
test
bukannya 0.prompt
fungsi. Di Firefox,prompt
terjemahkan baris baru (2bit) dalam spasi (1bit), jadi kami mendapatkan 277 alih-alih 279Julia,
254246232The
count_ones
Fungsi menghitung jumlah orang dalam representasi biner dari input.Mengurangi jejak ekologis saya berkat FryAmTheEggman!
sumber
Python 3, 271
sumber
z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test"))
.... @ FryAmTheEggman jinx?Perl,
13611873Ganti semua
@
dengan\0
Contoh penggunaan:
sumber
MATLAB,
198194 bytePertama, string dibaca dari STDIN melalui
input
fungsi. Setelah ini terjadi, kami membandingkan string input ke stringtest
. Jika hasilnya tidaktest
, kami mengkonversi setiap karakter ke kode ASCII dan kemudian representasi binernya melaluidec2bin
. 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
menghasilkan array karakter. Setelah ini terjadi, kurangi dengan 48, yang merupakan kode ASCII untuk 0 sehingga matriks dikonversi menjadidouble
terdiri dari 0s dan 1s. Setelah itu terjadi, panggilan untuknnz
menghitung jumlah elemen non-nol dalam matriks ini. Perhatikan bahwa hasil ini dikalikan dengan kebalikan dari string dibandingkan dengantest
. Harus string tidak menjaditest
, kita mendapatkan perhitungan jejak. Jika sama, maka hasil perkalian dalam 0.Beberapa contoh:
sumber
de2bi
dan menghindari-48
untuk melemparkannya ke tipe numerik (serta 2 karakter tambahan dalam nama fungsi).Pesta
440430412405403Cukup mudah. Ulangi karakter di input yang dikonversi terlebih dahulu ke ascii (dengan
printf %d
dan yang terdepan'
pada angka kemudian ke biner (denganbc
), 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
sumber
do
dengan{
dandone
dengan}
. 2. Anda juga tidak perlu ruang di sekitar<<<
. 3. Anda dapat mengganti\n
dengan linefeed literal.=
dan||
biaya 15 saat menggunakan!=
dan&&
hanya 13! Karakter ekstra tetapi menghemat dua poin ...Ceylon,
1431,764,697,571,547,538,501,493,467, 451Ini yang asli, tidak diserang:
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).
sum
Fungsi Ceylon mengambil elemen Iterable yang tidak kosong dari beberapa jenis yang perlu dipenuhiSummable
, yaitu memilikiplus
metode, 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.)
Kita tidak benar-benar membutuhkan sarang dalam
sum
, kita bisa membuat pemahaman yang besar ini. (Ini menghemat kami untuk 37 titik jejak kakisum({0,})
, dan beberapa lagi untuk spasi putih, yang akan dihilangkan pada akhirnya.) Ini adalah 697: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 kitaprint(0);
, beberapa kawat gigi dan sekelompok ruang lekukan, turun ke jejak 571:Kami melakukan hal yang sama untuk yang pertama
if
, dengan efek samping yang sekarang tidak memberikan argumen juga menghasilkan0
bukannya melakukan apa-apa. (Setidaknya saya pikir itu akan terjadi di sini, alih-alih sepertinya menggantung dengan loop abadi? Aneh.)Kita sebenarnya bisa menghilangkan fungsi
()
untuk disum
sini, menggunakan sintaks pemanggilan fungsi alternatif , yang menggunakan{...}
alih-alih()
, dan akan mengisi pemahaman menjadi argumen yang dapat diubah. Ini memiliki tapak 538:Mengganti nama fungsi
footprint
(40) denganp
(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.)Nama variabel
s
(5) danc
(4),i
(4) juga tidak optimal. Mari kita ganti dengana
(argumen),d
(digit?) Danb
(bit-index). Jejak 493: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):
Saat menjelajah API, saya menemukan bahwa Character.hash sebenarnya mengembalikan nilai yang sama dengan
integer
atributnya. Tapi itu hanya memiliki 14 poin, bukan 30, jadi kami turun ke 451!sumber
PowerShell,
273336328324293288295sunting - 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.
sumber
PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
PS C:\scripts> .\ecological-footprint.ps1
"TEST"
PARAM($A)(([CHAR[]]$A|%{$B=$_;0..9|?{[INT]$B-SHR$_-BAND1}}).LENGTH,0)[("TEST"-EQ$A)]
Matlab, 320
sumber
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.
sumber
PHP,
377337299 Jejak Ekologis (masih banyak) ,10291 BytesTampaknya PHP ramah lingkungan hanya dalam mode uji. ;)
Berjalan dari baris perintah seperti:
while
lebih ramah lingkungan daripadafor
meskipun mereka berbagi jumlah karakter yang sama. Juga nama variabel huruf besar memiliki jejak yang lebih baik daripada rekan-rekan huruf kecil mereka.Sunting
decbin
sebagai gantinyabase_convert
sumber
VBA,
475418Terima 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.
VBA kenapa kamu begitu buruk dalam bermain golf ... :(
sumber
"test"
tentu saja)JavaScript,
418410sumber
" 00100010
lebih ramah lingkungan daripada kutipan tunggal' 00100111
.Pyth, 64
Memeriksa apakah input adalah tes dan jika tidak, menghitung jumlah 1 dalam representasi biner dari input.
sumber
Haskell, 292
Tidak banyak yang bisa dikatakan di sini: ubah setiap karakter menjadi nilai ascii (
fromEnum
) dan hitung1
s (viaa
). Jumlahkan semua hasil.sumber
JavaScript (ES6),
521478458449473465Ini adalah upaya pertama saya di JavaScript golf, jadi mungkin sangat tidak disukai.
sumber
Ruby,
316313Sangat mudah, mencari beberapa kemungkinan bermain golf:
b
alih-alihx
menyimpan 3 poin.sumber
$*[0]
sebagai gantinyagets.chomp
(mengambil input sebagai argumen baris perintah)" 00100010
lebih ramah lingkungan daripada kutipan tunggal' 00100111
.H
lebih baik daripadaI
untuk alasan yang sama.Python 2,
294281269266Port jawaban Pyth saya, di atas.
Input diterima sebagai string (dengan kutipan):
sumber
" 00100010
lebih ramah lingkungan daripada kutipan tunggal' 00100111
.A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]
dengan skor 243.CJam, 123
sumber
Pyth, 96
Port jawaban CJam saya, di atas / di bawah.
sumber
I
mencoba menggunakan terner?
, tetapi dalam kasus ini karena ini adalah bool yang dapat Anda gunakan*
(setelah beralih ken
alih-alihq
),k
secara otomatis""
dans
pada string adalah sama ajk
. Semoga Anda bersenang-senang belajar pyth! :)CJam,
83817977Terbaik sejauh ini setelah mencoba sejumlah variasi:
Cobalah online
Penjelasan:
sumber
Ruby, 247
Pendekatan langsung perulangan melalui semua byte input dan semua bit dalam setiap byte, menjumlahkan variabel
d
.d
diinisialisasi ke -2 karenah
mengandung terminating newline dari input (bernilai 2 bit) dan kami tidak ingin menghitungnya.Demikian pula
h
akan berisitest
dengan trailing newline, jadi newline harus dimasukkan dalam nilai perbandingan.sumber
R, 279
Cukup jelas.
Tes:
sumber
C, 378 tapak, 98 byte
Solusi C lain:
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.
sumber
Jawa, 594
Java tidak terlalu hijau.
Versi tidak disatukan:
D
dideklarasikan sebagai suatu caraInteger
agar kita dapat mengakses metodeInteger
statis denganbitCount
cara yang sadar lingkungan. ThebitCount
Metode memperlakukanchar
sebagai bilangan bulat dan mengembalikan jumlah set bit.sumber