我还需要多少声望?


23

编程拼图和Code Golf已从Beta毕业。很快,我们将获得一个自定义的网站设计,并且特权的声誉边界将上升。许多用户将失去该网站的特权。因此,您的任务是编写一个程序,该程序告诉我们保持特权所需的额外声誉。

任务

您的任务是编写最短的代码,以找到在给定信誉点数量的情况下,用户在网站设计后仍需要保留其当前特权所需的额外信誉。

输入输出

您可以接受输入并以您喜欢的任何方式提供输出,只要它遵循以下规则:

输入 -1到250000(含)之间的整数。您的程序或函数应该能够接受大于此的数字,但是它必须接受该范围内的数字。

输出 -一个整数,代表用户毕业后保持其现有特权所需的声誉点数。

请没有标准漏洞

示例算法

  1. 将变量设置i为输入
  2. 将变量设置r为variable i
  3. 虽然r不在列表中beta
    1. 减去1r
  4. 设置n到的位置rbeta
  5. 设置rngraduated
  6. 将变量设置o为的结果r - i
  7. 如果o < 0
    1. 将变量设置o0
  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
顺便说一句,对于beta站点,参加 5的meta rep阈值也是如此。PPCG已对其进行了自定义,以便新用户可以使用沙箱。我们毕业时这应该不会改变。
丹尼斯

1
@cat我实际上是用过的;谢谢!
wizzwizz4 2016年

2
@ wizzwizz4谢谢你;我的脑袋开始爆炸了,我只想要250个代表。

1
@ wizzwizz4不,它在丹尼斯旁边看上去很低:-)
xnor

Answers:


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)

我认为您是在提供所需的新代表,而不是增加。因此,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 2016年

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

@ wizzwizz4啊,元权限更改了吗?当然,这很简单。
尼尔

您认为您可以添加代码说明和细分吗?
wizzwizz4 2016年

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)

对于超出的每个新Beta特权,添加获得下一个分级特权所需的代表数量。然后,所需的额外rep是新rep减去当前rep,但不少于0。

两个rep边界列表都由rep缩短为的倍数500


您也可以将替换[3]*2+[4][3,3,4]9 vs 8字节。
CalculatorFeline

@CatsAreFluffy谢谢,我忘记了在值得的地方将它们从十进制更改。
xnor

2

Python 156152字节

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)仅包括设置新的最大rep的privleges(具有750 rep以上的用户仍需要至少3k rep毕业后,即使他们将是1k的既定用户。该列表是从最高代表到最低代表排序。


您认为您可以添加代码说明和细分吗?
wizzwizz4 16-4-24

@ wizzwizz4完成。
pppery

嗯...现在这是一个聪明的技术。
wizzwizz4 2016年


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使用单个参数命名的函数cc是用户当前的声誉。等效def g(c)于Python。

local b,g,r

创建三个局部变量:bg,和rb将是Beta中特权的信誉切断,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设置为一个字符串,其中包含一个逗号分隔的beta信誉终止列表,除以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,将其拆分为一个数组,。现在,此数组包含beta中的信誉截止点,除以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对Beta列表中的特权拥有足够的声誉,如果可以,并且在毕业后如果对特权没有足够的声誉,则会设置变量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 2016年

您可以通过添加代码说明和细分来改善此帖子。(在代码下方逐行说明代码的作用。)
wizzwizz4 '16

@ wizzwizz4添加了解释。
penalosa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.