Anda ingin membuat papan catur persegi. Ubin yang berdekatan harus bergantian hitam dan putih seperti papan catur standar, dan sudut kiri bawah dapat berupa hitam atau putih.
Program Anda akan menerima dua bilangan bulat positif, jumlah ubin hitam dan jumlah ubin putih. Ini akan selalu kurang dari 1024. Anda tidak harus menggunakan semua ubin.
Keluarkan panjang sisi maksimum dari pola papan catur yang dapat dibangun menggunakan jumlah ubin yang diberikan.
Kasus uji:
12, 15 -> 5
8, 8 -> 4
4, 0 -> 1
Jawaban:
JavaScript (ES7), 30 byte
Cobalah online!
Mengingat jumlah kotak hitamb dan jumlah kotak putih w , ini menghitung:
Untuk bahkan ukurans , kita perlu s2/ 2 kotak dari masing-masing jenis (misalnya untuk s = 8 : 32 kotak hitam dan 32 kotak putih).
Untuk aneh ukurans , kita perlu ⌊ s2/ 2⌋ kuadrat satu jenis dan ⌈ s2/ 2⌉ kotak dengan jenis lain (misalnya untuk s = 5 : 12 kotak hitam dan 13 kotak putih, atau sebaliknya) . Parameter k diatur ke 1 jika m a x ( b , w ) ≥ m i n ( b , w ) + 1 , yang mewakili kotak ekstra ini di satu sisi.
sumber
Jelly , 6 byte
Cobalah online!
Tautan diad yang mengembalikan ukuran papan maksimum.
Test suite untuk semua permutasi angka ke 20
Penjelasan
Jawaban Arnauld memiliki penjelasan yang bagus mengapa ini berhasil; tolong pertimbangkan untuk mengangkatnya juga!
sumber
Haskell , 35 byte
Cobalah online!
Penjelasan
Jawaban ini menghitung rumus berikut:
Mengapa rumus ini berfungsi? Baiklah mari kita mulai dengan memperhatikan hal berikut:
Setiap bujur sangkar dengan panjang sisi rata bisa2 × 1 .
dan
Setiap kotak dengan panjang ganjil dapat berupa ubin, sisipkan1 × 1 kotak, dengan 2 × 1 .
Sekarang kita perhatikan bahwa jika kita menempatkan2 × 1 ubin ini di papan catur masing-masing akan diletakkan di atas satu kotak hitam dan di kotak putih. Jadi jika kita membuat papan catur yang rata setiap ubin harus memiliki sepasang warna yang lain, dan jika kita membuat papan catur yang aneh setiap ubin, tetapi yang satu membutuhkan sepasang warna yang lain. Ini memberitahu kita bahwa jawabannya tidak pernah lebih dari ⌊ 2 min ( a , b ) + 1------------√⌋ . 2 mnt ( a, b ) adalah jumlah maksimum pasang kita dapat membuat dan+ 1 adalah untuk persegi terakhir yang doesnt' membutuhkan sepasang. Masalah dengan ini adalah bahwa jikaa =b kita tidak akan memiliki kuadrat tambahan untuk kasus aneh. Jadi kami menambahkan kondisi lain: Hasil kami tidak boleh lebih dari⌊ a + b----√⌋ . Itu adalah kita tidak bisa membuat kotak yang memiliki lebih banyak ubin daripada yang kita miliki.
Jadi kami hanya mengambil yang lebih rendah dari dua opsi.
sumber
Ruby , 36 byte
Cobalah online!
x-~x
adalah versi golf dari2*x+1
; kita mengurangi negasi dua-komplemen x dari dirinya sendiri. Setelah itu saya hanya menggunakan rumus jawaban ini , tetapi menciutkan dua bersarangmin
menjadi satu, kemudian menggunakan pemformatan string untuk memotong ke integer.sumber
Retina 0.8.2 , 50 byte
Cobalah online! Tautan termasuk kasus uji. Penjelasan:
Sortir angka dalam urutan menaik. Mari kita panggil mereka
l
danh
.Konversikan ke unary.
Hitung
l + max(h, l + 1)
. Ini setara dengan2 * min(b, w) + (b != w)
. Lihat jawaban @ Arnauld untuk alasan ini berhasil.Temukan akar kuadrat integer tertinggi.
sumber
05AB1E ,
87 byteCobalah secara online atau verifikasi semua kasus uji .
Perluasan:
Menggunakan turunan sepele dari rumus @Arnauld yang digunakan dalam jawaban JavaScript untuk menyimpan byte:
sumber
Japt , 11 byte
Port solusi JS Arnauld. Mengambil input sebagai array.
Cobalah
sumber
R , 32 byte
Cobalah online!
Mengambil
b
danw
dari stdin.Menggunakan rumus dari jawaban ini , tetapi meningkatkan perilaku
min
untuk mengambil minimum dari semua argumennya.sumber
Perl 6 ,
2926 byteTerima kasih kepada Jo King untuk -3 byte.
Cobalah online!
sumber
[min] @_
dapat@_.min
dan Anda dapat memindahkan[!=]
ke ujung untuk menghemat tanda kurung. 26 byteJapt , 10 byte
Port solusi JS Arnauld.
Cobalah online!
sumber
12, 12
.