¡Ayuda a recalcular tu representante!

12

Hace un par de meses, tuvimos una discusión sobre meta sobre aumentar la reputación otorgada por los votos a favor en las preguntas. Aquí están los conceptos básicos de nuestro sistema de reputación actual para los votos: 1

  • Una votación positiva Uvale 5 reputación.
  • Un voto de respuesta uvale 10 reputación.
  • Un downvote de preguntas o respuestas dvale -2 reputación.

Ha habido muchas sugerencias diferentes para un nuevo sistema, pero el actual más popular es idéntico al anterior, pero con los votos a favor de la pregunta escalados a +10 rep. Este desafío consiste en calcular la cantidad de repeticiones que ganaría si este sistema se implementara.

Veamos un ejemplo. Si la actividad de votación fuera UUUUuuuuUUUUUduuudUU, entonces ganaría 121 con el sistema actual:

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

Pero la misma actividad ganaría 176 con el nuevo sistema:

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

Ganarías 55 repeticiones de este escenario.

Hasta ahora, calcular el representante cambiado no es tan difícil; solo cuente el número de Usy multiplique por 5. Afortunadamente, el sistema de repeticiones no es tan simple: también hay un límite de repeticiones , que es la mayor reputación que puede obtener de los votos en un día UTC. Esto se establece en 200 en todos los sitios.

Además, el límite de repeticiones se aplica en tiempo real: si ya ha obtenido 196 repeticiones y recibe un voto de respuesta, ahora tendrá 200 repeticiones. Si obtiene un voto negativo justo después de eso, las 2 repeticiones se restarán de 200, por lo que tendrá 198 repeticiones.

Con la actividad de votación UUUuuuuUUUUuuuuUUUUUUUd, ganaría 148 repeticiones bajo el sistema actual:

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

Pero ganarías 198 con el nuevo sistema:

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

Por lo tanto, el aumento es de 50 rep .

Desafío

Su desafío es escribir un programa o función que tome una cadena de varias líneas y genere la repetición total que se obtendría con el algoritmo anterior. Cada línea cuenta como 1 día UTC, por lo que el límite de repeticiones solo se aplica una vez por línea.

Casos de prueba

(Una o más líneas de entrada, seguidas del número entero de salida).

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

Este es el código de golf, por lo que gana el código más corto en bytes.

Desafíos relacionados: calcule la suma acumulativa limitada de un vector , calcule su reputación de intercambio de pila

1 Esta es una versión altamente simplificada del sistema. También pierdes 1 repetición por rechazar una respuesta, y existen unupvotes, que son raros y siguen sus propias reglas ; y undownvotes, que ni siquiera tienen reglas a seguir .

ETHproductions
fuente
1
Buen desafío Lástima que no sea probable que suceda ...
AdmBorkBork
2
¹ No pierdes reputación por las preguntas de voto negativo; solo respuestas. Confía en mí: P
Geobits
@Mego Posible, pero veo las siguientes diferencias: A) No se necesita la matriz acumulativa completa, solo el último término. B) No hay límite inferior, y el límite superior es fijo. C) La entrada es una cadena, en oposición a una matriz de números. D) Las cantidades arbitrarias de estas cadenas, separadas por líneas nuevas, deben ejecutarse por separado y sumarse para obtener el resultado.
ETHproductions
1
@ETHproductions Todos aquellos excepto B son diferencias de E / S. El problema central sigue siendo el mismo.
Mego

Respuestas:

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

Requiere la -pbandera:

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

Descompostura:

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

Calcula el representante anterior y posterior para cada línea. Mi primer uso de eval!

Neil
fuente
2

Haskell, 98 93 bytes

Gracias a BlackCap por jugar golf más allá. Ahora, pienso probar lambda en desafíos posteriores, ahora.

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

Las primeras 3 líneas son la puntuación, a & b es la puntuación, f es la diferencia y g es la función que amplía la especificación.

Uso:

g"UUUuuuuuUUUuuUUUUUUuuuUUUuuUUUUuuuuUUUdddddddUU" -- 4
Akangka
fuente
Puede fusionar las dos últimas líneas y ganar 1 byte: g = sum.map (\ x -> (10 & x) - (5 & x)). Líneas También puede eliminar los paréntesis para otros cuatro bytes: g = sum.map (\ x-> 10 y x-5 y x) .lines
BlackCap
Y 3 bytes más si combina el mapa y el pliegue: a & b = foldl (\ d g-> min 200 $ d + a # g) 0b
BlackCap
1

Lua, 196 bytes

Este programa toma un solo argumento de varias líneas como entrada e imprime la diferencia total 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)

Supuse que se me permite solicitar una nueva línea final en la entrada, si no lo estoy, aquí hay una solución de 204 Bytes que no la necesita.

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)

Sin golfos y explicaciones

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
fuente