Aiuta a ricalcolare il tuo rappresentante!


12

Un paio di mesi fa, abbiamo discusso di meta sull'aumento della reputazione assegnata per i voti positivi sulle domande. Ecco le basi del nostro attuale sistema di reputazione per i voti: 1

  • Un voto positivo Uvale 5 punti reputazione.
  • Un voto di risposta uvale 10 reputazione.
  • Un downvote di domande o risposte dvale -2 reputazione.

Ci sono stati molti suggerimenti diversi per un nuovo sistema, ma l'attuale più popolare è identico a quanto sopra, ma con i voti delle domande ridimensionati a +10 rappresentanti. Questa sfida riguarda il calcolo di quanti più rappresentanti guadagneresti se questo sistema venisse messo in atto.

Diamo un'occhiata a un esempio. Se l'attività di voto fosse UUUUuuuuUUUUUduuudUU, allora guadagneresti 121 con il sistema attuale:

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

Ma la stessa attività guadagnerebbe 176 con il nuovo 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

Guadagneresti 55 rappresentanti da questo scenario.

Finora, calcolare il rappresentante cambiato non è poi così difficile; basta contare il numero di se Umoltiplicare per 5. Fortunatamente, il sistema di ripetizione non è così semplice: esiste anche un limite di ripetizione , che è la più reputazione che puoi guadagnare dai voti in un giorno UTC. Questo è impostato su 200 su tutti i siti.

Inoltre, il limite di ripetizione si applica in tempo reale: se hai già guadagnato 196 rep e ricevi un voto di risposta, ora avrai 200 rep. Se ricevi un downvote subito dopo, il 2 rep sarà sottratto da 200, quindi avrai 198 rep.

Con l'attività di voto UUUuuuuUUUUuuuuUUUUUUUd, guadagneresti 148 rappresentanti nel sistema attuale:

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

Ma guadagneresti 198 con il nuovo 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

Pertanto, l'aumento è di 50 rep .

Sfida

La tua sfida è scrivere un programma o una funzione che includa una stringa multi-linea e produca il rep totale che verrebbe acquisito con l'algoritmo sopra. Ogni riga vale come 1 giorno UTC, quindi il limite di ripetizione si applica una sola volta per riga.

Casi test

(Una o più righe di input, seguite dal numero intero di output.)

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

Questo è il codice golf, quindi vince il codice più breve in byte.

Sfide correlate: calcola la somma cumulativa limitata di un vettore , calcola la tua reputazione di scambio di stack

1 Questa è una versione altamente semplificata del sistema. Si perde anche 1 rappresentante per il voto negativo di una risposta, e esistono non votati, che sono strani e seguono regole proprie ; e undownvotes, che non hanno nemmeno regole da seguire .


1
Bella sfida. Peccato che non accadrà probabilmente ...
AdmBorkBork,

2
¹ Non perdi rappresentante per le domande di voto negativo; risponde solo. Fidati di me: P
Geobits

@Mego Possible, ma vedo le seguenti differenze: A) Non è necessario l'array cumulativo completo, solo l'ultimo termine. B) Non c'è limite inferiore e il limite superiore è fisso. C) L'input è una stringa, al contrario di una matrice di numeri. D) Gli importi arbitrari di queste stringhe, separati da nuove righe, devono essere esaminati separatamente e sommati per ottenere il risultato.
ETHproductions

1
@ETHproductions Tutte quelle tranne B sono differenze di I / O. Il problema principale è sempre lo stesso.
Mego

Risposte:


0

Perl, 104 91 + 2 = 93 byte

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

Richiede la -pbandiera:

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

Abbattersi:

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 byte

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

Calcola il rep prima e dopo per ogni riga. Il mio primo utilizzo di eval!


2

Haskell, 98 93 byte

Grazie a BlackCap per continuare a giocare a golf. Ora, penso di provare lambda nelle sfide successive, ora.

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

Le prime 3 righe sono il punteggio, a & b è il punteggio, f è la differenza e g è la funzione che sastifica la specifica.

Uso:

g"UUUuuuuuUUUuuUUUUUUuuuUUUuuUUUUuuuuUUUdddddddUU" -- 4

Puoi unire le ultime due righe e guadagnare 1 byte: g = sum.map (\ x -> (10 & x) - (5 & x)). Righe Puoi anche rimuovere le parentesi per altri quattro byte: g = sum.map (\ x-> 10 & x-5 & x) .lines
BlackCap

E altri 3 byte se unisci la mappa e il fold: a & b = foldl (\ d g-> min 200 $ d + a # g) 0b
BlackCap

1

Lua, 196 byte

Questo programma accetta come input un singolo argomento a più righe e stampa la differenza totale in 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)

Supponevo di poter chiedere una nuova riga finale nell'input, in caso contrario, ecco una soluzione di 204 byte che non ne ha bisogno.

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 spiegazioni

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.