Di New Modern Times , ketika Charlie Chaplin menemukan komputer, ia dipekerjakan di Yard pemilahan, sebagai validator untuk menentukan apakah para pekerja menyortir barang dengan benar. Item yang dimaksud adalah paket kelereng. Paket dengan jumlah Ganjil Kelereng ditumpuk di Keranjang Merah dan Paket dengan Ganjil Jumlah Kelereng ditumpuk di Keranjang Biru.
Charlie Chaplin seharusnya membuat program yang akan memvalidasi jika ada anomali dalam prosedur penyortiran. Mack Swain, bos langsungnya, membagikan algoritma yang dia perlu kode.
Algoritma
L = List of Marble packets that's already sorted
L_ODD = List of packets with Odd Number of Marbles
L_EVEN = List of packets with Even Number of Marbles
Check_Digit = √(ΣL_ODD² + ΣL_EVEN²)
Tugasnya adalah menentukan Check_Digit dan mencocokkannya dengan nilai apa pun yang diperhitungkan bosnya.
Charlie Chaplin selama jam makan siangnya, dapat menyelinap ke laci Mack Swain dan menentukan, bahwa laci itu memiliki kartu tunggal dengan pukulan pada 46 32 kolom pertama (yang berarti Mack mampu menulis sebuah program dengan hanya 46 32 karakter).
Charlie Chaplin sekarang membutuhkan bantuan semua ninja kode untuk menulis sebuah program dengan sesedikit mungkin baris. Dia juga mengumumkan bonus 50 poin, jika seseorang dapat membuat program yang lebih pendek dari bosnya.
Ringkasan
Diberikan daftar / larik / vektor angka positif (ganjil dan genap), Anda perlu menulis fungsi, yang akan menerima array(int [])/vector<int>/list
dan menghitung akar dari jumlah kuadrat dari jumlah ganjil dan genap dalam daftar.
Ukuran program adalah ukuran tubuh fungsi, yaitu tidak termasuk ukuran tanda tangan fungsi.
Contoh
List = [20, 9, 4, 5, 5, 5, 15, 17, 20, 9]
Odd = [9, 5, 5, 5, 15, 17, 9]
Even = [20, 4, 20]
Check_Digit = √(ΣOdd² + ΣEven²) = 78.49203781276162
Catatan , output aktual mungkin bervariasi berdasarkan presisi floating point implementasi.
Skor
Skor dihitung sebagai Skor dihitung sebagai Σ(Characters in your Program) - 46
. Σ(Characters in your Program) - 32
. Terlepas dari upvoting reguler dari komunitas, skor negatif terendah akan menerima bonus tambahan 50 poin.
Edit
- Offset yang digunakan untuk menghitung Skor telah diubah dari 46 menjadi 32. Catatan, ini tidak akan memengaruhi kelayakan dewan pimpinan / karunia atau membatalkan solusi apa pun.
Putusan
Setelah duel mengerikan antara para Ninja, Tuan Chaplin menerima beberapa jawaban indah. Sayangnya beberapa jawaban mencoba mengambil keuntungan dari aturan yang tidak semestinya dan tidak terlalu berguna. Dia benar-benar menginginkan duel yang adil dan jawaban di mana logika dikodekan dalam tanda tangan fungsi pada akhirnya akan berarti tanda tangan fungsi adalah bagian integral dari solusi. Akhirnya, Ninja FireFly adalah pemenang yang jelas dan memberinya bonus yang layak diterimanya. Papan (diperbarui setiap hari)
╒══════╤═════════════════╤══════════════╤═════════╤════════╤═══════╕
├ Rank │ Ninja │ Dialect │ Punches │ Scores │ Votes ┤
╞══════╪═════════════════╪══════════════╪═════════╪════════╪═══════╡
│ 0 │ FireFly │ J │ 17 │ -15 │ 6 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 1 │ tmartin │ Kona │ 22 │ -10 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 2 │ Sven Hohenstein │ R │ 24 │ -8 │ 7 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 3 │ Ben Reich │ GolfScript │ 30 │ -2 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 4 │ mollmerx │ k │ 31 │ -1 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 5 │ David Carraher │ Mathematica │ 31 │ -1 │ 3 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 6 │ tmartin │ Q │ 34 │ 2 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 7 │ daniero │ dc │ 35 │ 3 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 8 │ psion5mx │ Python │ 38 │ 6 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 9 │ O-I │ Ruby │ 39 │ 7 │ 5 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 10 │ gggg │ Julia │ 40 │ 8 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 11 │ FakeRainBrigand │ LiveScript │ 50 │ 18 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 12 │ Sylwester │ Perl5 │ 50 │ 18 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 13 │ daniero │ Ruby │ 55 │ 23 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 14 │ vasuakeel │ Coffeescript │ 57 │ 25 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 15 │ dirkk │ XQuery │ 63 │ 31 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 16 │ crazedgremlin │ Haskell │ 64 │ 32 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 17 │ Uri Agassi │ Ruby │ 66 │ 34 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 18 │ Sumedh │ JAVA │ 67 │ 35 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 19 │ Danny │ Javascript │ 67 │ 35 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 20 │ deroby │ c# │ 69 │ 37 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 21 │ Adam Speight │ VB │ 70 │ 38 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 22 │ Andrakis │ Erlang │ 82 │ 50 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 23 │ Sp0T │ PHP │ 85 │ 53 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 24 │ brendanb │ Clojure │ 87 │ 55 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 25 │ Merin Nakarmi │ C# │ 174 │ 142 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 26 │ Boopathi │ JAVA │ 517 │ 485 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 27 │ Noyo │ ES6 │ ? │ ? │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 28 │ shiona │ Haskell │ ? │ ? │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 29 │ Vivek │ int │ ? │ ? │ 0 │
└──────┴─────────────────┴──────────────┴─────────┴────────┴───────┘
Jawaban:
J,
1817 karakter - 32 = ⁻15(Sebagai "badan fungsi"; harus di kurung atau diikat ke nama.)
Penjelasan
Saya mencoba membuat pandangan yang meledak tentang apa yang masing-masing bagian lakukan, seperti Tobia lakukan dalam jawaban APL.
+/&.:*:
dapat diganti dengan|@j./
memanfaatkan trik magnitudo kompleks OI untuk menyimpan dua karakter lainnya.Contoh
sumber
ES6,
(48 - 32) = 16(1 - 32) = -31Versi asli:
Definisi fungsi keseluruhan adalah 53 karakter, hanya tubuh 48.
Versi terbaru, memanfaatkan sepenuhnya definisi masalah dan memindahkan hampir semuanya keluar dari tubuh dan masuk ke tanda tangan:
Definisi fungsi baru sekarang total 63 "pukulan", tetapi fungsi BODY sekarang hanya SATU KARAKTER DAMN PANJANG. Plus itu tidak lagi merusak namespace global! : D
Pemakaian:
sumber
R, (24 - 32) = −8
Badan fungsi terdiri dari 24 karakter.
Pemakaian:
sumber
sqrt(sum(by(x,x%%2,sum)^2))
Saya hanya belum mengoptimalkan sqrt .... sialan :-) +1 :-) PS: itu menarik bagaimanaby
tampaknya pada awalnya karena format output menyebalkan tetapi ketika Anda menjalankannyasum
itu diperbaiki ;-)by
mengembalikan array satu dimensi. Seseorang seharusnya tidak menilai fungsi dari hasilprint.by
fungsi.by
tidak mengembalikan array (btw, apa yang Anda maksud dengan "array"? Tidak ada dalam R. Anda mungkin berarti vektor), tidak juga vektor.by
mengembalikan objek kelasby
.?array
. Selanjutnya,is.array(by(1,1,I))
kembaliTRUE
.Ruby 2.1+ - (total 39 karakter - 7 non-tubuh - 32 offset = 0)
Pendekatan yang sedikit berbeda. Saya membuat sejumlah kompleks
a+b*i
sehinggaa
danb
adalah jumlah dari genap dan ganjil angka dalamlist
masing-masing. Maka saya hanya mengambil nilai absolut.Solusi saya sebelumnya, yang lebih panjang 5 karakter tetapi berfungsi pada 1.9.3+:
Pada catatan akhir, jika Rails + Ruby 2.1+ diizinkan, kita dapat menggunakan
Array#sum
untuk mendapatkan tubuh hingga 25 karakter:sumber
Python 2.7: 45, nay: 40, nay: 38 - 32 = 6
Tidak ada yang sangat baru di sini, hanya kombinasi trik bilangan kompleks yang saya lihat dalam tantangan Pythagoras baru-baru ini, lambda untuk kekompakan, dan minimisasi sintaksis / kurung:
Perbarui - menyimpan beberapa karakter. Terima kasih kepada @DSM untuk trik menaikkan komponen kompleks ke 0/1.
Oke, membaca pertanyaan dan mengenali aturan hitungan 'tubuh fungsi' menyimpan 2 karakter lain:
pengujian iPython:
sumber
abs
bilangan kompleksAPL (27 - 46 = -19)
misalnya:
sumber
Mathematica 31-32 = -1
GatherBy[#,OddQ]
menghasilkan daftar-paket, daftar-paket ganjil.Bagian dalam
Tr
menemukan total, keduanya kuadrat dan kemudian dijumlahkan (oleh bagian luarTr
).N
mengkonversi dari bilangan irasional (akar kuadrat dari bilangan bulat) ke pendekatan desimal.Contoh
Jika
f[n_]:=
tidak termasuk dalam hitungan, karakter tambahan dapat disimpan.Contoh
sumber
Kona, 22 - 32 = -10
sumber
Perl5: (50 - 32 = 18)
sumber
say
bukanprint
dan<>
bukannya@ARGV
(sambil memasok argumen pada STDIN alih-alih pada baris perintah)say
membutuhkanuse
? beralih dari array argumen ke<>
akan membutuhkan tambahansplit/ /,
.dc 3 (35 - 32)
Menggunakan array, seperti yang disarankan oleh @Tomas. Ini menyimpan beberapa karakter karena saya dapat menghitung paritas dari setiap angka dan menggunakannya sebagai indeks, daripada mengubah paritas dengan sebagai metode percabangan dan menempatkan nilai yang tepat di register yang tepat. Juga ternyata array akan memberi Anda 0 bahkan jika array / indeks belum digunakan, jadi Anda tidak perlu menginisialisasi apa pun.
Mengasumsikan angka sudah ada di tumpukan, dan meninggalkan hasilnya sebagai satu-satunya nilai yang tersisa ketika selesai.
Uji:
dc 16 (48 - 32)
Versi pertama menggunakan register o dan e untuk menyimpan angka ganjil dan genap.
sumber
sose
;-) mungkin Anda bisa mendapatkan hasil yang lebih pendek menggunakan perintah dc array ?Python, 9 (55 - 46)
Menggunakan fungsi lambda menyimpan beberapa byte pada baris baru, tab, dan
return
.Contoh:
sumber
Ruby (66 - 32 = 34)
uji:
sumber
Math.hypot *a.partition(&:odd?).map{|x|eval x*?+}
mencukur beberapa karakterRuby, 55 - 46 = 9
Uji:
sumber
h
:f=->a{h=[0,0];a.map{|v|h[v%2]+=v};e,o=h;(e*e+o*o)**0.5}
Q, 34 - 32 = 2
.
sumber
Julia, 40-46 = -6
Penerapan
Keluaran
sumber
Naskah, (57 - 32 = 25)
Implementasi
sumber
+=
dan mengubah0.5
ke.5
GolfScript 30
Saya tidak berpikir GolfScript memiliki banyak peluang untuk yang satu ini!
sumber
c #: 69-32 = 37
Kode lengkap:
PS: Hanya untuk bersenang-senang, ini juga berfungsi, sayangnya itu tidak mengubah jumlah karakter yang dibutuhkan:
sumber
Prolog (73 - 32 = 41)
Di sini kita menghitung semuanya setelah ': -' sebagai fungsi tubuh.
Panggil fungsi seperti ini:
sumber
Matlab (44 - 46 = -2)
Function body adalah 44 karakter:
Total fungsi sebagai berikut:
Tes fungsi:
sumber
Python 2.7 - 64-46 = 18
Ini bisa lebih pendek menggunakan beberapa
zip
sihir, tetapi untuk saat ini:Untuk penyelesaiannya, ternyata Anda dapat melakukan zip magic, tetapi harganya lebih mahal (oleh beberapa karakter), jadi berdiri di atas, kecuali seseorang dapat memperbaiki salah satu dari ini:
sumber
abs(sum(1j**(i%2)*i for i in x))
.!s%2
? Setidaknya itu adalah perubahan tambahan yang bisa Anda terimaC # 174
Dapat dibaca
sumber
Clojure = 87 - 46 = 41
Namun, hampir tidak idiomatis.
sumber
Haskell, 64C - 46 = 18
Tidak terlalu sulit dibaca. Contoh dijalankan:
sumber
int e=0,o=0;for(int i :n){if(i%2==0)e+=i;else o+=i;}System.out.println(Math.sqrt(e*e+o*o));
Metode aktual dalam kode java
sumber
PHP 85-32 = 53
$a=$b=0;foreach($x as $q){if(($q%2)==0)$a=$a+$q;else$b=$b+$q;}echo sqrt($a*$a+$b*$b);
Ini adalah yang terbaik aku akan muncul menjadi seorang pemula. Saya yakin pasti ada beberapa versi yang lebih pendek.
EDIT:
Versi kode yang dikurangi dapat berupa:
Versi ini hanya memiliki 64 (21 kurang dari jawaban asli) karakter.
Dikatakan demikian, 64-32 = 32
sumber
foreach($l as$m)$m%2?$o+=$m:$e+=$m;echo sqrt($o*$o+$e*$e);
VB.net (81c - 11c = 70) - 32 = 38
Melalui penggunaan liberal istilah Tulis fungsi
sumber
XQuery, (63 - 32 = 31)
Penerapan
Keluaran
BaseX digunakan sebagai prosesor XQuery.
sumber
Erlang: 82C - 32 = 50
Erlang tidak bagus untuk ini. Kebanyakan pintasan akhirnya menjadi lebih banyak karakter (tuple dll.)
Satu-satunya hal nyata yang perlu diperhatikan:
{lists,sum}
adalah referensi fungsi untuklists:sum
dan dapat dipanggil--
( mengurangi daftar ) daftar angka ganjil dari daftar lengkapDapat menelepon menggunakan:
Keluaran:
78.49203781276162
sumber
Haskell
57 - 32 = 25
Pengoptimalan langsung jawaban crazedgremlins:
Optimasi:
read$show
lebih pendek darifromIntegral
- 3 karakters=sum\n
dan duas
memiliki total panjang 8 karakter, duasum
hanya 6 karakter. - 2 karakterSaya juga mencoba menambahkan lebih banyak barang ke operator, tetapi akhirnya menjadi sama panjangnya:
sumber