Wie viel mehr Ansehen brauche ich?

23

Programmierung von Rätseln und Code Golf hat die Beta abgeschlossen. Bald werden wir ein benutzerdefiniertes Site-Design erhalten, und damit werden die Reputationsgrenzen für Privilegien steigen. Viele Benutzer verlieren Berechtigungen auf der Site. Ihre Aufgabe ist es also, ein Programm zu schreiben, das uns sagt, wie viel zusätzlichen Ruf wir benötigen, um unsere Privilegien zu behalten.

Aufgabe

Ihre Aufgabe ist es, den kürzesten Code zu schreiben, um zu ermitteln, wie viel zusätzliche Reputation ein Benutzer benötigt, um seine aktuellen Privilegien nach dem Site-Design zu behalten, wenn die Anzahl der Reputationspunkte gegeben ist.

Input-Output

Sie können Eingaben und Ausgaben nach Belieben annehmen, sofern die folgenden Regeln eingehalten werden:

Eingabe - Eine Ganzzahl von 1 bis einschließlich 250000+ . Ihr Programm oder Ihre Funktion sollte in der Lage sein, größere Zahlen zu akzeptieren, aber es muss Zahlen in diesem Bereich akzeptieren.

Ausgabe - Eine Ganzzahl, die die Anzahl der Reputationspunkte angibt, die der Benutzer erhalten muss, um seine aktuellen Berechtigungen nach dem Abschluss beizubehalten.

Bitte keine Standardlücken .

Beispielalgorithmus

  1. Variable iauf den Eingang setzen
  2. Variable rauf Variable setzen i.
  3. While rist nicht in der Liste beta:
    1. Subtrahieren 1von r.
  4. Stellen Sie nauf die Position rin beta.
  5. Auf rArtikel nvon setzen graduated.
  6. Setze Variable oauf das Ergebnis von r - i.
  7. Wenn o < 0:
    1. Variable setzen oauf 0.
  8. Ausgabevariable o.

Tabellen

Tabelle der Berechtigungen, die geändert werden

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

Tabelle der Berechtigungen, die sich nicht ändern

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

Testfälle

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

Zum Zeitpunkt des Schreibens sind nicht alle Reputationszählungen korrekt.
Wenn Sie möchten, dass Ihre vergangene oder gegenwärtige Reputation hier gezählt wird, kommentieren Sie sie einfach unten und ich werde sie möglicherweise hinzufügen.

wizzwizz4
quelle
2
Sie sollten einige Testfälle einschließen.
Dennis
3
Übrigens: Die Teilnahme an der Meta- Rep-Schwelle von 5 gilt auch für Beta-Sites. PPCG hat es so angepasst, dass neue Benutzer die Sandbox verwenden können. Dies sollte sich nicht ändern, wenn wir unseren Abschluss machen.
Dennis
1
@cat Ich habe das tatsächlich benutzt. Vielen Dank!
Wizzwizz4
2
@ wizzwizz4 Danke dafür; Mein Kopf beginnt zu explodieren und ich wollte nur noch 250 Wiederholungen.
Katze
1
@ wizzwizz4 Nee, es würde nur neben Dennis niedrig aussehen :-)
xnor

Antworten:

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
quelle
Ich denke, Sie geben die neue Wiederholung, die Sie brauchen, nicht die Steigerung. So f(750)sollte es 1250nicht sein 2000. Sollte eine einfache Lösung sein.
xnor
@ Xnor Nun, f(750)sollte sein 2250, nicht 1250:)
Orlp
Muss noch f(72950)geben müssen 0.
xnor
Dein evalTrick ist wirklich gut. Die Kombination gibt es mit meiner Liste Kompression 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
Glauben Sie, Sie könnten eine Code-Erklärung und eine Aufschlüsselung hinzufügen?
Wizzwizz4
4

Jelly , 40 37 Bytes

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

Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

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

Probieren Sie es online! oder überprüfen Sie alle Testfälle . 1

Wie es funktioniert

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 Beachten Sie, dass der Code ein Null-Byte enthält, was in einigen Browsern zu Problemen führt.

Dennis
quelle
3

JavaScript (ES6), 137 135 102 81 Byte

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

Wenn der Benutzer über 5000 oder mehr Reputationen verfügt, findIndexschlägt die Rückgabe von -1 fehl, sodass das Ergebnis so hoch ist, dass ich in das Array der benötigten neuen Reputationen indexieren kann. Bearbeiten: 21 Byte durch Skalieren des Eingabe- und Ausgabearrays gespeichert.

   [.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
quelle
Einige Antworten funktionieren mit dem Testfall "Neuer Benutzer" nicht. Wenn deins nicht funktioniert, beheben Sie es bitte.
wizzwizz4
@ wizzwizz4 Ah, die Änderung des Meta-Privilegs? Klar, das ist eine einfache Lösung.
Neil
Glauben Sie, Sie könnten eine Code-Erklärung und eine Aufschlüsselung hinzufügen?
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)

Fügt für jede neue Beta-Berechtigung, die überschritten wird, den Wiederholungsbetrag hinzu, der erforderlich ist, um die nächste abgestufte Berechtigung zu erhalten. Dann ist die zusätzlich benötigte Wiederholung die neue Wiederholung abzüglich der aktuellen Wiederholung, jedoch nicht weniger als 0.

Beide Wiederholungsgrenzenlisten werden durch Wiederholungen in Vielfachen von gekürzt 500.

xnor
quelle
Genauso gut könnte man ersetzen [3]*2+[4]mit [3,3,4], 9 vs 8 Byte.
CalculatorFeline
@CatsAreFluffy Danke, ich habe vergessen, dass ich sie von Dezimalstellen geändert habe, wo es sich lohnt.
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

Die Datenzeichenfolge ( 5e3 5r4e3 5r3500 30./7r2e3 5r1500 10./3r500 6r1 1) ist eine Liste, deren Format (old_rep1) (new_rep1/old_rep1)r(old_repr) (new_rep2/old_rep2)nur Berechtigungen enthält, mit denen die neue maximale Anzahl der Wiederholungen festgelegt wird (Benutzer mit mehr als 750 Wiederholungen benötigen nach dem Abschluss immer noch mindestens 3 KB Wiederholungen, obwohl sie bereits ein fester Benutzer bei 1 KB sind. Die Liste enthält Folgendes: sortiert von der höchsten bis zur niedrigsten Wiederholung.

Pfeffer
quelle
Glauben Sie, Sie könnten eine Code-Erklärung und eine Aufschlüsselung hinzufügen?
wizzwizz4
@ wizzwizz4 Fertig.
Paprika
Hmm ... das ist eine clevere Technik.
Wizzwizz4
1

Pyth - 71 70 69 77 75 77 Bytes

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

Test Suite .

Maltysen
quelle
Dies funktioniert nicht für den wizzwizz4Testfall.
wizzwizz4
1
Einige Antworten funktionieren mit dem Testfall "Neuer Benutzer" nicht. Ich habe bemerkt, dass deins nicht tut; Bitte repariere es!
wizzwizz4
Glauben Sie, Sie könnten eine Code-Erklärung und eine Aufschlüsselung hinzufügen?
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

Wie wizzwizz4vorgeschlagen, hier eine Erklärung:

function g c 

Erstellen Sie eine Funktion mit dem Namen, gdie einen einzelnen Parameter verwendet c. cist der aktuelle Ruf des Benutzers. Entspricht def g(c)in Python.

local b,g,r

Erstellen Sie drei lokale Variablen: b, g, und r. bwird die Reputationsgrenze für Privilegien in der Beta sein, gwird die neuen Reputationsgrenzen nach dem Abschluss enthalten und rwird die gesamte Reputation darstellen, die der Benutzer nach dem Abschluss haben muss, um seine Privilegien zu behalten.

put c into r

Dies kopiert den Wert von c(den aktuellen Ruf des Benutzers) in r. Entspricht r=cin Python)

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

Ähnlich wie oben wird b auf einen String gesetzt, der eine durch Kommas getrennte Liste der Reputationsgrenzwerte in Beta enthält, geteilt durch 1000. Entspricht b="0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5"in Python.

split b by ","

Dadurch wird die lokale Variable bin ein Array aufgeteilt und ,als Begrenzer verwendet. Dieses Array enthält jetzt die Reputationsgrenzen in Beta, geteilt durch 1000. Entspricht b.split(",")in Python.

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

Das Gleiche wie oben, außer dass gjetzt eine Liste der Reputationsgrenzwerte nach Abschluss des Studiums, geteilt durch 5000, enthalten ist

repeat with i=1 to 11

Ähnlich wie bei einer forSchleife in anderen Sprachen wird dies elf Mal wiederholt, wobei ijedes Mal der nächste Wert in der Reihenfolge 1 bis 11 zugewiesen wird. Arrays in LiveCode beginnen bei Index 1. In Python wäre dies 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

Dies ist die Hauptlogik der Funktion. Es wird überprüft, ob der Benutzer an der Stelle der Betaliste über genügend Reputation für das Privileg iverfügt. Wenn dies der Fall ist und er nach dem Abschluss nicht über genügend Reputation für das Privileg verfügt, wird die Variable festgelegt r(die die gesamte Reputation des Benutzers darstellt) müssen ihre Privilegien nach dem Abschluss behalten), um die Reputation nach dem Abschluss für dieses Privileg zu kürzen (nur wenn die neue Reputation höher ist als die vorherige). Der entsprechende Python-Code wäreif c>b[i]*1000 and not c>g[i]*5000: r=max(g[i]*5000,r) end repeat Beendet die Wiederholungsschleife. Ähnlich wie C oder Java }. LiveCode verwendet die Syntax end 'insert contruct name, um eine repeatSchleife, ein if, ein switchusw. zu beenden.

return r-c

Ziemlich selbsterklärend.

end g

Beendet die Funktion g .

penalosa
quelle
Ein brandneuer Benutzer eine Antwort auf meine Herausforderung posten ? Ich fühle mich geehrt. +1 und willkommen auf der Seite.
wizzwizz4
Sie können diesen Beitrag verbessern, indem Sie eine Code-Erklärung und eine Aufschlüsselung hinzufügen. (Erklären Sie, was der Code Zeile für Zeile unter Ihrem Code
tut
@ wizzwizz4 Erklärung hinzugefügt.
Penalosa