Helfen Sie, Ihren Repräsentanten neu zu berechnen!

12

Vor ein paar Monaten hatten wir eine Diskussion über Meta, um die Reputation von Upvotes bei Fragen zu erhöhen. Hier sind die Grundlagen unseres aktuellen Reputationssystems für Abstimmungen: 1

  • Eine Frage, die positiv bewertet wurde, Uist 5 Ruf wert.
  • Eine Antwortaufwertung uist 10 Ruf wert.
  • Eine Frage oder Antwort, die falsch bewertet wurde, dhat einen Wert von -2.

Es gab viele verschiedene Vorschläge für ein neues System, aber das derzeit beliebteste ist identisch mit dem obigen, jedoch mit auf +10 Wiederholungen skalierten Fragen-Upvotes. Bei dieser Herausforderung geht es darum zu berechnen, wie viel mehr Wiederholungen Sie verdienen würden, wenn dieses System eingerichtet würde.

Schauen wir uns ein Beispiel an. Wenn die Abstimmungsaktivität UUUUuuuuUUUUUduuudUUwäre, würden Sie im aktuellen System 121 verdienen:

U x 4 x  5 =  20 =  20
u x 4 x 10 =  40 =  60
U x 5 x  5 =  25 =  85
d x 1 x -2 =  -2 =  83
u x 3 x 10 =  30 = 113
d x 1 x -2 =  -2 = 111
U x 2 x  5 =  10 = 121
Total:             121

Aber die gleiche Aktivität würde mit dem neuen System 176 verdienen:

U x 4 x 10 =  40 =  40
u x 4 x 10 =  40 =  80
U x 5 x 10 =  50 = 130
d x 1 x -2 =  -2 = 128
u x 3 x 10 =  30 = 158
d x 1 x -2 =  -2 = 156
U x 2 x 10 =  20 = 176
Total:             176

Sie würden 55 Wiederholungen aus diesem Szenario gewinnen.

Bisher ist es nicht so schwierig, die geänderte Wiederholung zu berechnen. Zählen Sie einfach die Anzahl der Us und multiplizieren Sie sie mit 5. Glücklicherweise ist das Repräsentantensystem nicht so einfach: Es gibt auch eine Repräsentantengrenze , die den höchsten Ruf darstellt, den Sie an einem UTC-Tag mit Stimmen verdienen können. Dies ist auf allen Sites auf 200 festgelegt.

Die Obergrenze für Wiederholungen gilt auch in Echtzeit: Wenn Sie bereits 196 Wiederholungen verdient haben und eine positive Antwort erhalten, haben Sie jetzt 200 Wiederholungen. Wenn Sie direkt danach eine Abwertung erhalten, werden die 2 Wiederholungen von 200 subtrahiert, so dass Sie 198 Wiederholungen haben.

Mit der Abstimmungsaktivität UUUuuuuUUUUuuuuUUUUUUUdwürden Sie 148 Wiederholungen nach dem aktuellen System verdienen:

U x 3 x  5 =  15 =  15
u x 4 x 10 =  40 =  55
U x 4 x  5 =  20 =  75
u x 4 x 10 =  40 = 115
U x 7 x  5 =  35 = 150
d x 1 x -2 =  -2 = 148
Total:             148

Aber Sie würden mit dem neuen System 198 verdienen:

U x 3 x 10 =  30 =  30
u x 4 x 10 =  40 =  70
U x 4 x 10 =  40 = 110
u x 4 x 10 =  40 = 150
U x 7 x 10 =  70 = 200 (rep capped)
d x 1 x -2 =  -2 = 198
Total:             198

Somit beträgt die Erhöhung 50 Wiederholungen .

Herausforderung

Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben, die eine mehrzeilige Zeichenfolge enthält und die Gesamtwiederholung ausgibt, die mit dem obigen Algorithmus erzielt werden würde. Jede Zeile zählt als 1 UTC-Tag, daher gilt die Wiederholungsobergrenze nur einmal pro Zeile.

Testfälle

(Eine oder mehrere Eingabezeilen, gefolgt von der Ausgabe-Ganzzahl.)

UUUuudd
15

UUUuUUUUuUuuUUUUudUUUUuU
57

UUUuUUUUuUuuUUUUudUUUUuU
UUUuudd
72

uuuuuuu
uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
uuuuuuuuuuuuuuuuuuuu
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
0

UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
5

(empty string)
0

UUUuuuuuUUUuuUUUUUUuuuUUUuuUUUUuuuuUUUdddddddUU
4

UUUuuuuuUUUuuUUUUUUuuuUUUuuUUUUuuuuUUUdddddddUU
UuuUUUudUU
UUUUUUUUUuuuuuuUUUUUUuuUUUUUUuuuuuUUUUUUUUuUUUuuuuUUUUuuuUUUuuuuuuUUUUUUUUuuUUUuuUU
UUu
U
d
UU
UUUUUUUUUUUU
119

Dies ist Code Golf, also gewinnt der kürzeste Code in Bytes.

Verwandte Herausforderungen: Berechnen Sie die begrenzte kumulative Summe eines Vektors . Berechnen Sie Ihre Stapelaustausch-Reputation

1 Dies ist eine stark vereinfachte Version des Systems. Sie verlieren auch 1 Wiederholung für das Abwerten einer Antwort, und es gibt nicht zustimmende Stimmen, die seltsam sind und eigenen Regeln folgen . und Undownvotes, denen nicht einmal Regeln folgen müssen .

ETHproductions
quelle
1
Schöne Herausforderung. Schade, dass es nicht passieren wird ...
AdmBorkBork
2
¹ Sie verlieren keinen Repräsentanten für Abstimmungsfragen. Antworten einfach. Vertrau mir: P
Geobits
@Mego Möglich, aber ich sehe die folgenden Unterschiede: A) Das gesamte kumulative Array wird nicht benötigt, nur der letzte Ausdruck. B) Es gibt keine Untergrenze und die Obergrenze ist festgelegt. C) Die Eingabe ist eine Zeichenfolge im Gegensatz zu einem Array von Zahlen. D) Beliebige Mengen dieser Zeichenfolgen, die durch Zeilenumbrüche voneinander getrennt sind, müssen einzeln durchlaufen und summiert werden, um das Ergebnis zu erhalten.
ETHproductions
1
@ETHproductions Alle außer B sind E / A-Unterschiede. Das Kernproblem ist immer noch das gleiche.
Mego

Antworten:

0

Perl, 104 91 + 2 = 93 Bytes

sub f{200*$.>$_[0]?$_[0]:200*$.}for(/./g){$a=/d/?-2:10;$s=f$s+$a;$o=f$o+$a-5*/U/}}{$_=$s-$o

Benötigt die -pFlagge:

$ echo UUUuUUUUuUuuUUUUudUUUUuU | perl -p recalc.pl
57
$ echo "UUUuUUUUuUuuUUUUudUUUUuU
UUUuudd" | perl -p recalc.pl
72

Nervenzusammenbruch:

sub f {
  # '$.' contains the line number (1, 2, ... n)
  200*$. > $_[0] ? $_[0] : 200*$.
}
for(/./g){
  $a= /d/ ? -2  : 10;
  $s=f( $s + $a );
  # /U/ returns `1` if true
  $o=f( $o + $a - 5*/U/ )
}
}{ # Eskimo exit while loop (do this after the outer (from -p) iteration)
$_=$s-$o
undlrc
quelle
2

ES6, 104 Bytes

s=>s.split`
`.map(l=>(g=U=>[...l].map(c=>(r+=eval(c))>200?r=200:0,r=0)|r,t+=g(10)-g(5)),u=10,d=-2,t=0)|t

Berechnet die Vorher-Nachher-Wiederholung für jede Zeile. Mein erster Gebrauch von eval!

Neil
quelle
2

Haskell, 98 93 Bytes

Danke an BlackCap, um dieses weiter zu golfen. Jetzt denke ich, Lambda in späteren Herausforderungen jetzt zu versuchen.

x#'U'=x
_#'u'=10
_#'d'=(-2)
a&b=foldl1(\d g->min 200$d+a#g)
g=sum.map(\x->(10&x)-(5&x)).lines

Die ersten 3 Zeilen sind die Wertung, a & b ist die Wertung, f ist die Differenz und g ist die Funktion, die die Spezifikation verfälscht.

Verwendung:

g"UUUuuuuuUUUuuUUUUUUuuuUUUuuUUUUuuuuUUUdddddddUU" -- 4
Akangka
quelle
Sie können die beiden letzten Zeilen zusammenführen und 1 Byte verdienen: g = sum.map (\ x -> (10 & x) - (5 & x)). Sie können auch die Klammern für weitere vier Bytes entfernen: g = sum.map (\ x-> 10 & x-5 & x) .lines
BlackCap
Und 3 weitere Bytes, wenn Sie die Karte und die Falte zusammenführen: a & b = Falte (\ d g-> min 200 $ d + a # g) 0b
BlackCap
1

Lua, 196 Bytes

Dieses Programm verwendet ein einziges mehrzeiliges Argument als Eingabe und gibt die Gesamtdifferenz in rep 'aus.

e,f,a=0,0,{u=10,U=10,d=-2}arg[1]:gsub(".-\n",function(s)x=0 y=0 s:gsub("[^\n]",function(c)t=x+a[c]x,t=t>199 and 200 or t,y+a[c]-(c<"V"and 5 or 0)y=t>199 and 200 or t end)e=e+x f=f+y end)print(e-f)

Ich bin davon ausgegangen, dass ich in der Eingabe nach einer nachgestellten neuen Zeile fragen darf. Andernfalls ist hier eine 204-Byte-Lösung, die diese nicht benötigt.

e,f,a=0,0,{u=10,U=10,d=-2}(arg[1].."\n"):gsub(".-\n",function(s)x=0 y=0 s:gsub("[^\n]",function(c)t=x+a[c]x,t=t>199 and 200 or t,y+a[c]-(c<"V"and 5 or 0)y=t>199 and 200 or t end)e=e+x f=f+y end)print(e-f)

Ungolfed und Erklärungen

a={u=10,U=10,d=-2}            -- define the table containing the vote values
e,f=0,0                       -- initialize the total sums of rep'

arg[1]:gsub(".-\n",function(s)-- iterate over each line
  x=0                         -- score by the new scoring method for this UTC day
  y=0                         -- score by the old method
  s:gsub("[^\n]",function(c)  -- iterate over each non new-line character
    t=x+a[c]                  -- new score for today
    x=t>199 and 200 or t      -- reduce it to 200 if >=200
                        -- Do the same thing with the old scoring method
    t=y+a[c]-(c<"V"and 5 or 0)-- if c=="U", this question vote gives only 5
    y=t>199 and 200 or t      
  end)
  e=e+x f=f+y                 -- sum the scores over multiple days
end)
print(e-f)                    -- output the difference
Katenkyo
quelle