Temsilcinizi yeniden hesaplamanıza yardımcı olun!


12

Birkaç ay önce, sorulara ilişkin upvotes için verilen itibarı artırma konusunda meta hakkında bir tartışma yaptık. İşte oy için mevcut itibar sistemimizin temelleri: 1

  • Bir soru upvote U5 itibar değer.
  • Bir cevap upvote u10 itibar değer.
  • Bir soru veya cevap aşağı oy d-2 şöhrete değer.

Yeni bir sistem için birçok farklı öneri vardı, ancak en popüler olan yukarıdakilerle aynı, ancak soru upvotes +10 rep. Bu zorluk, bu sistem devreye sokulursa ne kadar daha fazla temsilci kazanacağınızı hesaplamakla ilgilidir.

Bir örneğe bakalım. Oylama etkinliği UUUUuuuuUUUUUduuudUUolsaydı, mevcut sistem altında 121 kazanırsınız:

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

Ancak aynı etkinlik yeni sistem altında 176 puan kazanacaktı:

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

Bu senaryodan 55 tekrar kazanacaksınız .

Şimdiye kadar, değişen temsilcisi hesaplamak o kadar da zor değil; sadece Us sayısını sayın ve 5 ile çarpın. Neyse ki, rep sistemi o kadar basit değil: aynı zamanda bir rep kapağı da var, bu da bir UTC gününde oylardan kazanabileceğiniz en ün. Bu, tüm sitelerde 200 olarak ayarlanmıştır.

Ayrıca, rep sınırı gerçek zamanlı olarak geçerlidir: Eğer 196 rep kazanmış ve bir cevap upvote alırsanız, şimdi 200 rep olacak. Bundan hemen sonra bir aşağı oy alırsanız, 2 temsilci 200'den çıkarılır, böylece 198 temsilciniz olur.

Oylama etkinliği ile UUUuuuuUUUUuuuuUUUUUUUdmevcut sistem altında 148 temsil kazanacaksınız:

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

Ancak yeni sistem altında 198 kazanacaksınız:

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

Böylece, artış 50 temsilidir .

Meydan okuma

Zorluğunuz, çok satırlı bir dize alan ve yukarıdaki algoritma ile kazanılacak toplam temsilcisi çıkaran bir program veya işlev yazmaktır. Her satır 1 UTC günü olarak sayılır, bu nedenle destek sınırı her satıra yalnızca bir kez uygulanır.

Test senaryoları

(Bir veya daha fazla giriş satırı, ardından çıkış tamsayısı.)

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

Bu kod golf, bayt en kısa kod kazanır.

İlgili güçlükler: Bir vektörün hesaplayın sınırlı birikimli toplamı , hesaplayın destenizin değişimi itibar

1 Bu, sistemin oldukça basitleştirilmiş bir sürümüdür. Ayrıca bir cevabı küçümsemek için 1 tekrar kaybedersiniz ve garip olan ve kendi kurallarına uyan unupvotes vardır ; ve izlenecek kurallara bile sahip olmayan oylar .


1
Güzel bir meydan okuma. Çok kötü olması muhtemel değil ...
AdmBorkBork

2
Down Aşağı oylama soruları için temsilcinizi kaybetmezsiniz; sadece cevaplar. Güven bana: P
Geobits

@Mego Mümkün, ancak aşağıdaki farkları görüyorum: A) Kümülatif dizinin tamamı gerekli değil, sadece son terim. B) Alt sınır yoktur ve üst sınır sabittir. C) Girdi, bir sayı dizisinin aksine bir dizedir. D) Bu dizelerin yeni satırlarla ayrılmış keyfi miktarlarının her biri ayrı ayrı yürütülmeli ve sonucu elde etmek için toplanmalıdır.
ETHproductions

1
@ETHproductions B dışındakiler G / Ç farklılıklarıdır. Temel sorun hala aynı.
Mego

Yanıtlar:


0

Perl, 104 91 + 2 = 93 bayt

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

-pBayrağı gerektirir :

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

Yıkmak:

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 bayt

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

Her satır için önceki ve sonraki temsilcisi hesaplar. İlk kullanımım eval!


2

Haskell, 98 93 bayt

Bu daha fazla golf için BlackCap sayesinde. Şimdi lambda'yı daha sonraki zorluklarda denemeyi düşünüyorum.

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

İlk 3 satır skorlama, a & b skor, f fark ve g spesifikasyonu silme fonksiyonudur.

Kullanımı:

g"UUUuuuuuUUUuuUUUUUUuuuUUUuuUUUUuuuuUUUdddddddUU" -- 4

Son iki satırı birleştirebilir ve 1 bayt kazanabilirsiniz: g = sum.map (\ x -> (10 & x) - (5 & x)) satırları Başka bir dört baytlık parantezleri de kaldırabilirsiniz: g = sum.map (\ x-> 10 & x-5 & x) .lines
BlackCap

Haritayı ve kapağı birleştirirseniz 3 bayt daha: a & b = foldl (\ d g-> min 200 $ d + a # g) 0b
BlackCap

1

Lua, 196 Bayt

Bu program girdi olarak tek bir çok satırlı argüman alır ve rep'deki toplam farkı yazdırır.

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)

Girişte yeni bir satır istememe izin verildiğini varsaydım, eğer değilsem, ihtiyaç duymayan 204 Byte'lık bir çözüm.

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 ve açıklamalar

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.