Pengaturan:
Sebuah jejaring sosial melaporkan jumlah suara yang dimiliki suatu pos dengan dua cara: jumlah upvote bersih (total upvotes - total downvotes), dan % suara yang upvotes , dibulatkan ke bilangan bulat terdekat (0,5 bulat ke atas). Jumlah upvote bersih adalah bilangan bulat (tidak harus positif), dan yang kedua dijamin bilangan bulat antara 0 dan +100 inklusif. Jumlah upvotes dan jumlah downvotes adalah nol atau bilangan bulat positif 32-bit (Anda dapat menentukan yang ditandatangani atau tidak ditandatangani). Asumsikan bahwa jika tidak ada total suara nol, persentase yang dipvotasikan dilaporkan sebagai nol.
Tantangan:
Dengan kedua bilangan bulat ini (upvote bersih dan% tervotasikan), program apa yang paling singkat yang dapat Anda tulis yang menentukan jumlah terendah total upvote yang diterima pos, dengan semua kendala di atas terpenuhi?
Batasan input dijamin. Jika input tidak memenuhi kendala di atas, perilaku program terserah Anda. Bonus pujian jika tidak memasuki loop tak terbatas atau crash. Pertimbangkan untuk mengembalikan nomor negatif jika Anda menginginkan panduan lebih lanjut.
Aturan umum:
- Ini adalah kode-golf , sehingga solusi terpendek yang valid (diukur dalam byte) menang.
- Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'. Bonus pujian untuk bahasa Web sisi klien seperti Javascript.
- Jika Anda memiliki solusi menarik dalam berbagai bahasa, poskan secara terpisah .
- Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter dan tipe pengembalian yang tepat, atau program lengkap. Panggilanmu.
- Celah default dilarang.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
- Selain itu, harap tambahkan penjelasan tentang cara kerja kode.
- Ingatlah bahwa jika Anda melakukan operasi pembagian bilangan bulat yang memotong (mis. 20/3 = 6) daripada putaran , itu mungkin tidak sepenuhnya benar.
- Kasus uji tambahan yang mengeksplorasi kasus tepi dalam kendala di atas dipersilakan.
- Sementara tipe pengembalian yang diharapkan adalah angka, boolean "false" dapat digunakan sebagai pengganti 0 .
Contoh uji kasus:
Kolom pertama hanyalah nomor referensi yang disertakan untuk memfasilitasi diskusi.
ref net %up answer
1 0 0 => 0
2 -5 0 => 0
3 -4 17 => 1
4 -3 29 => 2
5 -2 38 => 3
6 -1 44 => 4
7 0 50 => 1
8 5 100 => 5
9 4 83 => 5
10 3 71 => 5
11 2 63 => 5
12 1 56 => 5
13 1234 100 => 1234
14 800 90 => 894 (tip: don't refer to this as the "last test case;" others may be added.)
1000, 100
. Bisakah Anda mengonfirmasi bahwa jawaban yang diharapkan adalah1000
?Jawaban:
JavaScript (ES6), 47 byte
Mengambil input dalam sintaks currying
(n)(p)
, di mana n adalah jumlah upvote bersih dan p adalah persentase upvote. Dapat kembalifalse
untuk0
.Cobalah online!
Berkomentar
Kasus tepi
Biarkan F n (u) = u / (u - n / 2) * 50 + 0,5
Jika u = 0 dan n = 0 , maka F n (u) = NaN dan F n (u) XOR p = p . Jadi, kita mengembalikan u = 0 jika n = p = 0 (iterasi pertama dari kasus uji pertama) atau melanjutkan dengan rekursi jika p! = 0 (iterasi pertama dari kasus uji ke-7).
Jika u> 0 dan u = n / 2 , maka F n (u) = + Infinity dan - lagi - F n (u) XOR p = p . Kecuali p = 0 , kita lanjutkan dengan iterasi berikutnya. (Ini terjadi pada kasus uji 9 dan 11.)
sumber
Stax , 17 byte
Jalankan dan debug itu
Ini adalah kekuatan kasar. Dimulai dengan 0 untuk kandidat upvotes, dan naik hingga memenuhi formula.
Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.
Jalankan yang ini
sumber
Bersih ,
114107104 byteCobalah online!
Menentukan fungsi
$ :: Int Int -> Real
, di mana argumen bertanda integer dan nilai kembalinya adalah float presisi ganda yang dapat direpresentasikan dengan integer bertanda 32-bit.Ini memeriksa setiap nilai
c
dalam persamaanb=-cd/(d+1)
untuk menemukan yangb
memuaskana+c=b
danb/(b+c)=d
, karenac
hasil terkecil dalam terkecilb
, ambil elemen pertama dari set semua solusi.sumber
05AB1E , 13 byte [rusak ringan]
Cobalah online!
Penjelasan:
Untuk mengatasi ini, saya mengasumsikan input a, b dan hasil yang diharapkan x. Diberikan info dalam pengaturan, yang memberi saya persamaan:
Mengatur ulang untuk x memberi
Satu-satunya test case yang tidak berfungsi adalah 0, 50 - Saya hanya melakukan hardcode untuk memeriksa ini.
sumber
Go 1.10, 154 byte
Cobalah di Playground Go! (TIO menjalankan Go 1.9, yang tidak memiliki matematika. Putaran)
Versi tidak disatukan
Untuk menambahkan penjelasan, rumus di atas untuk r dapat diturunkan dengan menyelesaikan secara simultan
n=v-d
danu = 100 * v/(v + d)
untuk v, di mana v dan d adalah jumlah upvote dan downvotes masing-masing. Rumus turunan tidak terdefinisi untuk v = 50, jadi kita harus menangani kasus itu (yang kita lakukan dengan pernyataan if pertama).sumber