Berapa banyak lagi reputasi yang saya butuhkan?

23

Programming Puzzles and Code Golf telah lulus dari versi beta. Segera kami akan mendapatkan desain situs kustom, dan dengan itu batas-batas reputasi untuk hak istimewa akan naik. Banyak pengguna akan kehilangan hak istimewa di situs. Jadi tugas Anda adalah menulis sebuah program yang memberi tahu kami berapa banyak reputasi tambahan yang akan kami butuhkan untuk menjaga hak istimewa kami.

Tugas

Tugas Anda adalah menulis kode terpendek untuk menemukan jumlah reputasi ekstra yang diperlukan pengguna untuk menjaga hak istimewa saat ini setelah desain situs, mengingat jumlah poin reputasi.

Input output

Anda dapat menerima input dan memberikan output dengan cara apa pun yang Anda suka, asalkan mengikuti aturan ini:

Input - Integer dari 1 hingga 250000+ inklusif . Program atau fungsi Anda harus dapat menerima angka yang lebih besar dari ini, tetapi harus menerima angka dalam rentang ini.

Output - Bilangan bulat yang mewakili jumlah poin reputasi yang dibutuhkan pengguna untuk mendapatkan hak istimewa saat ini setelah lulus.

Tolong, jangan ada celah standar .

Contoh algoritma

  1. Setel variabel ike input
  2. Setel variabel rke variabel i.
  3. Meskipun rtidak ada dalam daftar beta:
    1. Kurangi 1dari r.
  4. Setel nke posisi rdalam beta.
  5. Set rke item ndari graduated.
  6. Setel variabel oke hasil r - i.
  7. Jika o < 0:
    1. Setel variabel omenjadi 0.
  8. Variabel keluaran o.

Tabel

Daftar hak istimewa yang akan berubah

 | privilege name              | beta rep | graduation rep |
-+-----------------------------+----------+----------------+-
 | create tags                 |      150 |           1500 |
 | access review queues        |      350 |            500 |
 | cast close and reopen votes |      500 |           3000 |
 | established user            |      750 |           1000 |
 | edit questions and answers  |     1000 |           2000 |
 | create tag synonyms         |     1250 |           2500 |
 | approve tag wiki edits      |     1500 |           5000 |
 | access to moderator tools   |     2000 |          10000 |
 | protect questions           |     3500 |          15000 |
 | trusted user                |     4000 |          20000 |
 | access to site analytics    |     5000 |          25000 |
-+-----------------------------+----------+----------------+-
 | privilege name              | beta rep | graduation rep |

Daftar hak istimewa yang tidak akan berubah

 | privilege name               | reputation |
-+------------------------------+------------+-
 | create posts                 |          1 |
 | participate in meta          |          1 |
 | create wiki posts            |         10 |
 | remove new user restrictions |         10 |
 | vote up                      |         15 |
 | flag posts                   |         15 |
 | talk in chat                 |         20 |
 | comment everywhere           |         50 |
 | set bounties                 |         75 |
 | create chatrooms             |        100 |
 | edit community wiki          |        100 |
 | vote down                    |        125 |
-+------------------------------+------------+-
 | privilege name               | reputation |

Testcases

wizzwizz4                |   750 |  2250
cat                      |  2004 |  7996
Dennis ♦                 | 72950 |     0
Dr Green Eggs and Ham DJ |  4683 | 15317
New User                 |     1 |     0

Tidak semua jumlah reputasi benar pada saat penulisan.
Jika Anda ingin reputasi masa lalu atau sekarang Anda dihitung di sini, cukup komentar di bawah ini dan saya mungkin akan menambahkannya.

wizzwizz4
sumber
2
Anda harus memasukkan beberapa kasus uji.
Dennis
3
Btw berpartisipasi pada meta rep threshold di 5 untuk situs beta juga. PPCG telah mengubahnya agar pengguna baru dapat menggunakan kotak pasir. Ini seharusnya tidak berubah ketika kita lulus.
Dennis
1
@ kucing saya benar-benar menggunakannya; Terima kasih!
wizzwizz4
2
@ wizzwizz4 Terima kasih untuk itu; kepalaku mulai meledak dan aku hanya ingin 250 rep lagi.
kucing
1
@ wizzwizz4 Nah, itu hanya akan terlihat rendah di sebelah Dennis :-)
xnor

Jawaban:

4

Python, 101 byte

lambda n:max(0,eval("+(n>=%d)*%d"*7%(5e3,5e3,4e3,5e3,35e2,5e3,2e3,5e3,15e2,2e3,5e2,15e2,150,15e2))-n)
orlp
sumber
Saya pikir Anda memberikan perwakilan baru yang Anda butuhkan, bukan peningkatan. Jadi, f(750)seharusnya 1250, bukan 2000. Seharusnya perbaikan yang mudah.
xnor
@ xnor Yah, f(750)seharusnya 2250, tidak 1250:)
orlp
Masih perlu f(72950)memberi 0.
xnor
evalTrik Anda sangat bagus. Menggabungkan dengan daftar kompresi saya memberikan 83: lambda n:max(eval("+(n>=%s*500)*%s*500"*7%(.3,3,1,3,3,4,4,10,7,10,8,10,10,10))-n,0).
xnor
Apakah Anda pikir Anda dapat menambahkan penjelasan dan rincian kode?
wizzwizz4
4

Jelly , 40 37 byte

19112203.3b11×ȷḞ>Ḥ¬×9999322D‘¤S×.ȷ_»0

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

19112203.3b11×ȷḞ>Ḥ¬×9999322D‘¤S×.ȷ_»0  Main link. Argument: n

19112203.3b11                          Convert the float to base 11. Yields
                                       [10, 8, 7, 4, 3, 1, 0.30000000074505806].
             ×ȷ                        Multiply each by 1000.
               Ḟ                       Floor. Yields
                                       [10000, 8000, 7000, 4000, 3000, 1000, 300].
                 Ḥ                     Unhalve; yield 2n.
                >                      Compare each integer in the list with 2n.
                  ¬                    Negate the resulting Booleans.
                             ¤         Chain the three links to the left:
                    9999322D           Convert the integer to base 10.
                            ‘          Increment each digit. Yields 
                                       [10, 10, 10, 10, 4, 3, 3].
                   ×                   Multiply the Booleans with the corr. digits.
                              S        Compute the sum of the products.
                               ×.ȷ     Multiply the sum by 500.
                                  _    Subtract n.
                                   »0  Return the maximum of the difference and 0.
Dennis
sumber
3

CJam, 38 byte

0000000: 72 69 5f 35 30 2f 22 64 50 46 28 1e 0a 03 22 66  ri_50/"dPF(..."f
0000010: 3c 3a 2b 22 fa c8 96 64 32 1e 0f 00 22 3d 69 65  <:+"...d2..."=ie
0000020: 32 5c 2d 55 65 3e                                2\-Ue>

Cobalah online! atau verifikasi semua kasus uji . 1

Bagaimana itu bekerja

ri                        Read an integer n from STDIN.
  _50/                    Push a copy and divide it by 50.
     "…"                  Push the string with code points [100 80 70 40 30 10 3].
        f<                Compare each code point with n / 50.
          :+              Add the resulting Booleans.
            "…"           Push the string with code points
                          [250 200 150 100 50 30 15 0].
               =          Select the one at the index of the sum.
                i         Convert from character to integer.
                 e2       Multiply by 100.
                   \-     Subtract n from the product.
                     Ue>  Take the maximum of the difference and 0.

1 Perhatikan bahwa kode berisi byte nol, yang menyebabkan masalah di beberapa browser.

Dennis
sumber
3

JavaScript (ES6), 137 135 102 81 byte

n=>(n-=[5,0,.3,.6,1,2,3,4][[.3,1,3,4,7,8,10].findIndex(m=>m*500>n)+1]*5e3)<0?-n:0

Jika pengguna memiliki 5000 atau lebih reputasi kemudian findIndexgagal, menghasilkan -1, sehingga hasilnya bertambah sehingga saya dapat mengindeks ke dalam array reputasi baru yang diperlukan. Sunting: Disimpan 21 byte dengan menskalakan array input dan output.

   [.3,1,3,4,7,8,10]        Old reputations of note, divided by 500
    .findIndex(m=>m*500>n)  Skip ones that have been achieved
     +1                     Normalise the return value
  [5,0,.3,.6,1,2,3,4][]     Index into new reputation needed
   *5e3                     Scaling factor
 n-=                        Compare to the current reputation
()<0?-n:0                   Negate to return the requirement
Neil
sumber
Beberapa jawaban tidak berfungsi dengan testcase Pengguna Baru. Jika milik Anda tidak berfungsi, perbaiki.
wizzwizz4
@ wizzwizz4 Ah, perubahan hak istimewa meta? Tentu, itu perbaikan sederhana.
Neil
Apakah Anda pikir Anda dapat menambahkan penjelasan dan rincian kode?
wizzwizz4
2

Python, 88 byte

lambda n:max(sum(500*b*(n>=a*500)for a,b in zip([.3,1,3,4,7,8,10],[3,3,4]+[10]*4))-n,0)

Untuk setiap hak beta yang baru terlampaui, tambahkan jumlah perwakilan yang diperlukan untuk mendapatkan hak istimewa yang lulus berikutnya. Kemudian, rep tambahan yang diperlukan adalah rep baru minus rep saat ini, tetapi tidak kurang dari 0.

Kedua daftar batas rep disingkat oleh rep dalam beberapa 500.

Tidak
sumber
Anda mungkin juga mengganti [3]*2+[4]dengan [3,3,4], 9 vs 8 byte.
CalculatorFeline
@CatsAreFluffy Terima kasih, saya lupa saya mengubahnya dari desimal di mana itu layak.
xnor
2

Python 156 152 byte

s=str.split;n=input()
for k,v in map(s,s('5e3 5r4e3 5r3500 30./7r2e3 5r1500 10./3r500 6r1 1','r')):
 w=u(k);r=eval(v)*w
 if w<=n:print max(0,r-n);break

String data ( 5e3 5r4e3 5r3500 30./7r2e3 5r1500 10./3r500 6r1 1) adalah daftar dengan format (old_rep1) (new_rep1/old_rep1)r(old_repr) (new_rep2/old_rep2)hanya termasuk hak pribadi yang menetapkan maks rep baru (pengguna dengan> 750 rep masih membutuhkan setidaknya 3k rep pasca-kelulusan, meskipun mereka akan menjadi pengguna mapan di 1k. Daftar ini adalah diurutkan dari rep tertinggi pertama ke rep terendah terakhir.

pppery
sumber
Apakah Anda pikir Anda dapat menambahkan penjelasan dan rincian kode?
wizzwizz4
@ wizzwizz4 Selesai.
pppery
Hmm ... sekarang itu teknik yang pintar.
wizzwizz4
1

Pyth - 71 70 69 77 75 77 byte

eS,Z-@CM"\x00ǴϨלߐৄஸᎈ✐㪘丠憨"xKCM"\x00ŞˮϨӢǴלߐඬྠᎈ"e<#QK

Test Suite .

Maltysen
sumber
Ini tidak berfungsi untuk wizzwizz4testcase.
wizzwizz4
1
Beberapa jawaban tidak berfungsi dengan testcase Pengguna Baru. Saya perhatikan bahwa Anda tidak; tolong perbaiki!
wizzwizz4
Apakah Anda pikir Anda dapat menambahkan penjelasan dan rincian kode?
wizzwizz4
1

LiveCode 8, 318 byte

function g c
    local b,g,r
    put c into r
    put "0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5" into b
    split b by ","
    put "0.3,0.1,0.6,0.2,0.4,0.5,1,2,3,4,5" into g
    split g by ","
    repeat with i=1 to 11
       if c>b[i]*1000 and not c>g[i]*5000 then put max(r,g[i]*5000) into r
    end repeat
    return r-c
 end g

Seperti yang wizzwizz4disarankan, berikut ini penjelasannya:

function g c 

Buat fungsi bernama gmengambil parameter tunggal c. cadalah reputasi pengguna saat ini. Setara dengan def g(c)Python.

local b,g,r

Buat tiga variabel lokal: b, g, dan r. bakan menjadi cutoff reputasi untuk hak istimewa dalam versi beta,g akan berisi cutoff reputasi baru setelah lulus, dan rakan mewakili total reputasi yang harus dimiliki pengguna setelah lulus untuk mempertahankan hak istimewa mereka.

put c into r

Ini menyalin nilai c(reputasi pengguna saat ini) ke r. Setara denganr=c Python)

put "0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5" into b

Mirip dengan di atas, ini menetapkan b ke string yang berisi daftar potongan-potongan reputasi koma dalam versi beta, dibagi dengan 1000. Setara dengan b="0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5" Python.

split b by ","

Ini membagi variabel lokal bmenjadi array, menggunakan, sebagai pembatas. Array ini sekarang berisi cutoffs reputasi dalam versi beta, dibagi dengan 1000. Setara dengan b.split(",")di Python.

put "0.3,0.1,0.6,0.2,0.4,0.5,1,2,3,4,5" into g
split g by ","

Sama seperti di atas, kecuali itu g sekarang berisi daftar cutoff reputasi setelah lulus, dibagi dengan 5000

repeat with i=1 to 11

Mirip dengan forloop dalam bahasa lain, ini berulang 11 kali, dengan imenetapkan nilai berikutnya dalam urutan 1 hingga 11 setiap kali. Array dalam LiveCode mulai dari indeks 1. Dalam Python, ini akan menjadifor i in range(11) .

if c>b[i]*1000 and not c>g[i]*5000 then put max(r,g[i]*5000) into r

Ini adalah logika utama dari fungsi. Ia memeriksa untuk melihat apakah pengguna memiliki reputasi yang cukup untuk hak istimewa dalam posisi idaftar beta, jika demikian, dan jika mereka tidak memiliki reputasi yang cukup untuk hak istimewa setelah lulus, itu menetapkan variabel r(mewakili total reputasi bahwa pengguna harus harus mempertahankan hak istimewa mereka setelah lulus) untuk cutoff reputasi setelah lulus untuk hak istimewa itu (hanya jika reputasi baru lebih tinggi dari yang sebelumnya). Kode Python yang setara akan menjadi if c>b[i]*1000 and not c>g[i]*5000: r=max(g[i]*5000,r) akhir yang berulang. Berakhirnya lingkaran yang berulang. Mirip dengan C atau Java }. LiveCode menggunakan sintaks end 'insert contruct nameuntuk mengakhiri repeatloop, an if, switchdll ...

return r-c

Cukup jelas.

end g

Mengakhiri fungsinya g.

Pidosa
sumber
Pengguna baru memposting jawaban pada tantangan saya ? Saya merasa terhormat. +1 dan selamat datang di situs.
wizzwizz4
Anda dapat memperbaiki posting ini dengan menambahkan penjelasan dan rincian kode. (Jelaskan apa yang dilakukan kode, baris demi baris, di bawah kode Anda.)
wizzwizz4
@ wizzwizz4 Menambahkan penjelasan.
Pinalosa