На скільки мені потрібно більше репутації?


23

Головоломки та програмування Code Golf закінчив бета-версію. Незабаром ми отримаємо дизайн сайту на замовлення, і з цим межі репутації для привілеїв піднімуться. Дуже багато користувачів втратять привілеї на сайті. Отже, ваше завдання - написати програму, яка розповість, скільки зайвої репутації нам знадобиться, щоб зберегти свої привілеї.

Завдання

Ваше завдання - написати найкоротший код, щоб знайти суму додаткової репутації, яку користувачеві потрібно буде зберегти свої поточні привілеї після розробки сайту, враховуючи кількість балів репутації.

Введення-виведення

Ви можете прийняти вхід і дати вихід будь-яким способом, який вам подобається, якщо це дотримується цих правил:

Введення - Ціле число від 1 до 250000+ включно . Ваша програма чи функція повинні мати можливість приймати числа, більші за це, але вони повинні приймати числа в цьому діапазоні.

Вихідні дані - ціле число, що представляє кількість балів репутації, яким користувач повинен отримати, щоб зберегти свої поточні привілеї після закінчення навчання.

Ніякі стандартні лазівки , будь ласка.

Приклад алгоритму

  1. Встановити змінну iна вхід
  2. Встановити змінну rдо змінної i.
  3. Поки rнемає в списку beta:
    1. Відняти 1від r.
  4. Встановіть nпозицію rв beta.
  5. Встановіть rдля пункту nз graduated.
  6. Встановити змінну oна результат r - i.
  7. Якщо o < 0:
    1. Встановити змінну oна 0.
  8. Вихідна змінна o.

Столи

Таблиця пільг, яка зміниться

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

Таблиця привілеїв, яка не зміниться

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

Тестові шафи

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

Не всі підрахунки репутації є правильними під час написання.
Якщо ви хочете, щоб ваша минула чи теперішня репутація була тут, просто прокоментуйте нижче, і я, можливо, додам це.


2
Ви повинні включити кілька тестових випадків.
Денніс

3
Btw участь у метапороговому порозі також у 5 для бета-сайтів. PPCG налаштував її, щоб нові користувачі могли використовувати пісочницю. Це не повинно змінюватися, коли ми закінчимо навчання.
Денніс

1
@cat я фактично цим користувався; Спасибі!
wizzwizz4

2
@ wizzwizz4 Дякую за це; моя голова починає вибухати, і я хотів лише ще 250 респ
кіт

1
@ wizzwizz4 Ні, він би просто виглядав поруч із Деннісом :-)
xnor

Відповіді:


4

Пітон, 101 байт

lambda n:max(0,eval("+(n>=%d)*%d"*7%(5e3,5e3,4e3,5e3,35e2,5e3,2e3,5e3,15e2,2e3,5e2,15e2,150,15e2))-n)

Я думаю, що ви даєте необхідну вам нову відповідь, а не збільшення. Отже, f(750)має бути 1250, ні 2000. Слід легко виправити.
xnor

@xnor Ну, f(750)має бути 2250, не 1250:)
orlp

Ще потрібно f(72950)дати 0.
xnor

Ваш evalтрюк справді хороший. Поєднання його з моїм списком стиснення дає 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

Як ви думаєте, ви могли б додати пояснення коду та розрив?
wizzwizz4

4

Желе , 40 37 байт

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

Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Як це працює

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.

3

CJam, 38 байт

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>

Спробуйте в Інтернеті! або перевірити всі тестові випадки . 1

Як це працює

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 Зауважте, що код містить нульовий байт, що спричиняє проблеми в деяких браузерах.


3

JavaScript (ES6), 137 135 102 81 байт

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

Якщо користувач має 5000 або більше репутації, то findIndexне вдається, повертаючи -1, тому результат збільшується до того, що я можу проіндексувати масив необхідних нових репутацій. Редагувати: Збережено 21 байт шляхом масштабування вхідного та вихідного масиву.

   [.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

Деякі відповіді не відповідають тесту нового користувача. Якщо ваша не працює, виправте це.
wizzwizz4

@ wizzwizz4 Ага, мета привілей змінилася? Звичайно, це просте виправлення.
Ніл

Як ви думаєте, ви могли б додати пояснення коду та розрив?
wizzwizz4

2

Пітон, 88 байт

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)

За кожне перевищення нового бета-версії додається кількість повторень, необхідних для отримання наступного градуйованого привілею. Тоді необхідний додатковий повтор - новий повтор за мінусом поточного представника, але не менше 0.

Обидва списки кордонів повторень скорочуються повтором у кратних значеннях 500.


Ви можете також замінити [3]*2+[4]на [3,3,4]9 vs 8 байт.
CalculatorFeline

@CatsAreFluffy Спасибі, я забув, що змінив їх із десяткових знаків, де воно того варте.
xnor

2

Python 156 152 байт

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

Рядок даних ( 5e3 5r4e3 5r3500 30./7r2e3 5r1500 10./3r500 6r1 1) - це список лише у форматі, що (old_rep1) (new_rep1/old_rep1)r(old_repr) (new_rep2/old_rep2)включає лише приватні файли, які встановлюють нову максимальну кількість повторень (користувачам з> 750 повтореннями все ще потрібно принаймні 3 кп повторного закінчення, навіть якщо вони стануть зареєстрованим користувачем на 1 к.) відсортовано від найвищої реп. першої до найнижчої.


Як ви думаєте, ви могли б додати пояснення коду та розрив?
wizzwizz4

@ wizzwizz4 Готово.
pppery

Хм ... тепер це розумна техніка.
wizzwizz4

1

Pyth - 71 70 69 77 75 77 байт

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

Тестовий сюїт .


Це не працює для wizzwizz4тесту.
wizzwizz4

1
Деякі відповіді не відповідають тесту нового користувача. Я помітив, що твої ні; будь ласка, виправте це!
wizzwizz4

Як ви думаєте, ви могли б додати пояснення коду та розрив?
wizzwizz4

1

LiveCode 8, 318 байт

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

Як wizzwizz4запропоновано, ось пояснення:

function g c 

Створіть функцію з назвою gвзяття одного параметра c.c- поточна репутація користувача. Рівнозначно def g(c)в Python.

local b,g,r

Створення трьох локальних змінних: b, g, і r. bбуде обмеженням репутації для привілеїв у бета-версії,g міститиме нове обмеження репутації після закінчення навчання і rбуде представляти загальну репутацію, яку користувач повинен мати після закінчення навчання, щоб зберегти свої привілеї.

put c into r

Це копіює значення c(поточна репутація користувача) у r. Еквівалентно r=cPython)

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

Як і вище, цей параметр встановлює b до рядка, що містить перелік комами, що визначає список обмежень репутації у бета-версії, розділених на 1000. Еквівалентно b="0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5"Python.

split b by ","

Це розділяє локальну змінну bна масив, використовуючи, як роздільник. Тепер цей масив містить відключення репутації в бета-версії, поділене на 1000. Еквівалентно b.split(",")Python.

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

Те саме, що вище, крім цього g зараз міститься перелік репутаційних скорочень після закінчення навчання, розділений на 5000

repeat with i=1 to 11

Подібно до forциклу в інших мовах, це повторюється 11 разів, iпризначаючи наступне значення у послідовності 1-11 для кожного разу. Масиви в LiveCode починаються з індексу 1. У Python це було бfor i in range(11) .

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

Це основна логіка функції. Він перевіряє, чи є у користувача достатньо репутації привілею на позиції iбета-списку, якщо так, і якщо їм не вистачає репутації для привілею після закінчення навчання, він встановлює змінну r(що представляє загальну репутацію, яку користувач доведеться зберегти свої привілеї після закінчення навчання) до скорочення репутації після закінчення навчання для цього привілею (тільки якщо нова репутація вища за попередню). Еквівалентним кодом Python було б if c>b[i]*1000 and not c>g[i]*5000: r=max(g[i]*5000,r) кінцеве повторення Закінчується цикл повторення. Схожий на C або Java }. LiveCode використовує синтаксис end 'insert contruct nameдля закінчення repeatциклу, an if, і switchт.д. ...

return r-c

Досить зрозуміло.

end g

Закінчує функцію g.


Зовсім новий користувач опублікував відповідь на мій виклик? Мені честь. +1 та ласкаво просимо на сайт.
wizzwizz4

Ви можете покращити цю публікацію, додавши пояснення коду та розбивку. (Поясніть, що робить код, рядок за рядком, під кодом.)
wizzwizz4

@ wizzwizz4 Додано пояснення.
penalosa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.