Berikut ini tantangan Senin pagi yang cepat ...
Tulis fungsi atau program dengan jumlah byte paling sedikit yang:
- Dibawa sebagai input daftar
[x,y]
koordinat - Dibawa sebagai input daftar
[x,y]
massa masing-masing koordinat - Menghasilkan pusat massa yang dihitung dalam bentuk
[xBar,yBar]
.
catatan:
- Input dapat diambil dalam bentuk apa pun, selama array digunakan.
Pusat massa dapat dihitung dengan rumus berikut:
Dalam bahasa Inggris ...
- Untuk menemukan
xBar
, gandakan setiap massa dengan koordinat x masing-masing, jumlahkan daftar yang dihasilkan, dan bagi dengan jumlah semua massa. - Untuk menemukan
yBar
, gandakan setiap massa dengan koordinat y masing-masing, jumlahkan daftar yang dihasilkan, dan bagi dengan jumlah semua massa.
Trivial Python 2.7 contoh:
def center(coord, mass):
sumMass = float(reduce(lambda a, b: a+b, mass))
momentX = reduce(lambda m, x: m+x, (a*b for a, b in zip(mass, zip(*coord)[0])))
momentY = reduce(lambda m, y: m+y, (a*b for a, b in zip(mass, zip(*coord)[1])))
xBar = momentX / sumMass
yBar = momentY / sumMass
return [xBar, yBar]
Kasus uji:
> center([[0, 2], [3, 4], [0, 1], [1, 1]], [2, 6, 2, 10])
[1.4, 2.0]
> center([[3, 1], [0, 0], [1, 4]], [2, 4, 1])
[1.0, 0.8571428571428571]
Ini adalah kode-golf, jadi jumlah byte terkecil yang menang!
code-golf
arithmetic
array-manipulation
Tuan Umum
sumber
sumber
[x,y,m],[x,y,m]...
:?[(x1,y1,m1), (x2,y2,m2)]
, misalnya daftar tupel? Atau tidak masalah apakah argumennya adalah tupel, daftar atau array? Bagaimana dengan tiga daftar / array?Jawaban:
MATL ,
65 byteFormat input adalah vektor baris dengan massa, kemudian matriks dua kolom dengan koordinat (di mana spasi atau koma adalah opsional).
Contoh pertama:
Contoh kedua:
Cobalah online!
Penjelasan
Biarkan
m
menunjukkan vektor massa (input pertama) danc
matriks koordinat (input kedua).sumber
y
sangat berguna !! +1Mathematica, 10 byte
Contoh:
sumber
Dot
. Tapi saya akan setelah melihat penggunaan Anda di atas!Mathcad, 19 "byte"
Karena Mathcad menggunakan "papan tulis" 2D dan operator khusus (misalnya, operator penjumlahan, operator integral), dan menyimpan dalam format XML, lembar kerja yang sebenarnya mungkin berisi beberapa ratus (atau lebih) karakter. Untuk keperluan Code Golf, saya telah mengambil "byte byte" Mathcad untuk menjadi jumlah karakter atau operator yang harus dimasukkan pengguna untuk membuat lembar kerja.
Versi (program) pertama dari tantangan membutuhkan 19 "byte" menggunakan definisi ini dan versi fungsi mengambil 41 "byte".
sumber
MATLAB / Oktaf,
1816 byteTerima kasih kepada pengguna beaker dan Don Muesli karena telah menghapus 2 byte!
Mengingat bahwa koordinat berada dalam
N x 2
matriks dix
mana kolom pertama adalah koordinat X dan kolom kedua adalah koordinat Y, dan massa berada dalam1 x N
matriksy
(atau vektor baris):Penjelasan kode ini cukup mudah. Ini adalah fungsi anonim yang mengambil dua input
x
dany
. Kami melakukan penjumlahan berbobot (ekspresi pembilang dari setiap koordinat) dalam pendekatan aljabar linier menggunakan perkalian matriks-vektor. Dengan mengambil vektory
massa dan mengalikannya dengan matriks koordinatx
dengan perkalian matriks-vektor, Anda akan menghitung jumlah tertimbang dari kedua koordinat secara individual, kemudian kami membagi masing-masing koordinat ini dengan jumlah massa sehingga menemukan pusat yang diinginkan dari massa dikembalikan sebagai vektor baris 1 x 2 untuk masing-masing koordinat.Contoh berjalan
Cobalah online!
https://ideone.com/BzbQ3e
sumber
;
, dan juga'
dengan memilih format input dengan benar (x
sebagai vektor baris)Jelly, 6 byte
atau
Input adalah melalui dua argumen baris perintah, massa pertama, koordinat kedua.
Cobalah online!
Penjelasan
atau
sumber
Julia,
2517 byteKehilangan pendekatan yang jelas: / Sebut suka
f([3 1;0 0;1 4], [2 4 1])
.sumber
CJam, 14 byte
Fungsi yang tidak disebutkan namanya dengan mengharapkan daftar pasangan koordinat dan daftar massa pada tumpukan (dalam urutan itu) dan meninggalkan pusat massa di tempatnya.
Uji di sini.
Penjelasan
sumber
Perl 6,
363330 bytesumber
Serius, 16 byte
Mengambil input as
[x-coords]\n[y-coords]\n[masses]
, dan output asxbar\nybar
Cobalah online!
Penjelasan:
sumber
Haskell,
5550 byteIni mendefinisikan fungsi biner
f
, digunakan sebagai berikut:Lihat lulus kedua kasus uji.
Penjelasan
Haskell tidak cocok untuk memproses daftar multidimensi, jadi saya melompati beberapa lingkaran di sini. Baris pertama mendefinisikan alias pendek untuk
zipWith
, yang kita butuhkan dua kali. Pada dasarnya,f
adalah fungsi yang mengambil daftar bobota
dan menghasilkanf a
, fungsi yang mengambil daftar posisi dan menghasilkan pusat massa.f a
adalah komposisi dari tiga fungsi:sumber
JavaScript (ES6), 60 byte
Menerima larik (x, y, massa) "tiga kali lipat" dan mengembalikan "tuple".
sumber
[x,y,m]
diperlukan? iirc, mereka tidak diperlukan jika hanya ada satu argumen input ke fungsi panah.R,
3225 bytesunting -7 bytes dengan beralih ke aljabar matriks (terima kasih @ Sp3000 Julia jawaban)
melewatkan array (matriks dengan 2 kolom, x, y) sebagai koordinat dan vektor
m
bobot, mengembalikan array dengan koordinat yang diperlukansumber
PHP, 142 byte
Tampilan meledak Input yang dibutuhkan KembaliArray: [ xbar, ybar ]
The
p()
fungsi peta dasar, mengalikan setiap[m]
nilai dengan yang sesuai[x]
atau[y]
nilai. Thec()
fungsi mengambil diArray[Array]
, hadiah yangarray_sum
danarray_map
fungsi untuk ruang, kemudian menghitungΣmx/Σm
danΣmy/Σm
.Mungkin akan mengubah perhitungan itu sendiri menjadi fungsi untuk ruang, akan melihat.
sumber
Mathcad, 8 "byte"
Saya tidak tahu apa yang tidak saya pikirkan dalam jawaban saya sebelumnya. Inilah cara yang lebih singkat untuk menggunakan perkalian matriks dengan tepat. Variabel p berisi data - jika mengatur jumlah variabel terhadap total, maka tambahkan 2 "byte" lainnya (pembuatan tabel input = 1 byte, nama variabel = 1 byte).
sumber
Python 3, 63 byte
Operasi vektor pada daftar panjang: /
Ini adalah fungsi lambda anonim - berikan nama dan panggilan seperti
f([[0,2],[3,4],[0,1],[1,1]],[2,6,2,10])
.sumber
Python 3,
959088 byteLarutan
Hasil
terima kasih kepada @Zgarb yang menghemat 2 byte
Solusi rekursif untuk bersenang-senang (95 byte)
Hasil
sumber
*([c]+[m])
bisa disingkat*[c,m]
.Aksioma, 158 byte
ungolf itu
hasil
sumber
k, 13 byte
Cobalah online!
sumber