ช่วยคำนวณตัวแทนของคุณอีกครั้ง!


12

สองสามเดือนที่ผ่านมาเราได้อภิปรายเกี่ยวกับเมตาดาต้าเกี่ยวกับการเพิ่มชื่อเสียงที่ได้รับจากการโหวตคำถาม นี่คือพื้นฐานของระบบชื่อเสียงของเราในปัจจุบันสำหรับการลงคะแนน: 1

  • การโหวตคำถามUมีค่า 5 ชื่อเสียง
  • คำตอบ upvote uมีค่า 10 ชื่อเสียง
  • คำถามหรือคำตอบ downvote dมีค่า -2 ชื่อเสียง

มีข้อเสนอแนะที่แตกต่างกันมากมายสำหรับระบบใหม่ แต่ปัจจุบันได้รับความนิยมมากที่สุดเหมือนกับข้างต้น แต่มี upvotes คำถามปรับสัดส่วนเป็น +10 ตัวแทน ความท้าทายนี้เกี่ยวกับการคำนวณจำนวนตัวแทนที่คุณจะได้รับหากใช้ระบบนี้

ลองดูตัวอย่าง หากกิจกรรมการลงคะแนนเป็นUUUUuuuuUUUUUduuudUUเช่นนั้นคุณจะได้รับ 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

แต่กิจกรรมเดียวกันจะได้รับ 176 ภายใต้ระบบใหม่:

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

คุณจะได้รับ55 ตัวแทนจากสถานการณ์นี้

จนถึงตอนนี้การคำนวณตัวแทนที่เปลี่ยนไปนั้นไม่ยาก เพียงแค่นับจำนวนUและคูณด้วย 5 โชคดีที่ระบบตัวแทนนั้นไม่ง่ายอย่างนั้น: นอกจากนี้ยังมีตัวแทนตัวแทนซึ่งมีชื่อเสียงมากที่สุดที่คุณสามารถได้รับจากการโหวตในหนึ่งวัน UTC สิ่งนี้ถูกตั้งค่าเป็น 200 ในทุกเว็บไซต์

นอกจากนี้หมวกตัวแทนจะใช้งานแบบเรียลไทม์: หากคุณได้รับ 196 ตัวแทนและคุณได้รับคำตอบ upvote ตอนนี้คุณจะมี 200 ตัวแทน หากคุณได้รับ downvote ทันทีหลังจากนั้นตัวแทน 2 คนจะถูกลบออกจาก 200 ดังนั้นคุณจะได้ 198 ตัวแทน

ด้วยกิจกรรมการลงคะแนนUUUuuuuUUUUuuuuUUUUUUUdคุณจะได้รับ 148 ตัวแทนภายใต้ระบบปัจจุบัน:

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

แต่คุณจะได้รับ 198 ภายใต้ระบบใหม่:

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

ดังนั้นการเพิ่มขึ้นเป็น50 ตัวแทน

ท้าทาย

ความท้าทายของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในสตริงแบบหลายบรรทัดและส่งออกตัวแทนทั้งหมดที่จะได้รับจากอัลกอริทึมด้านบน แต่ละบรรทัดนับเป็น 1 UTC วันดังนั้นตัวแทนสูงสุดจะใช้เพียงหนึ่งครั้งต่อบรรทัด

กรณีทดสอบ

(อินพุตอย่างน้อยหนึ่งบรรทัดตามด้วยจำนวนเต็มเอาต์พุต)

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

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ความท้าทายที่เกี่ยวข้อง: คำนวณผลรวมสะสมของเวคเตอร์ , คำนวณชื่อเสียงการแลกเปลี่ยนสแต็กของคุณ

1นี่เป็นเวอร์ชั่นที่ง่ายมากของระบบ นอกจากนี้คุณยังจะสูญเสีย 1 ตัวแทนสำหรับ downvoting คำตอบและมีอยู่ unupvotes ซึ่งมีความแปลกและปฏิบัติตามกฎของตัวเอง ; และ undownvotes ซึ่งไม่ได้มีกฎระเบียบที่จะปฏิบัติตาม


1
ความท้าทายที่ดี น่าเสียดายที่มันไม่น่าจะเกิดขึ้น ...
AdmBorkBork

2
¹คุณจะไม่สูญเสียตัวแทนจากคำถามการลงคะแนน แค่คำตอบ เชื่อฉันเถอะ: P
Geobits

@ อาจเป็นไปได้ แต่ฉันเห็นความแตกต่างดังต่อไปนี้: A) ไม่จำเป็นต้องมีอาร์เรย์สะสมเต็มรูปแบบเพียงแค่ใช้คำสุดท้าย B) ไม่มีขอบล่างและขอบบนคงที่ C) การป้อนข้อมูลเป็นสตริงเมื่อเทียบกับอาร์เรย์ของตัวเลข D) จำนวนของสตริงเหล่านี้โดยแยกจากกันด้วยการขึ้นบรรทัดใหม่จะต้องดำเนินการแยกจากกันและสรุปเพื่อให้ได้ผลลัพธ์
ETHproductions

1
@ETHproductions ทั้งหมดยกเว้น B คือความแตกต่างของ I / O ปัญหาหลักยังคงเหมือนเดิม
Mego

คำตอบ:


0

Perl, 104 91 + 2 = 93 ไบต์

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

ต้องการ-pธง:

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

แตกหัก:

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 ไบต์

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

คำนวณก่อนและหลังตัวแทนสำหรับแต่ละบรรทัด การใช้งานครั้งแรกของฉันeval!


2

Haskell, 98 93 ไบต์

ขอบคุณ BlackCap ที่จะตีกอล์ฟต่อไป ตอนนี้ฉันคิดว่าจะลองแลมบ์ดาในความท้าทายที่ตามมาตอนนี้

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 บรรทัดแรกคือการให้คะแนน, a & b คือคะแนน, f คือความแตกต่างและ g คือฟังก์ชั่นการลบล้างข้อมูลจำเพาะ

การใช้งาน:

g"UUUuuuuuUUUuuUUUUUUuuuUUUuuUUUUuuuuUUUdddddddUU" -- 4

คุณสามารถรวมสองบรรทัดสุดท้ายและรับ 1 ไบต์: g = sum.map (\ x -> (10 & x) - (5 & x)) บรรทัดคุณยังสามารถลบวงเล็บสำหรับอีกสี่ไบต์: g = sum.map (\ x-> 10 & x-5 & x) .lines
BlackCap

และอีก 3 ไบต์ถ้าคุณรวมแผนที่และส่วนขยาย: a & b = foldl (\ d g-> ขั้นต่ำ 200 $ d + a # g) 0b
BlackCap

1

Lua, 196 ไบต์

โปรแกรมนี้ใช้อาร์กิวเมนต์หลายบรรทัดเดียวเป็นอินพุตและพิมพ์ความแตกต่างทั้งหมดในตัวแทน '

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)

ฉันสันนิษฐานว่าฉันได้รับอนุญาตให้ขอบรรทัดใหม่ต่อท้ายในอินพุตหากฉันไม่ได้นี่คือโซลูชัน 204 Bytes ที่ไม่ต้องการ

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 และคำอธิบาย

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.