¿Cuánto más reputación necesito?

23

Programming Puzzles and Code Golf se graduó de beta. Pronto obtendremos un diseño de sitio personalizado, y con eso los límites de reputación para los privilegios aumentarán. Muchos usuarios perderán privilegios en el sitio. Entonces, su tarea es escribir un programa que nos diga cuánta reputación adicional necesitaremos para mantener nuestros privilegios.

Tarea

Su tarea es escribir el código más corto para encontrar la cantidad de reputación adicional que un usuario necesitará para mantener sus privilegios actuales después del diseño del sitio, dada la cantidad de puntos de reputación.

De entrada y salida

Puede aceptar entradas y dar salidas de la forma que desee, siempre que siga estas reglas:

Entrada : un número entero de 1 a 250000+ inclusive . Su programa o función debe poder aceptar números mayores que este, pero debe aceptar números en este rango.

Salida : un número entero que representa el número de puntos de reputación que el usuario necesitará para mantener sus privilegios actuales después de la graduación.

No hay lagunas estándar , por favor.

Algoritmo de ejemplo

  1. Establecer variable ia la entrada
  2. Establecer variable ra variable i.
  3. Mientras rno está en la lista beta:
    1. Restar 1de r.
  4. Establecer nen la posición de rin beta.
  5. Establecer rcomo elemento nde graduated.
  6. Establecer variable oal resultado de r - i.
  7. Si o < 0:
    1. Establecer variable oen 0.
  8. Variable de salida o.

Mesas

Tabla de privilegios que cambiará

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

Tabla de privilegios que no cambiará

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

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

No todos los recuentos de reputación son correctos al momento de escribir
Si desea que su reputación pasada o presente cuente aquí, simplemente comente a continuación y tal vez lo agregue.

wizzwizz4
fuente
2
Debe incluir algunos casos de prueba.
Dennis
3
Por cierto, participar en el umbral de meta rep en 5 para sitios beta también. PPCG lo personalizó para que los nuevos usuarios puedan usar el sandbox. Esto no debería cambiar cuando nos graduemos.
Dennis
1
@cat Realmente usé eso; ¡Gracias!
wizzwizz4
2
@ wizzwizz4 Gracias por eso; mi cabeza está empezando a explotar y solo quería 250 repeticiones más.
gato
1
@ wizzwizz4 Nah, se vería bajo junto a Dennis :-)
xnor

Respuestas:

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
fuente
Creo que le está dando el nuevo representante que necesita, no el aumento. Entonces, f(750)debería ser 1250, no 2000. En caso de ser una solución fácil.
xnor
@xnor Bueno, f(750)debería ser 2250, no 1250:)
orlp
Todavía necesito f(72950)dar 0.
xnor
Tu evaltruco es realmente bueno. Combinándolo con mi lista de compresión da 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
¿Crees que podrías agregar una explicación y un desglose del código?
wizzwizz4
4

Jalea , 40 37 bytes

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

Pruébalo en línea! o verificar todos los casos de prueba .

Cómo 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
fuente
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>

Pruébalo en línea! o verificar todos los casos de prueba .1

Cómo 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 Tenga en cuenta que el código contiene un byte nulo, lo que causa problemas en algunos navegadores.

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

Si el usuario tiene 5000 o más reputación, entonces findIndexfalla, devolviendo -1, por lo que el resultado se incrementa para que pueda indexar en la matriz de nuevas reputaciones necesarias. Editar: ahorró 21 bytes al escalar la matriz de entrada y salida.

   [.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
fuente
Algunas respuestas no funcionan con el caso de usuario nuevo. Si el tuyo no funciona, arréglalo.
wizzwizz4
@ wizzwizz4 Ah, ¿el cambio de privilegio meta? Claro, eso es una solución simple.
Neil
¿Crees que podrías agregar una explicación y un desglose del 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)

Por cada nuevo privilegio beta excedido, agrega la cantidad de repeticiones necesaria para llegar al siguiente privilegio graduado. Entonces, la repetición adicional necesaria es la nueva repetición menos la repetición actual, pero no menos de 0.

Ambas listas de límites de representación se acortan por representación en múltiplos de 500.

xnor
fuente
También podría reemplazar [3]*2+[4]con [3,3,4]9 vs 8 bytes.
CalculatorFeline
@CatsAreFluffy Gracias, olvidé que los cambié de decimales donde vale la 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

La cadena de datos ( 5e3 5r4e3 5r3500 30./7r2e3 5r1500 10./3r500 6r1 1) es una lista con el formato que (old_rep1) (new_rep1/old_rep1)r(old_repr) (new_rep2/old_rep2)solo incluye los privilegios que establecen el nuevo representante máximo (los usuarios con> 750 representantes aún necesitan al menos 3k representantes después de la graduación, aunque serán un usuario establecido en 1k. La lista es ordenados de la rep más alta primero a la rep más baja al final.

pppery
fuente
¿Crees que podrías agregar una explicación y un desglose del código?
wizzwizz4
@ wizzwizz4 Hecho.
pppery
Hmm ... ahora esa es una técnica inteligente.
wizzwizz4
1

Pyth - 71 70 69 77 75 77 bytes

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

Test Suite .

Maltysen
fuente
Esto no funciona para el caso de wizzwizz4prueba.
wizzwizz4
1
Algunas respuestas no funcionan con el caso de usuario nuevo. He notado que el tuyo no; ¡Por favor, arreglalo!
wizzwizz4
¿Crees que podrías agregar una explicación y un desglose del 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 se wizzwizz4sugiere, aquí hay una explicación:

function g c 

Cree una función llamada gtomando un solo parámetro c. ces la reputación actual del usuario. Equivalente a def g(c)en Python.

local b,g,r

Crear tres variables locales: b, g, y r. bserán los límites de reputación para los privilegios en beta, gcontendrán los nuevos límites de reputación después de la graduación y rrepresentarán la reputación total que el usuario tendrá que tener después de la graduación para conservar sus privilegios.

put c into r

Esto copia el valor de c(la reputación actual del usuario) en r. Equivalente a r=cen Python)

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

Similar a lo anterior, esto establece b en una cadena que contiene una lista delimitada por comas de los límites de reputación en beta, dividida por 1000. Equivalente a b="0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5"en Python.

split b by ","

Esto divide la variable local b en una matriz, utilizando ,como delimitador. Esta matriz ahora contiene los límites de reputación en beta, divididos por 1000. Equivalente a b.split(",")en Python.

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

Igual que el anterior, excepto que gahora contiene una lista de los límites de reputación después de la graduación, dividido por 5000

repeat with i=1 to 11

Similar a un forbucle en otros idiomas, esto se repite 11 veces, coni el siguiente valor asignado en la secuencia 1 a 11 cada vez. Las matrices en LiveCode comienzan en el índice 1. En Python, esto sería 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

Esta es la lógica principal de la función. Comprueba si el usuario tiene suficiente reputación para el privilegio en la posición ide la lista beta, si es así, y si no tiene suficiente reputación para el privilegio después de la graduación, establece la variable r(que representa la reputación total que el usuario tendrá que conservar sus privilegios después de la graduación) al límite de reputación después de la graduación para ese privilegio (solo si la nueva reputación es más alta que la anterior). El código Python equivalente sería if c>b[i]*1000 and not c>g[i]*5000: r=max(g[i]*5000,r) end repeat repite el ciclo de repetición. Similar a C o Java }. LiveCode usa la sintaxis end 'insert contruct namepara finalizar un repeatciclo, unif , a, switchetc.

return r-c

Bastante autoexplicativo.

end g

Termina la función g.

penalosa
fuente
¿Un nuevo usuario publica una respuesta sobre mi desafío? Soy honrado. +1 y bienvenido al sitio.
wizzwizz4
Puede mejorar esta publicación agregando una explicación y un desglose del código. (Explique qué hace el código, línea por línea, debajo de su código.)
wizzwizz4
@ wizzwizz4 Se agregó una explicación.
penalosa