Сколько еще репутации мне нужно?

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 |

Testcases

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

Не все показатели репутации являются правильными на момент написания статьи.
Если вы хотите, чтобы ваш прошлый или текущий счет репутации здесь, просто прокомментируйте ниже, и я, возможно, добавлю его.

wizzwizz4
источник
2
Вы должны включить несколько тестовых случаев.
Деннис
3
Кстати, участие в мета- порог в 5 для бета-сайтов, а также. PPCG настроил его так, чтобы новые пользователи могли использовать песочницу. Это не должно измениться, когда мы закончим.
Деннис
1
@cat Я действительно использовал это; Благодарность!
wizzwizz4
2
@ wizzwizz4 Спасибо за это; моя голова начинает взорваться, и я хотел только 250 повторений.
кошка
1
@ wizzwizz4 Нет, это будет выглядеть низко рядом с Деннисом :-)
xnor

Ответы:

4

Python, 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)
orlp
источник
Я думаю, что вы даете новый представитель вам нужно, а не увеличение. Так и f(750)должно быть 1250, нет 2000. Должно быть легко исправить.
xnor
@xnor Ну, f(750)должно быть 2250, нет 1250:)
orlp
Еще надо бы f(72950)дать 0.
xnor
Ваш evalтрюк действительно хорош. Сочетание этого с моим списком сжатия дает 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

Python, 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.

XNOR
источник
Вы также можете заменить [3]*2+[4]на [3,3,4]9 против 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 тыс. Списка. отсортировано по возрастанию от первого до последнего.

pppery
источник
Как вы думаете, вы могли бы добавить объяснение кода и разбивку?
wizzwizz4
@ wizzwizz4 Готово.
pppery
Хм ... теперь это умная техника.
wizzwizz4
1

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

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

Тестовый пакет .

Maltysen
источник
Это не работает для 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=cв Python)

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) end repeat Заканчивает цикл повторения. Похоже на C или Java }. LiveCode использует синтаксис end 'insert contruct nameдля завершения repeatцикла, а if, и switchт. Д ...

return r-c

Довольно очевидный.

end g

Заканчивает функцию g.

Пеналоса
источник
Новый пользователь опубликовать ответ на мой вызов? Я удостоен чести +1 и добро пожаловать на сайт.
wizzwizz4
Вы можете улучшить этот пост, добавив объяснение кода и разбивку. (Объясните, что делает код, строка за строкой, ниже вашего кода.)
wizzwizz4
@ wizzwizz4 Добавлено объяснение.
пенальоса