Ajude a recalcular seu representante!


12

Há alguns meses, tivemos uma discussão sobre meta sobre como aumentar a reputação concedida por upvotes em perguntas. Aqui estão os princípios básicos do nosso sistema de reputação atual para votos: 1

  • Uma pergunta votada Uvale 5 reputação.
  • Uma resposta upvote uvale 10 reputação.
  • Uma pergunta ou resposta com voto negativo dvale -2 de reputação.

Houve muitas sugestões diferentes para um novo sistema, mas o atual mais popular é idêntico ao acima, mas com upvotes de perguntas escalados para 10 repetições. Esse desafio consiste em calcular quanto mais você ganharia se esse sistema fosse implementado.

Vejamos um exemplo. Se a atividade de votação fosse UUUUuuuuUUUUUduuudUU, você ganha 121 no sistema atual:

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

Mas a mesma atividade ganharia 176 sob o novo 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

Você obteria 55 representantes neste cenário.

Até agora, calcular o representante alterado não é tão difícil; basta contar o número de se Umultiplicar por 5. Felizmente, o sistema de representantes não é tão simples: também existe um limite de representantes , que é a maior reputação que você pode ganhar com votos em um dia UTC. Isso está definido como 200 em todos os sites.

Além disso, o limite de representantes se aplica em tempo real: se você já ganhou 196 representantes e recebeu uma resposta positiva, agora terá 200 representantes. Se você receber um voto negativo logo após isso, os 2 representantes serão subtraídos de 200, então você terá 198 representantes.

Com a atividade de votação UUUuuuuUUUUuuuuUUUUUUUd, você ganharia 148 representantes no sistema atual:

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

Mas você ganharia 198 sob o novo 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

Assim, o aumento é de 50 repetições .

Desafio

Seu desafio é escrever um programa ou função que utilize uma sequência de linhas múltiplas e produza o representante total que seria ganho com o algoritmo acima. Cada linha conta como 1 dia UTC, portanto, o limite de representantes se aplica apenas uma vez por linha.

Casos de teste

(Uma ou mais linhas de entrada, seguidas pelo número inteiro de saída.)

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 é o código golf, pelo que o código mais curto em bytes vence.

Desafios relacionados: Calcule a soma acumulada limitada de um vetor , Calcule sua reputação de troca de pilhas

1 Esta é uma versão altamente simplificada do sistema. Você também perde 1 representante por votar com uma resposta negativa, e não existem votos positivos, que são estranhos e seguem regras próprias ; e votos não declarados, que nem sequer têm regras a seguir .


1
Bom desafio. Pena que não é provável que aconteça ...
AdmBorkBork 9/16

2
¹ Você não perde o representante por perguntas com voto negativo; apenas respostas. Confie em mim: P
Geobits

@Mego Possível, mas vejo as seguintes diferenças: A) A matriz cumulativa completa não é necessária, apenas o último termo. B) Não há limite inferior e o limite superior é fixo. C) A entrada é uma string, em oposição a uma matriz de números. D) Quantidades arbitrárias dessas seqüências, separadas por novas linhas, devem ser executadas separadamente e somadas para obter o resultado.
ETHproductions

1
@ETHproductions Todos, exceto B, são diferenças de E / S. O principal problema ainda é o mesmo.
Mego

Respostas:


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

Requer a -pbandeira:

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

Demolir:

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

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 o representante antes e depois de cada linha. Meu primeiro uso de eval!


2

Haskell, 98 93 bytes

Graças ao BlackCap, você ainda pode jogar golfe. Agora, penso em experimentar o lambda em desafios posteriores, agora.

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

As três primeiras linhas são a pontuação, a & b é a pontuação, f é a diferença eg é a função que simplifica a especificação.

Uso:

g"UUUuuuuuUUUuuUUUUUUuuuUUUuuUUUUuuuuUUUdddddddUU" -- 4

Você pode mesclar as duas últimas linhas e obter 1 byte: g = sum.map (\ x -> (10 & x) - (5 & x)). Lines Você também pode remover os parênteses por mais quatro bytes: g = sum.map (\ (x)> x-> 10 & x-5 & x) .lines
BlackCap

E mais 3 bytes se você mesclar o mapa ea dobra: a & b = foldl (\ d g-> min 200 $ d + uma # g) 0b
Cabeção

1

Lua, 196 bytes

Este programa usa um único argumento de várias linhas como entrada e imprime a diferença total em 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)

Eu assumi que tenho permissão para solicitar uma nova linha à direita na entrada, se não estiver, aqui está uma solução de 204 bytes que não precisa dela.

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 e explicações

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.