Aidez à recalculer votre représentant!

12

Il y a quelques mois, nous avons eu une discussion sur les méta concernant l'augmentation de la réputation accordée aux votes positifs sur les questions. Voici les bases de notre système de réputation actuel pour les votes: 1

  • Une note positive Uvaut 5 points de réputation.
  • Une réponse upvote uvaut 10 points de réputation.
  • Une question ou une réponse downvote dvaut -2 de réputation.

Il y a eu de nombreuses suggestions différentes pour un nouveau système, mais le plus populaire actuellement est identique à ce qui précède, mais avec des votes positifs de questions mis à l'échelle à +10 rep. Ce défi consiste à calculer combien plus de représentants vous gagneriez si ce système était mis en place.

Regardons un exemple. Si l'activité de vote était UUUUuuuuUUUUUduuudUU, alors vous gagneriez 121 selon le système actuel:

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

Mais la même activité gagnerait 176 dans le nouveau système:

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

Vous gagneriez 55 rep de ce scénario.

Jusqu'à présent, le calcul du représentant modifié n'est pas si difficile; il suffit de compter le nombre de Us et de multiplier par 5. Heureusement, le système de représentation n'est pas aussi simple: il y a aussi un plafond de représentation , qui est la plus grande réputation que vous pouvez gagner grâce aux votes en une journée UTC. Il est fixé à 200 sur tous les sites.

De plus, le plafond de rep s'applique en temps réel: si vous avez déjà gagné 196 rep et que vous recevez une réponse upvote, vous aurez désormais 200 rep. Si vous obtenez un downvote juste après cela, le 2 rep sera soustrait de 200, vous aurez donc 198 rep.

Avec l'activité de vote UUUuuuuUUUUuuuuUUUUUUUd, vous gagneriez 148 répétitions avec le système actuel:

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

Mais vous gagneriez 198 dans le nouveau système:

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

Ainsi, l'augmentation est de 50 rep .

Défi

Votre défi consiste à écrire un programme ou une fonction qui prend une chaîne multi-lignes et génère le nombre total de répétitions qui serait obtenu avec l'algorithme ci-dessus. Chaque ligne compte pour 1 jour UTC, le plafond de répétition ne s'applique donc qu'une seule fois par ligne.

Cas de test

(Une ou plusieurs lignes d'entrée, suivies de l'entier de sortie.)

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

C'est le golf de code, donc le code le plus court en octets gagne.

Défis connexes: Calculer la somme cumulée limitée d'un vecteur , Calculer votre réputation d'échange de pile

1 Il s'agit d'une version très simplifiée du système. Vous perdez également 1 représentant pour avoir voté contre une réponse, et il existe des non-votes, qui sont étranges et suivent leurs propres règles ; et les votes négatifs, qui n'ont même pas de règles à suivre .

ETHproductions
la source
1
Beau défi. Dommage que cela ne se produise probablement pas ...
AdmBorkBork
2
¹ Vous ne perdez pas de représentant pour les questions de vote en aval; juste des réponses. Faites-moi confiance: P
Geobits
@Mego Possible, mais je vois les différences suivantes: A) Le tableau cumulatif complet n'est pas nécessaire, juste le dernier terme. B) Il n'y a pas de borne inférieure et la borne supérieure est fixe. C) L'entrée est une chaîne, par opposition à un tableau de nombres. D) Des quantités arbitraires de ces chaînes, séparées par des sauts de ligne, doivent être chacune analysées séparément et additionnées pour obtenir le résultat.
ETHproductions
1
@ETHproductions Tous ceux sauf B sont des différences d'E / S. Le problème central est toujours le même.
Mego

Réponses:

0

Perl, 104 91 + 2 = 93 octets

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

Nécessite le -pdrapeau:

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

Panne:

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
andlrc
la source
2

ES6, 104 octets

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

Calcule le représentant avant et après pour chaque ligne. Ma première utilisation de eval!

Neil
la source
2

Haskell, 98 93 octets

Merci à BlackCap de continuer à jouer au golf. Maintenant, je pense que d'essayer lambda dans des défis ultérieurs, maintenant.

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

Les 3 premières lignes sont le score, a & b est le score, f est la différence et g est la fonction qui sastifie la spécification.

Usage:

g"UUUuuuuuUUUuuUUUUUUuuuUUUuuUUUUuuuuUUUdddddddUU" -- 4
Akangka
la source
Vous pouvez fusionner les deux dernières lignes et gagner 1 octet: g = sum.map (\ x -> (10 & x) - (5 & x)). Lines Vous pouvez également supprimer les parenthèses pour quatre octets supplémentaires: g = sum.map (\ x-> 10 & x-5 & x) .lines
BlackCap
Et 3 octets supplémentaires si vous fusionnez la carte et le pli: a & b = foldl (\ d g-> min 200 $ d + a # g) 0b
BlackCap
1

Lua, 196 octets

Ce programme prend un seul argument multi-lignes en entrée et affiche la différence totale en rep '

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)

J'ai supposé que j'étais autorisé à demander une nouvelle ligne de fin dans l'entrée, si ce n'est pas le cas, voici une solution de 204 octets qui n'en a pas besoin.

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)

Non golfé et explications

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