Yah, meskipun tantangan ini ternyata sukses besar, itu juga ternyata sangat sepele untuk dipecahkan. Oleh karena itu, bagi mereka yang mencari lebih banyak tantangan, saya membuat sekuel tantangan ini di mana Anda sekarang harus menghitung jumlah persegi panjang unik . Saksikan berikut ini!
Sekarang, bagi Anda yang ingin menyelesaikan tantangan ini , ini dia.
Yah, kita belum benar-benar memiliki tantangan seperti ini, jadi di sini kita mulai.
Pertimbangkan 3 x 3
kotak segi empat ini:
Ada berapa persegi panjang? Nah, berhitung secara visual, kita dapat melihat bahwa sebenarnya ada 36
persegi panjang, termasuk seluruh bidang itu sendiri, yang semuanya ditunjukkan dalam animasi GIF di bawah ini:
Tugas
Penghitungan persegi panjang seperti yang ditunjukkan di atas adalah tugas. Dengan kata lain, diberi 2 bilangan bulat lebih besar dari atau sama dengan 0
, m
dan n
, di mana m
mewakili lebar dan n
mewakili tinggi, hasilkan jumlah total persegi panjang dalamm x n
kisi kisi persegi panjang itu.
Aturan
Penggunaan bawaan apa pun yang secara langsung menyelesaikan masalah ini tidak diizinkan secara eksplisit.
Tantangan ini bukan tentang menemukan jawaban terpendek, tetapi menemukan jawaban terpendek dalam setiap bahasa. Karenanya, tidak ada jawaban yang akan diterima.
Celah standar dilarang.
Uji Kasus
Disajikan dalam format Array of Integers Input -> Integer Output
:
[0,0] -> 0
[1,1] -> 1
[3,3] -> 36 (Visualized above)
[4,4] -> 100
[6,7] -> 588
Referensi
Ingat, ini kode-golf , jadi kode terpendek menang!
588
untuk test-case terakhir.Jawaban:
Python, 22 byte
Rumus
m*n*(m+1)*(n+1)/4
disingkat menggunakan komplemen bit~m=-(m+1)
, menyatakan(m+1)*(n+1)
sebagai~m*~n
.Mengapa jumlah persegi panjang
m*n*(m+1)*(n+1)/4
? Setiap persegi panjang ditentukan oleh pilihan dua garis horizontal (atas dan bawah) dan dua garis vertikal (kiri dan kanan). Adam+1
garis-garis horizontal, di mana kita memilih subset dari dua yang berbeda. Jadi jumlah pilihannya adalahchoose(m+1,2)
, yaitum*(m+1)/2
. Mengalikan dengann*(n+1)/2
pilihan untuk garis vertikal memberikan hasilnya.sumber
Jelly , 4 byte
Cobalah online!
Atau, juga 4 byte
Cobalah online!
sumber
בHP
dan‘c2P
dan mungkin alternatif 4 byte lainnya.nth
danmth
nomor segitiga.R
mengkonversi setiap nomor ke dalam indeks 1 berdasarkan:[1, 2, ..., n]
.S
adalah jumlah dan€
berarti 'setiap' sehingga setiap daftar dijumlahkan, memberikan daftar seperti:[nth triangle number, mth triangle number]
. KemudianP
ambil produk dari daftar itu, yang memberikan hasil yang diinginkan.Javascript (ES6), 17 byte
Sebuah garpu jawaban ini .
sumber
Mathematica, 15 byte
Ini adalah fungsi yang tidak disebutkan namanya mengambil dua argumen integer dan mengembalikan jumlah persegi panjang.
Penjelasan
Implementasi pada dasarnya adalah bentuk yang sangat golf dari produk dari dua angka segitiga. Mungkin perlu membaca bagian "Urutan argumen" di posting ini untuk detailnya, tetapi saya akan mencoba merangkum intinya di sini.
##
meluas ke urutan semua argumen. Ini mirip dengan menampar dalam bahasa lain. Misalnya, jika argumennya adalah3
dan4
, maka{1, 2, ##, 5}
akan memberi Anda{1, 2, 3, 4, 5}
. Tetapi ini tidak hanya berfungsi dalam daftar, tetapi dalam ekspresi apa pun, misalnyaf[1, 2, ##, 5]
juga akanf[1, 2, 3, 4, 5]
.Ini menjadi menarik ketika Anda bergabung
##
dengan operator. Semua operator di Mathematica hanya tangan pendek untuk beberapaf[...]
ekspresi (mungkin bersarang). Misalnyaa+b
adalahPlus[a, b]
dana-b
sebenarnya mewakiliPlus[a, Times[-1, b]]
. Sekarang ketika Anda menggabungkan##
dengan operator, apa yang dilakukan Mathematica adalah memperluas operator terlebih dahulu, memperlakukan##
seperti operan tunggal, dan memperluasnya hanya pada akhirnya. Dengan memasukkan##
di tempat yang tepat, karena itu kita dapat menggunakannya baik untuk memperbanyak dan menambahkan operan.Mari kita lakukan ini untuk kode di atas:
Memperluasnya ke bentuk lengkapnya, kita mendapatkan ini:
Mari kita masukkan argumen fungsi
a
danb
:Dan sekarang kita mengubahnya kembali menjadi notasi matematika standar:
Sedikit penataan ulang menunjukkan bahwa ini adalah produk dari bilangan segitiga:
Fakta menyenangkan: implementasi ini sangat golf, panjangnya sama dengan built-in untuk menghitung angka segitiga tunggal
PolygonalNumber
,.sumber
C, 25 byte
Versi purist (27):
Versi ISO-er (35):
sumber
Ubur-ubur , 16 byte
Format input adalah
[x y]
, output hanyalah hasilnya.Cobalah online!
Solusi alternatif, jumlah byte yang sama:
Penjelasan
Saatnya memberi Ubur-ubur perkenalan yang layak! :)
Ubur-ubur Zgarb bahasa 's berdasarkan tantangan 2D nya sintaks . Semantiknya sebagian besar diilhami oleh J, tetapi sintaksisnya adalah karya seni. Semua fungsi adalah karakter tunggal dan diletakkan di atas kisi-kisi. Fungsinya mengambil argumen mereka dari tanda sebelah selatan dan timur dan mengembalikan hasilnya ke utara dan barat. Ini memungkinkan Anda membuat web pemanggilan fungsi yang menarik tempat Anda menggunakan kembali nilai dengan meneruskannya ke beberapa fungsi dari berbagai arah.
Jika kita mengabaikan fakta bahwa beberapa token dalam program di atas adalah operator khusus (fungsi tingkat yang lebih tinggi), program di atas akan dituliskan seperti ini dalam bahasa yang waras:
Mari kita lihat kode dari bawah ke atas. Input dimasukkan oleh
i
, yang karenanya dievaluasi menjadi[x y]
.Yang
+
di atasnya menerima input ini bersama dengan literal1
dan karenanya menambah kedua elemen untuk diberikan[(x+1) (y+1)]
(sebagian besar operasi di-threaded secara otomatis pada daftar).Nilai lain
i
dikirim kiri, tetapiE
perpecahan adalah argumen timur utara dan barat. Itu berarti input ke kanan*
sebenarnya[x y]
dan[(x+1) (y+1)]
ini menghitung[x*(x+1) y*(y+1)]
.Selanjutnya selanjutnya
*
sebenarnya dimodifikasi oleh pendahulunya/
yang mengubahnya menjadi operasi lipat. Melipat*
sepasang hanya mengalikannya, sehingga kita dapatx*(x+1)*y*(y+1)
.Sekarang
%
hanya pembagian sehingga menghitungx*(x+1)*y*(y+1)/4
. Sayangnya, ini menghasilkan float sehingga kita perlu mengatasinya dengan unary|
. Akhirnya, nilai ini diumpankan kep
yang mencetak hasil akhir.sumber
R,
4035 byteNah, saatnya untuk terjun ke dalam! Ini kode R saya , terinspirasi dari @xnor jawab:
EDIT : Dalam versi ini, R akan meminta input dua kali.
sumber
cat(prod(choose(scan()+1,2)))
adalah 29 byte.CJam,
1210 Bytes2 byte disimpan berkat Martin.
Cobalah online!
Ini adalah blok yang mengambil daftar 2 elemen dari tumpukan dan meninggalkan solusi di tumpukan. Program penuh yang dapat digunakan untuk pengujian:
riari+{_:)+:*4/}~
.Didasarkan atas solusi python xnor yang luar biasa.
Penjelasan:
sumber
{_:~+:*4/}
~
sama sekali di CJam. Gunakan saja)
.Matlab,
2319 bytePenerapan rumus
m*n*(m+1)*(n+1)/4
Penggunaan:
ans([m,n])
sumber
MATL , 6 byte
Input adalah larik formulir
[m,n]
.Cobalah online!
Penjelasan
Perhitungan langsung berdasarkan rumus
m*(m+1)*n*(n+1)/4
.sumber
J, 8 byte
Pemakaian:
sumber
Java 7,
3938 byteJava 8,
2625191817 byteBerdasarkan jawaban luar biasa @xnor . Beberapa byte disimpan berkat @DavidConrad . Coba di sini.
Kode uji (Java 7):
Coba di sini.
Keluaran:
sumber
return
dana->b->
satu byte lebih pendek dari(a,b)->
.Function<Integer, Function<Integer, Integer>>
parameter, itu tidak akan diikuti oleh titik koma.;
pada pernyataan tunggal J8 lambdas.return
.. Juga, saya hampir tidak pernah memprogram di Java 8 (maka semua Java 7 jawaban saya), tetapi bagaimana saya bisa mulaia->b->
bekerja? Ini adalah ideone untuk kasus saat ini.MathOperation.operation
untuk mengambil hanya satuint
, mengembalikanFunction<Integer, Integer>
, dan ketika Anda menyebutnya, Anda awalnya lulus hanya parameter pertama,a
dan kemudian memanggil.apply(b)
padaFunction
. Anda juga perlu mengimporjava.util.function.Function
. Ini adalah ideone dengan perubahan.Ruby, 22 byte
Mencuri trik xnor dan membuat lambda-stabby:
Contoh panggilan:
Atau sebagai proc, juga 22 byte:
Yang kemudian bisa kita sebut:
sumber
Labirin ,
1311 byteCobalah online!
Penjelasan
Ini juga menghitung produk dari angka segitiga seperti kebanyakan jawaban. Blok 2x2 terkemuka adalah lingkaran kecil:
Pada iterasi pertama
*
tidak melakukan apa-apa, sehingga urutan loop sebenarnya adalah ini:Kode yang tersisa hanya linear:
Labyrinth kemudian mencoba mengeksekusi
/
lagi, yang menghentikan program karena pembagian dengan nol.sumber
Pyke, 6 byte
Coba di sini!
sumber
05AB1E, 4 byte
Penjelasan
Menggunakan rumus yang dijelaskan di A096948
Mengambil input sebagai [n, m] .
Cobalah online
sumber
Pyth,
86 byteDua byte disimpan berkat @DenkerAffe.
Input diharapkan sebagai daftar suka
[m,n]
. Cobalah di sini .Penjelasan:
sumber
F
daripada.*
menghapus danQ
karena itu ditambahkan secara implisit.F
tetapi saya tidak tahu bagaimana menggunakannya dan saya pikir saya harus menggunakannya.*
... Terima kasih!C #, 19 byte
Fungsi anonim yang didasarkan pada jawaban @ xnor.
sumber
Lua,
7463 byteFungsi mengambil input sebagai parameter angka.
Karena cara Lua diimplementasikan, ini secara teknis fungsi, dengan variabel args, yang dapat dipanggil dengan membungkusnya dalam pernyataan "fungsi", atau memuatnya dari kode sumber menggunakan "loadstring"
sumber
Cheddar , 23 byte
sumber
n*(n+1)
bisan^2+n
m->n->...
Brain-Flak ,
8480 byteCobalah online!
Mungkin sangat sub-optimal, terutama karena penggunaan kembali kode mengenai angka segitiga, tetapi setidaknya kita memiliki solusi Brain-Flak yang berfungsi.
Sayangnya tampaknya gagal dengan mengulang tanpa batas dengan
0 0
testcase tetapi semua yang lain berfungsi dengan baik.sumber
Cembung, 7 byte
Saya tahu ini bisa lebih kecil, saya belum tahu bagaimana ...
Cobalah online! . Menggunakan pengkodean CP-1252.
sumber
APL (Dyalog) , 9 byte
Cobalah online!
sumber
Pyt , 3 byte
Penjelasan:
Cobalah online!
sumber