Pomóż przeliczyć swojego przedstawiciela!

12

Kilka miesięcy temu rozmawialiśmy o meta na temat zwiększania reputacji przyznawanej za głosowanie nad pytaniami. Oto podstawy naszego obecnego systemu reputacji głosów: 1

  • Pytanie głosujące Ujest warte 5 punktów reputacji.
  • Odpowiedź głosowania ujest warta 10 reputacji.
  • Odpowiedź na pytanie lub odpowiedź djest warta -2 reputacji.

Pojawiło się wiele różnych sugestii dotyczących nowego systemu, ale obecnie najpopularniejszy jest identyczny z powyższym, ale z pytaniami pozytywnymi skalowanymi do +10 powtórzeń. Wyzwanie polega na obliczeniu, o ile więcej powtórzeń zarobiłbyś, gdyby ten system został wdrożony.

Spójrzmy na przykład. Gdyby głosowanie było UUUUuuuuUUUUUduuudUU, wówczas w obecnym systemie zarobiłbyś 121:

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

Ale ta sama działalność zarobiłaby 176 w nowym systemie:

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

Zyskałbyś 55 powtórzeń z tego scenariusza.

Jak dotąd obliczenie zmienionego powtórzenia nie jest trudne; wystarczy policzyć liczbę Usi pomnożyć przez 5. Na szczęście system powtórzeń nie jest taki prosty: istnieje również limit powtórzeń , który jest największą reputacją, jaką można zdobyć dzięki głosom w jeden dzień UTC. Jest to ustawione na 200 we wszystkich witrynach.

Ograniczenie liczby powtórzeń obowiązuje również w czasie rzeczywistym: jeśli zdobyłeś już 196 powtórzeń i otrzymałeś odpowiedź pozytywną, będziesz mieć 200 powtórzeń. Jeśli zaraz potem otrzymasz głos negatywny, 2 powtórzenia zostaną odjęte od 200, więc będziesz mieć 198 powtórzeń.

W wyniku głosowania UUUuuuuUUUUuuuuUUUUUUUdw obecnym systemie zarobiłbyś 148 powtórzeń:

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

Ale zarobiłbyś 198 w nowym systemie:

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

Zatem wzrost wynosi 50 powtórzeń .

Wyzwanie

Wyzwanie polega na napisaniu programu lub funkcji, która pobierze ciąg wielu wierszy i wyświetli całkowitą liczbę powtórzeń uzyskaną przy użyciu powyższego algorytmu. Każda linia liczy się jako 1 dzień UTC, więc ograniczenie liczby powtórzeń obowiązuje tylko raz na linię.

Przypadki testowe

(Jeden lub więcej wierszy wejścia, po których następuje liczba całkowita wyjściowa.)

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

To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach.

Wyzwania pokrewne: Oblicz ograniczoną sumę wektora , Oblicz reputację wymiany stosów

1 To jest bardzo uproszczona wersja systemu. Utracasz również 1 powtórzenie za zanotowanie odpowiedzi na głos, i istnieją niepotwierdzone głosy, które są dziwne i przestrzegają własnych zasad ; i niezapisane głosy, które nawet nie mają zasad do przestrzegania .

ETHprodukcje
źródło
1
Niezłe wyzwanie. Szkoda, że raczej się nie wydarzy ...
AdmBorkBork
2
¹ Nie tracisz przedstawiciela za pytania dotyczące głosowania; tylko odpowiedzi. Zaufaj mi: P
Geobits,
@Mego Możliwe, ale widzę następujące różnice: A) Pełna skumulowana tablica nie jest potrzebna, tylko ostatni termin. B) Nie ma dolnej granicy, a górna granica jest stała. C) Dane wejściowe to ciąg znaków, w przeciwieństwie do tablicy liczb. D) Arbitralne ilości tych ciągów, oddzielone znakami nowej linii, muszą zostać przejrzane osobno i zsumowane, aby uzyskać wynik.
ETHproductions
1
@ETHproductions Wszystkie z wyjątkiem B są różnicami we / wy. Główny problem jest nadal taki sam.
Mego

Odpowiedzi:

0

Perl, 104 91 + 2 = 93 bajty

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

Wymaga -pflagi:

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

Awaria:

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
źródło
2

ES6, 104 bajty

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

Oblicza przed i po powtórzeniu dla każdej linii. Moje pierwsze użycie eval!

Neil
źródło
2

Haskell, 98 93 bajtów

Dzięki BlackCap możesz dalej grać w golfa. Teraz myślę, że spróbuję lambda w późniejszych wyzwaniach.

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

Pierwsze 3 linie to punktacja, a & b to wynik, f to różnica, a g to funkcja określająca specyfikację.

Stosowanie:

g"UUUuuuuuUUUuuUUUUUUuuuUUUuuUUUUuuuuUUUdddddddUU" -- 4
Akangka
źródło
Możesz scalić dwie ostatnie linie i zarobić 1 bajt: g = sum.map (\ x -> (10 i x) - (5 i x)). Linie Możesz także usunąć nawiasy dla kolejnych czterech bajtów: g = sum.map (\ x-> 10 i x-5 i x) .lines
BlackCap
I jeszcze 3 bajty, jeśli scalisz mapę i fold: a & b = foldl (\ d g-> min 200 $ d + a # g) 0b
BlackCap
1

Lua, 196 bajtów

Ten program pobiera jako argument pojedynczy argument zawierający wiele wierszy i wypisuje całkowitą różnicę w 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)

Zakładam, że wolno mi prosić o końcowy nowy wiersz na wejściu, jeśli nie, oto rozwiązanie 204 bajtów, które go nie potrzebuje.

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)

Bez golfa i wyjaśnienia

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
źródło