Berapa banyak persegi panjang di grid?


29

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 3kotak segi empat ini:

Contoh

Ada berapa persegi panjang? Nah, berhitung secara visual, kita dapat melihat bahwa sebenarnya ada 36persegi panjang, termasuk seluruh bidang itu sendiri, yang semuanya ditunjukkan dalam animasi GIF di bawah ini:

Persegi Panjang dalam Contoh

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, mdan n, di mana mmewakili lebar dan nmewakili 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 , jadi kode terpendek menang!


Saya menghitung 588untuk test-case terakhir.
Leaky Nun

@ LeakyNun Kalau begitu, saya kira saya melewatkan beberapa saat menghitungnya . Sudah diperbaiki.
R. Kap

Berapa nilai maksimum input?
Erik the Outgolfer

Jawaban:


34

Python, 22 byte

lambda m,n:m*~m*n*~n/4

Rumus m*n*(m+1)*(n+1)/4disingkat 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). Ada m+1garis-garis horizontal, di mana kita memilih subset dari dua yang berbeda. Jadi jumlah pilihannya adalah choose(m+1,2), yaitu m*(m+1)/2. Mengalikan dengan n*(n+1)/2pilihan untuk garis vertikal memberikan hasilnya.


Trik +1 itu brilian.
David Ljung Madison Stellar

11

Jelly , 4 byte

RS€P

Cobalah online!

Atau, juga 4 byte

pP€S

Cobalah online!


Kerja bagus. Jempolan. :)
R. Kap

24
Mau jelaskan?
Pureferret

Ada juga בHPdan ‘c2Pdan mungkin alternatif 4 byte lainnya.
mil

1
@Pureferret ini menggunakan rumus dari Oei tentang ini menjadi produk dari nthdan mthnomor segitiga. Rmengkonversi setiap nomor ke dalam indeks 1 berdasarkan: [1, 2, ..., n]. Sadalah jumlah dan berarti 'setiap' sehingga setiap daftar dijumlahkan, memberikan daftar seperti: [nth triangle number, mth triangle number]. Kemudian Pambil produk dari daftar itu, yang memberikan hasil yang diinginkan.
FryAmTheEggman

1
@FryAmTheEggman jadi apa yang Anda katakan .... Magic
Pureferret


9

Mathematica, 15 byte

##(1##+##+1)/4&

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 adalah 3dan 4, maka {1, 2, ##, 5}akan memberi Anda {1, 2, 3, 4, 5}. Tetapi ini tidak hanya berfungsi dalam daftar, tetapi dalam ekspresi apa pun, misalnya f[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 beberapa f[...]ekspresi (mungkin bersarang). Misalnya a+badalah Plus[a, b]dan a-bsebenarnya mewakili Plus[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:

##(1##+##+1)/4

Memperluasnya ke bentuk lengkapnya, kita mendapatkan ini:

Times[##, Plus[Times[1, ##], ##, 1], Rational[1/4]]

Mari kita masukkan argumen fungsi adan b:

Times[a, b, Plus[Times[1, a, b], a, b, 1], Rational[1/4]]

Dan sekarang kita mengubahnya kembali menjadi notasi matematika standar:

a * b * (a * b + a + b + 1) / 4

Sedikit penataan ulang menunjukkan bahwa ini adalah produk dari bilangan segitiga:

a * b * (a + 1) * (b + 1) / 4
(a * (a + 1) / 2) * (b * (b + 1) / 2)
T(a) * T(b)

Fakta menyenangkan: implementasi ini sangat golf, panjangnya sama dengan built-in untuk menghitung angka segitiga tunggal PolygonalNumber,.


8

C, 25 byte

#define r(x,y)x*y*~x*~y/4

Versi purist (27):

r(x,y){return x*y*~x*~y/4;}

Versi ISO-er (35):

#define r(x,y)((x)*(y)*~(x)*~(y)/4)

Menurut Anda versi mana yang terbaik?
Erik the Outgolfer

8

Ubur-ubur , 16 byte

p|%/**+1
  4  Ei

Format input adalah [x y], output hanyalah hasilnya.

Cobalah online!

Solusi alternatif, jumlah byte yang sama:

pm%/*[*i
  4  +1

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:

p(|( /*(i*(i+1)) % 4 ))

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 literal 1dan karenanya menambah kedua elemen untuk diberikan [(x+1) (y+1)](sebagian besar operasi di-threaded secara otomatis pada daftar).

Nilai lain idikirim kiri, tetapi Eperpecahan 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 dapat x*(x+1)*y*(y+1).

Sekarang %hanya pembagian sehingga menghitung x*(x+1)*y*(y+1)/4. Sayangnya, ini menghasilkan float sehingga kita perlu mengatasinya dengan unary |. Akhirnya, nilai ini diumpankan ke pyang mencetak hasil akhir.


Saya berani bersumpah saya membaca sesuatu di dokumen tentang pembagian bilangan bulat ...
Conor O'Brien

7

R, 40 35 byte

Nah, saatnya untuk terjun ke dalam! Ini kode R saya , terinspirasi dari @xnor jawab:

a=scan();(n=a[1])*(m=a[2])*(n+1)*(m+1)/4 

EDIT : Dalam versi ini, R akan meminta input dua kali.

(n=scan())*(m=scan())*(n+1)*(m+1)/4

cat(prod(choose(scan()+1,2)))adalah 29 byte.
Giuseppe

6

CJam, 12 10 Bytes

2 byte disimpan berkat Martin.

{_:)+:*4/}

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:

{_:)+:*4/}
{        } -- Define a block
 _:)       -- Duplicate list, increment all values in new list
    +      -- Join the two lists
     :*    -- Fold multiply over all 4 elements
       4/  -- Divide by 4

2
Saya pikir ini berfungsi untuk 10 jika Anda membuat input daftar dua elemen? {_:~+:*4/}
Martin Ender

Sebenarnya, tidak perlu digunakan ~sama sekali di CJam. Gunakan saja ).
Martin Ender

5

Matlab, 23 19 byte

@(x)prod([x/2,x+1])

Penerapan rumus m*n*(m+1)*(n+1)/4
Penggunaan:ans([m,n])


4

MATL , 6 byte

tQ*2/p

Input adalah larik formulir [m,n].

Cobalah online!

Penjelasan

Perhitungan langsung berdasarkan rumus m*(m+1)*n*(n+1)/4.

t     % Input array [m,n] implicitly. Duplicate
Q     % Add 1 to each entry of the copy: gives [m+1,n+1]
*     % Multiply element-wise: gives [m*(m+1),n*(n+1)]
2/    % Divide each entry by 2: [m*(m+1)/2,n*(n+1)/2]
p     % Product of the two entries: m*(m+1)*n*(n+1)/4. Display implicitly


4

Java 7, 39 38 byte

int c(int a,int b){return~a*a*b*~b/4;}

Java 8, 26 25 19 18 17 byte

a->b->a*~a*b*~b/4

Berdasarkan jawaban luar biasa @xnor . Beberapa byte disimpan berkat @DavidConrad . Coba di sini.

Kode uji (Java 7):

Coba di sini.

class M{
  static int c(int a,int b){return~a*a*b*~b/4;}

  public static void main(String[] a){
    System.out.println(c(0, 0));
    System.out.println(c(1, 1));
    System.out.println(c(3, 3));
    System.out.println(c(4, 4));
    System.out.println(c(6, 7));
  }
}

Keluaran:

0
1
36
100
588

1
Anda tidak perlu itu returndan a->b->satu byte lebih pendek dari (a,b)->.
David Conrad

2
Saya juga berpikir Anda tidak perlu titik koma, karena jika Anda meneruskan lambda ke dalam metode yang menggunakan Function<Integer, Function<Integer, Integer>>parameter, itu tidak akan diikuti oleh titik koma.
David Conrad

2
Saya setuju dengan @DavidConrad: Saya tidak menghitung akhir ;pada pernyataan tunggal J8 lambdas.
CAD97

@DavidConrad Maaf untuk suntingan yang sangat terlambat, tapi saya baru sekarang menyadari saya telah membaca komentar Anda untuk menghapus return .. Juga, saya hampir tidak pernah memprogram di Java 8 (maka semua Java 7 jawaban saya), tetapi bagaimana saya bisa mulai a->b->bekerja? Ini adalah ideone untuk kasus saat ini.
Kevin Cruijssen

1
Maaf atas jawaban yang sangat terlambat! Anda perlu kari fungsi, sehingga Anda perlu perubahan MathOperation.operationuntuk mengambil hanya satu int, mengembalikan Function<Integer, Integer>, dan ketika Anda menyebutnya, Anda awalnya lulus hanya parameter pertama, adan kemudian memanggil .apply(b)pada Function. Anda juga perlu mengimpor java.util.function.Function. Ini adalah ideone dengan perubahan.
David Conrad

3

Ruby, 22 byte

Mencuri trik xnor dan membuat lambda-stabby:

r=->(m,n){m*n*~m*~n/4}

Contoh panggilan:

r[6,7]     # => 588

Atau sebagai proc, juga 22 byte:

proc{|m,n|m*n*~m*~n/4}

Yang kemudian bisa kita sebut:

proc{|m,n|m*n*~m*~n/4}.call(6,7)     # => 588

Anda tidak perlu menyebutkannya — fungsi anonim tidak apa-apa sesuai konvensi situs
Conor O'Brien

3

Labirin , 13 11 byte

*?;*_4/!
):

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

?   Read integer N from STDIN or 0 at EOF and push onto stack. If 0, exit the loop.
:   Duplicate N.
)   Increment.
*   Multiply to get N*(N+1).

Kode yang tersisa hanya linear:

;   Discard the zero that terminated the loop.
*   Multiply the other two values.
_4  Push a 4.
/   Divide.
!   Print.

Labyrinth kemudian mencoba mengeksekusi /lagi, yang menghentikan program karena pembagian dengan nol.


2

Pyke, 6 byte

mh+Bee

Coba di sini!

mh     -    map(increment, input)
  +    -   ^ + input
   B   -  product(^)
    ee - ^ \ 4

Ini bisa menggunakan kerusakan, tetapi saya menemukan itu sebagai karya seni, secara pribadi.
corsiKa

2

05AB1E, 4 byte

€LOP

Penjelasan

Menggunakan rumus yang dijelaskan di A096948

      # Implicit input, ex: [7,6]
€L    # Enumerate each, [[1,2,3,4,5,6,7],[1,2,3,4,5,6]]
  O   # Sum, [28,21]
   P  # Product, 588
      # Implicit display

Mengambil input sebagai [n, m] .

Cobalah online


1

Pyth, 8 6 byte

Dua byte disimpan berkat @DenkerAffe.

*FmsSd

Input diharapkan sebagai daftar suka [m,n]. Cobalah di sini .

Penjelasan:

          Implicit assignment of Q to eval(input).
*         Multiplication.
 F        Splat the following sequence onto the arguments of the previous function.
  m       Map the following function of d over Q (Q is implicitly added to the end).
   s      Reduce the following list with addition, initial value of 0.
    Sd    Return range(1,d+1).

1
Anda dapat menggunakan Fdaripada .*menghapus dan Qkarena itu ditambahkan secara implisit.
Denker

Saya tahu tentang Ftetapi saya tidak tahu bagaimana menggunakannya dan saya pikir saya harus menggunakannya .*... Terima kasih!
Rhyzomatic

1

C #, 19 byte

(n,m)=>m*n*~m*~n/4;

Fungsi anonim yang didasarkan pada jawaban @ xnor.


1

Lua, 74 63 byte

x,y=...n=0 for i=1,y do for j=i,i*x,i do n=n+j end end print(n)

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


1
Saya melihat bahwa Anda memiliki cukup banyak kode di sana hanya untuk I / O. Mungkin akan lebih singkat untuk hanya membuat fungsi yang mengambil dua angka dan mengembalikan jawabannya, dan menghapus semua kode I / O yang tidak perlu ini?
Zwei

@ Zwei Saya lupa bahwa fungsi diizinkan untuk mengambil input berdasarkan parameter. Terima kasih telah menunjukkannya.
brianush1

Fungsi ini dapat dinamai sesuatu seperti "f" alih-alih seluruh nama "fungsi" untuk menyimpan 7 byte lebih banyak
Zwei

Di Lua, kata kunci "fungsi" diperlukan untuk mendeklarasikan suatu fungsi. Jika tidak ada nama yang ditentukan (mis: "function f ()"), itu adalah fungsi anonim. (mis: "function ()"). Oleh karena itu, "fungsi" diperlukan agar kode berfungsi.
brianush1

Oh, aku lupa kalau lua bekerja seperti itu. Salahku!
Zwei


1

Brain-Flak , 84 80 byte

({}<>)({({})<({}[()])>}{})<>({({})<({}[()])>}{}[()]){<>(({}))<>({}[()])}<>({{}})

Cobalah 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 0testcase tetapi semua yang lain berfungsi dengan baik.




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.