Quanto mais reputação eu preciso?

23

A programação de quebra-cabeças e o Code Golf se formou na versão beta. Em breve, obteremos um design de site personalizado e, com isso, os limites de reputação para privilégios subirão. Muitos usuários perderão privilégios no site. Portanto, sua tarefa é escrever um programa que nos diga quanta reputação extra precisaremos para manter nossos privilégios.

Tarefa

Sua tarefa é escrever o código mais curto para encontrar a quantidade de reputação extra que um usuário precisará para manter seus privilégios atuais após o design do site, considerando o número de pontos de reputação.

Entrada / Saída

Você pode aceitar entrada e fornecer saída da maneira que desejar, desde que siga estas regras:

Entrada - Um número inteiro de 1 a 250000+, inclusive . Seu programa ou função deve poder aceitar números maiores que isso, mas deve aceitar números nesse intervalo.

Saída - Um número inteiro que representa o número de pontos de reputação que o usuário precisará obter para manter seus privilégios atuais após a graduação.

Sem brechas padrão , por favor.

Algoritmo de exemplo

  1. Definir variável ipara a entrada
  2. Defina a variável rcomo variável i.
  3. Enquanto rnão estiver na lista beta:
    1. Subtrair 1de r.
  4. Defina npara a posição de rin beta.
  5. Defina rpara o item nde graduated.
  6. Defina a variável opara o resultado de r - i.
  7. Se o < 0:
    1. Defina a variável ocomo 0.
  8. Variável de saída o.

Tabelas

Tabela de privilégios que mudarã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 |

Tabela de privilégios que não serão alterados

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

Casos de teste

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

Nem todas as contagens de reputação estão corretas no momento da redação.
Se você deseja que sua reputação passada ou presente conte aqui, basta comentar abaixo e talvez eu a adicione.

wizzwizz4
fonte
2
Você deve incluir alguns casos de teste.
Dennis
3
Entre a participação no limite de meta rep em 5 também para sites beta. O PPCG o personalizou para que novos usuários possam usar a sandbox. Isso não deve mudar quando nos formarmos.
Dennis19 /
1
@cat Eu realmente usei isso; obrigado!
Wizzwizz4
2
@ wizzwizz4 Obrigado por isso; minha cabeça está começando a explodir e eu só queria mais 250 repetições.
gato
1
@ wizzwizz4 Nah, seria apenas olhar baixo ao lado de Dennis :-)
xnor

Respostas:

4

Python, 101 bytes

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
fonte
Eu acho que você está dando o novo representante que você precisa, não o aumento. Então, f(750)deveria ser 1250, não 2000. Deve ser uma solução fácil.
Xnor
@xnor Bem, f(750)deve ser 2250, não 1250:)
orlp
Ainda precisa ter f(72950)dado 0.
Xnor
Seu evaltruque é realmente bom. Combinando isso com a minha lista de compressão dá 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 23/04
Você acha que poderia adicionar uma explicação e detalhamento do código?
Wizzwizz4
4

Geléia , 40 37 bytes

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

Experimente online! ou verifique todos os casos de teste .

Como funciona

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

CJam, 38 bytes

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>

Experimente online! ou verifique todos os casos de teste . 1 1

Como funciona

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 Observe que o código contém um byte nulo, o que causa problemas em alguns navegadores.

Dennis
fonte
3

JavaScript (ES6), 137 135 102 81 bytes

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

Se o usuário tiver 5000 ou mais reputação, findIndexfalhará, retornando -1, para que o resultado seja incrementado para que eu possa indexar na matriz de novas reputações necessárias. Editar: salvou 21 bytes escalando a matriz de entrada e saída.

   [.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
fonte
Algumas respostas não funcionam com a caixa de teste Novo Usuário. Se o seu não funcionar, corrija-o.
Wizzwizz4
@ wizzwizz4 Ah, a mudança de privilégio meta? Claro, isso é uma solução simples.
23416 Neil
Você acha que poderia adicionar uma explicação e detalhamento do código?
Wizzwizz4
2

Python, 88 bytes

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)

Para cada novo privilégio beta excedido, adiciona a quantidade de representantes necessária para obter o próximo privilégio graduado. Em seguida, o representante adicional necessário é o novo representante menos o representante atual, mas não menos que 0.

Ambas as listas de limites de representantes são encurtadas por representantes em múltiplos de 500.

xnor
fonte
Você também pode substituir [3]*2+[4]por [3,3,4]9 ou 8 bytes.
CalculatorFeline
@CatsAreFluffy Obrigado, esqueci que as alterei de decimais onde vale a pena.
Xnor
2

Python 156 152 bytes

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

A sequência de dados ( 5e3 5r4e3 5r3500 30./7r2e3 5r1500 10./3r500 6r1 1) é uma lista com o formato (old_rep1) (new_rep1/old_rep1)r(old_repr) (new_rep2/old_rep2)apenas incluindo privilégios que definem o novo representante máximo (usuários com> 750 representantes ainda precisam de pelo menos 3 mil representantes de pós-graduação, mesmo que eles sejam um usuário estabelecido em 1 mil. A lista é classificado do representante mais alto primeiro para o representante mais baixo por último.

pppery
fonte
Você acha que poderia adicionar uma explicação e detalhamento do código?
Wizzwizz4
@ wizzwizz4 Concluído.
pppery
Hmm ... agora essa é uma técnica inteligente.
Wizzwizz4
1

Pitão - 71 70 69 77 75 77 bytes

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

Conjunto de Teste .

Maltysen
fonte
Isso não funciona para o wizzwizz4testcase.
Wizzwizz4
1
Algumas respostas não funcionam com a caixa de teste Novo Usuário. Eu notei que o seu não; por favor conserte!
Wizzwizz4
Você acha que poderia adicionar uma explicação e detalhamento do código?
Wizzwizz4
1

LiveCode 8, 318 bytes

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

Como wizzwizz4sugerido, aqui está uma explicação:

function g c 

Crie uma função denominada gusando um único parâmetro c. cé a reputação atual do usuário. Equivalente a def g(c)em Python.

local b,g,r

Criar três variáveis locais: b, g, e r. bserão os pontos de corte de reputação para privilégios na versão beta, gconterão os novos pontos de corte de reputação após a graduação e rrepresentarão a reputação total que o usuário terá após a graduação para manter seus privilégios.

put c into r

Isso copia o valor de c(a reputação atual do usuário) em r. Equivalente a r=cem Python)

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

Semelhante ao acima, isso define b como uma cadeia de caracteres que contém uma lista delimitada por vírgula dos pontos de corte de reputação em beta, divididos por 1000. Equivalente a b="0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5"em Python.

split b by ","

Isso divide a variável local bem uma matriz, usando ,como delimitador. Essa matriz agora contém os pontos de reputação em beta, divididos por 1000. Equivalente a b.split(",")em Python.

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

O mesmo que acima, exceto que gagora contém uma lista dos pontos de corte de reputação após a graduação, divididos por 5000

repeat with i=1 to 11

Semelhante a um forloop em outros idiomas, isso se repete 11 vezes, com io próximo valor atribuído na sequência 1 a 11 a cada vez. As matrizes no LiveCode começam no índice 1. No Python, isso seria 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

Essa é a principal lógica da função. Ele verifica se o usuário tem reputação suficiente para o privilégio na posição ida lista beta; se houver, e se não tiver reputação suficiente para o privilégio após a graduação, define a variável r(representando a reputação total que o usuário terá que manter seus privilégios após a graduação) para o ponto de corte da reputação após a graduação para esse privilégio (somente se a nova reputação for maior que a anterior). O código Python equivalente seria if c>b[i]*1000 and not c>g[i]*5000: r=max(g[i]*5000,r) end repeat Finaliza o loop repeat. Semelhante ao C ou Java }. O LiveCode usa a sintaxe end 'insert contruct namepara finalizar um repeatloop, um if, um switchetc ...

return r-c

Bastante auto-explicativo.

end g

Termina a função g.

penalosa
fonte
Um novo usuário postou uma resposta sobre meu desafio? Estou honrado. +1 e bem-vindo ao site.
precisa saber é o seguinte
Você pode melhorar esta postagem adicionando uma explicação e detalhamento do código. (Explique o que o código faz, linha por linha, abaixo de seu código.)
wizzwizz4
@ wizzwizz4 Adicionado explicação.
Penalosa