De combien de réputation ai-je besoin?


23

Programmation Puzzles et Code Golf est diplômé de la version bêta. Bientôt, nous aurons un design de site personnalisé, et avec cela les limites de réputation pour les privilèges augmenteront. De nombreux utilisateurs perdront des privilèges sur le site. Votre tâche consiste donc à écrire un programme qui nous indique la réputation supplémentaire dont nous aurons besoin pour conserver nos privilèges.

Tâche

Votre tâche consiste à écrire le code le plus court pour trouver la quantité de réputation supplémentaire dont un utilisateur aura besoin pour conserver ses privilèges actuels après la conception du site, compte tenu du nombre de points de réputation.

Entrée sortie

Vous pouvez accepter une entrée et donner une sortie comme vous le souhaitez, tant qu'elle suit ces règles:

Entrée - Un entier de 1 à 250000+ inclus . Votre programme ou fonction doit pouvoir accepter des nombres supérieurs à celui-ci, mais il doit accepter des nombres compris dans cette plage.

Sortie - Un entier représentant le nombre de points de réputation dont l'utilisateur aura besoin pour conserver ses privilèges actuels après l'obtention du diplôme.

Pas de failles standard , s'il vous plaît.

Exemple d'algorithme

  1. Définir la variable isur l'entrée
  2. Définissez variable rsur variable i.
  3. Tant qu'il rn'est pas dans la liste beta:
    1. Soustraire 1de r.
  4. Réglez nsur la position rin beta.
  5. Défini rsur l'élément nde graduated.
  6. Définissez variable osur le résultat de r - i.
  7. Si o < 0:
    1. Définissez la variable osur 0.
  8. Variable de sortie o.

les tables

Table des privilèges qui va changer

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

Table des privilèges qui ne changera pas

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

Cas de test

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

Tous les comptes de réputation ne sont pas corrects au moment de la rédaction
Si vous voulez que votre réputation passée ou présente compte ici, commentez ci-dessous et je l' ajouterai peut-être .


2
Vous devez inclure quelques cas de test.
Dennis

3
De plus, la participation au seuil de méta- rep dans 5 pour les sites bêta. PPCG l'a personnalisé afin que les nouveaux utilisateurs puissent utiliser le bac à sable. Cela ne devrait pas changer lorsque nous serons diplômés.
Dennis

1
@cat J'ai effectivement utilisé cela; Merci!
wizzwizz4

2
@ wizzwizz4 Merci pour cela; ma tête commence à exploser et je ne voulais que 250 répétitions de plus.
chat

1
@ wizzwizz4 Nah, il semblerait juste bas à côté de Dennis :-)
xnor

Réponses:


4

Python, 101 octets

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

Je pense que vous donnez le nouveau représentant dont vous avez besoin, pas l'augmentation. Donc, ça f(750)devrait l'être 1250, non 2000. Devrait être une solution facile.
xnor

@xnor Eh bien, ça f(750)devrait l'être 2250, pas 1250:)
orlp

Encore faut-il avoir f(72950)donné 0.
xnor

Votre evalastuce est vraiment bonne. La combinaison de compression avec ma liste donne 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

Pensez-vous que vous pourriez ajouter une explication et une ventilation du code?
wizzwizz4

4

Gelée , 40 37 octets

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

Essayez-le en ligne! ou vérifiez tous les cas de test .

Comment ça marche

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 octets

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>

Essayez-le en ligne! ou vérifiez tous les cas de test . 1

Comment ça marche

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 Notez que le code contient un octet nul, ce qui provoque des problèmes dans certains navigateurs.


3

JavaScript (ES6), 137 135 102 81 octets

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 l'utilisateur a 5000 ou plus de réputation findIndexéchoue, renvoyant -1, donc le résultat est incrémenté pour que je puisse indexer dans le tableau des nouvelles réputations nécessaires. Modifier: enregistré 21 octets en mettant à l'échelle le tableau d'entrée et de sortie.

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

Certaines réponses ne fonctionnent pas avec le testcase Nouvel utilisateur. Si le vôtre ne fonctionne pas, veuillez le réparer.
wizzwizz4

@ wizzwizz4 Ah, le changement de privilège meta? Bien sûr, c'est une solution simple.
Neil

Pensez-vous que vous pourriez ajouter une explication et une ventilation du code?
wizzwizz4

2

Python, 88 octets

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)

Pour chaque nouveau privilège bêta dépassé, ajoute le montant de répétition nécessaire pour accéder au prochain privilège gradué. Ensuite, le représentant supplémentaire nécessaire est le nouveau représentant moins le représentant actuel, mais pas moins de 0.

Les deux listes de limites de rep sont raccourcies par rep en multiples de 500.


Vous pourriez aussi bien remplacer [3]*2+[4]par [3,3,4]9 contre 8 octets.
CalculatorFeline

@CatsAreFluffy Merci, j'ai oublié que je les ai changés des décimales là où ça vaut le coup.
xnor

2

Python 156 152 octets

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 chaîne de données ( 5e3 5r4e3 5r3500 30./7r2e3 5r1500 10./3r500 6r1 1) est une liste dont le format (old_rep1) (new_rep1/old_rep1)r(old_repr) (new_rep2/old_rep2)n'inclut que les privilèges qui définissent le nouveau max rep (les utilisateurs avec> 750 rep ont toujours besoin d'au moins 3k rep post-graduation, même s'ils seront un utilisateur établi à 1k. La liste est trié du plus haut représentant en premier au plus bas en dernier.


Pensez-vous que vous pourriez ajouter une explication et une ventilation du code?
wizzwizz4 du

@ wizzwizz4 Terminé.
pppery

Hmm ... maintenant c'est une technique intelligente.
wizzwizz4

1

Pyth - 71 70 69 77 75 77 octets

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

Suite de tests .


Cela ne fonctionne pas pour le wizzwizz4testcase.
wizzwizz4

1
Certaines réponses ne fonctionnent pas avec le testcase Nouvel utilisateur. J'ai remarqué que le vôtre ne le fait pas; regle-le, s'il te plait!
wizzwizz4

Pensez-vous que vous pourriez ajouter une explication et une ventilation du code?
wizzwizz4

1

LiveCode 8, 318 octets

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

Comme wizzwizz4suggéré, voici une explication:

function g c 

Créez une fonction nommée gprenant un seul paramètre c. cest la réputation actuelle de l'utilisateur. Équivalent à def g(c)en Python.

local b,g,r

Créez trois variables locales: b, get r. bseront les seuils de réputation pour les privilèges en version bêta, gcontiendront les nouveaux seuils de réputation après l'obtention du diplôme et rreprésenteront la réputation totale que l'utilisateur devra avoir après l'obtention du diplôme pour conserver ses privilèges.

put c into r

Cela copie la valeur de c(la réputation actuelle de l'utilisateur) dans r. Équivalent à r=cen Python)

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

Semblable à ci-dessus, cela définit b à une chaîne contenant une liste, délimitée par des virgules, des seuils de réputation en version bêta, divisée par 1000. Équivalent à b="0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5"en Python.

split b by ","

Cela divise la variable locale ben un tableau, en utilisant ,comme délimiteur. Ce tableau contient désormais les seuils de réputation en version bêta, divisés par 1000. Équivalent à 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 ","

Comme ci-dessus, sauf qu'il gcontient désormais une liste des seuils de réputation après l'obtention du diplôme, divisée par 5000

repeat with i=1 to 11

Semblable à une forboucle dans d'autres langues, cela se répète 11 fois, avec ila valeur suivante attribuée dans la séquence 1 à 11 à chaque fois. Les tableaux dans LiveCode commencent à l'index 1. En Python, ce serait 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

C'est la logique principale de la fonction. Il vérifie si l'utilisateur a suffisamment de réputation pour le privilège en position ide la liste bêta, si c'est le cas, et s'il n'a pas assez de réputation pour le privilège après l'obtention du diplôme, il définit la variable r(représentant la réputation totale que l'utilisateur a devront conserver leurs privilèges après l'obtention du diplôme) jusqu'à la limite de réputation après l'obtention du diplôme pour ce privilège (uniquement si la nouvelle réputation est supérieure à la précédente). Le code Python équivalent serait if c>b[i]*1000 and not c>g[i]*5000: r=max(g[i]*5000,r) end repeat. Termine la boucle de répétition. Similaire à C ou Java }. LiveCode utilise la syntaxe end 'insert contruct namepour terminer une repeatboucle, un if, un switchetc ...

return r-c

Assez explicite.

end g

Met fin à la fonction g.


Un tout nouvel utilisateur publie une réponse à mon défi? Je suis honoré. +1 et bienvenue sur le site.
wizzwizz4

Vous pouvez améliorer ce message en ajoutant une explication et une ventilation du code. (Expliquez ce que fait le code, ligne par ligne, sous votre code.)
wizzwizz4

@ wizzwizz4 Ajout d'une explication.
penalosa
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.