Giúp tính toán lại đại diện của bạn!


12

Một vài tháng trước, chúng tôi đã có một cuộc thảo luận về meta về việc tăng danh tiếng được trao cho những người ủng hộ cho các câu hỏi. Đây là những điều cơ bản của hệ thống danh tiếng hiện tại của chúng tôi để bình chọn: 1

  • Một câu hỏi upvote Ucó giá trị 5 danh tiếng.
  • Một câu trả lời upvote ucó giá trị 10 danh tiếng.
  • Một câu hỏi hoặc câu trả lời downvote dcó giá trị -2 danh tiếng.

Đã có nhiều đề xuất khác nhau cho một hệ thống mới, nhưng phổ biến nhất hiện nay là giống hệt như trên, nhưng với các câu hỏi nâng cấp tỷ lệ lên +10 rep. Thử thách này là về việc tính toán bạn sẽ kiếm được bao nhiêu đại diện nếu hệ thống này được đưa vào sử dụng.

Hãy xem xét một ví dụ. Nếu hoạt động bỏ phiếu là UUUUuuuuUUUUUduuudUU, thì bạn sẽ kiếm được 121 theo hệ thống hiện tại:

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

Nhưng cùng một hoạt động sẽ kiếm được 176 theo hệ thống mới:

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

Bạn sẽ đạt được 55 rep từ kịch bản này.

Cho đến nay, việc tính toán đại diện thay đổi không quá khó; chỉ cần đếm số Us và nhân với 5. May mắn thay, hệ thống đại diện không đơn giản: cũng có giới hạn đại diện , đó là danh tiếng nhất bạn có thể kiếm được từ phiếu bầu trong một ngày UTC. Điều này được đặt thành 200 trên tất cả các trang web.

Ngoài ra, giới hạn đại diện áp dụng trong thời gian thực: nếu bạn đã kiếm được 196 đại diện và bạn nhận được một câu trả lời, bạn sẽ có 200 đại diện. Nếu bạn nhận được một downvote ngay sau đó, 2 rep sẽ bị trừ từ 200, vì vậy bạn sẽ có 198 rep.

Với hoạt động bỏ phiếu UUUuuuuUUUUuuuuUUUUUUUd, bạn sẽ kiếm được 148 đại diện theo hệ thống hiện tại:

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

Nhưng bạn sẽ kiếm được 198 theo hệ thống mới:

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

Như vậy, mức tăng là 50 rep .

Thử thách

Thách thức của bạn là viết một chương trình hoặc hàm có trong một chuỗi nhiều dòng và đưa ra tổng số đại diện sẽ đạt được với thuật toán trên. Mỗi dòng được tính là 1 UTC, vì vậy giới hạn đại diện chỉ áp dụng một lần cho mỗi dòng.

Các trường hợp thử nghiệm

(Một hoặc nhiều dòng đầu vào, theo sau là số nguyên đầu ra.)

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

Đây là mã golf, vì vậy mã ngắn nhất trong byte thắng.

Các thách thức liên quan: Tính tổng tích lũy giới hạn của một vectơ , Tính toán danh tiếng trao đổi ngăn xếp của bạn

1 Đây là phiên bản đơn giản hóa cao của hệ thống. Bạn cũng mất 1 đại diện vì đã bỏ qua một câu trả lời, và tồn tại những điều không mong muốn, đó là điều kỳ lạ và tuân theo các quy tắc của riêng họ ; và không được khuyến khích, thậm chí không có quy tắc để tuân theo .


1
Thử thách đẹp. Quá tệ, điều đó không có khả năng xảy ra ...
admBorkBork 9/2/2016

2
Bạn không mất đại diện cho các câu hỏi hạ cấp; Chỉ cần câu trả lời. Tin tôi đi: P
Geobits 9/2/2016

@Mego Có thể, nhưng tôi thấy những khác biệt sau: A) Mảng tích lũy đầy đủ là không cần thiết, chỉ là thuật ngữ cuối cùng. B) Không có giới hạn dưới và giới hạn trên được cố định. C) Đầu vào là một chuỗi, trái ngược với một mảng các số. D) Số lượng tùy ý của các chuỗi này, được phân tách bằng các dòng mới, phải được chạy qua từng chuỗi riêng biệt và được tính tổng để có kết quả.
Sản xuất ETH

1
@ETHproductions Tất cả những người ngoại trừ B là sự khác biệt I / O. Vấn đề cốt lõi vẫn là như vậy.
Mego

Câu trả lời:


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

Yêu cầu -pcờ:

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

Phá vỡ:

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

Tính toán trước và sau đại diện cho mỗi dòng. Lần đầu tiên tôi sử dụng eval!


2

Haskell, 98 93 byte

Nhờ BlackCap để chơi golf này hơn nữa. Bây giờ, tôi nghĩ sẽ thử lambda trong những thử thách sau, ngay bây giờ.

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

3 dòng đầu tiên là tính điểm, a & b là điểm số, f là sự khác biệt và g là chức năng duy trì đặc điểm kỹ thuật.

Sử dụng:

g"UUUuuuuuUUUuuUUUUUUuuuUUUuuUUUUuuuuUUUdddddddUU" -- 4

Bạn có thể hợp nhất hai dòng cuối cùng và kiếm được 1 byte: g = sum.map (\ x -> (10 & x) - (5 & x)). Các dòng Bạn cũng có thể xóa dấu ngoặc đơn cho bốn byte khác: g = sum.map (\ x-> 10 & x-5 & x) .lines
BlackCap

Và thêm 3 byte nếu bạn hợp nhất bản đồ và nếp gấp: a & b = Foldl (\ d g-> min 200 $ d + a # g)
0b

1

Lua, 196 byte

Chương trình này lấy một đối số nhiều dòng làm đầu vào và in tổng số chênh lệch trong 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)

Tôi giả sử tôi được phép yêu cầu một dòng mới trong đầu vào, nếu tôi không, đây là một giải pháp 204 Byte không cần đến nó.

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 và giải thích

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.