Bantu hitung ulang perwakilan Anda!


12

Beberapa bulan yang lalu, kami berdiskusi tentang meta tentang meningkatkan reputasi yang diberikan untuk upvotes pada pertanyaan. Berikut dasar-dasar sistem reputasi kami saat ini untuk memilih: 1

  • Suara positif Ubernilai 5 reputasi.
  • Jawaban suara ubernilai 10 reputasi.
  • Pertanyaan atau jawaban downvote dbernilai reputasi -2.

Ada banyak saran berbeda untuk sistem baru, tetapi saat ini yang paling populer adalah identik dengan yang di atas, tetapi dengan upvotes pertanyaan diskalakan ke +10 rep. Tantangan ini adalah tentang menghitung berapa banyak rep yang akan Anda dapatkan jika sistem ini diberlakukan.

Mari kita lihat sebuah contoh. Jika aktivitas memilih itu UUUUuuuuUUUUUduuudUU, maka Anda akan mendapatkan 121 di bawah sistem saat ini:

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

Tetapi aktivitas yang sama akan menghasilkan 176 di bawah sistem baru:

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

Anda akan mendapatkan 55 rep dari skenario ini.

Sejauh ini, menghitung rep yang berubah tidaklah sulit; cukup hitung jumlah Us dan kalikan dengan 5. Untungnya, sistem rep tidak sesederhana itu: ada juga cap rep , yang merupakan reputasi paling banyak yang dapat Anda peroleh dari suara dalam satu hari UTC. Ini diatur ke 200 di semua situs.

Juga, batasan rep berlaku secara real time: jika Anda telah mendapatkan 196 rep dan Anda menerima jawaban yang meningkat, Anda sekarang akan memiliki 200 rep. Jika Anda mendapatkan downvote tepat setelah itu, 2 rep akan dikurangi dari 200, sehingga Anda akan memiliki 198 rep.

Dengan aktivitas pemungutan suara UUUuuuuUUUUuuuuUUUUUUUd, Anda akan mendapatkan 148 rep dalam sistem saat ini:

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

Tetapi Anda akan mendapatkan 198 di bawah sistem baru:

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

Dengan demikian, kenaikannya adalah 50 rep .

Tantangan

Tantangan Anda adalah menulis program atau fungsi yang menggunakan string multi-line dan mengeluarkan total rep yang akan diperoleh dengan algoritma di atas. Setiap baris dihitung sebagai 1 UTC hari, jadi batas rep hanya berlaku sekali per baris.

Uji kasus

(Satu atau lebih jalur input, diikuti oleh integer 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

Ini adalah kode golf, jadi kode terpendek dalam byte menang.

Tantangan terkait: Hitung jumlah kumulatif vektor yang dibatasi , Hitung reputasi pertukaran tumpukan Anda

1 Ini adalah versi sistem yang sangat disederhanakan. Anda juga kehilangan 1 perwakilan karena menolak jawaban, dan ada unupvotes, yang aneh dan mengikuti aturan mereka sendiri ; dan undownvotes, yang bahkan tidak memiliki aturan untuk diikuti .


1
Tantangan yang bagus. Sayang sekali itu tidak mungkin terjadi ...
AdmBorkBork

2
¹ Anda tidak kehilangan perwakilan karena menurunkan pertanyaan; hanya jawaban. Percayalah: P
Geobits

@Mego Kemungkinan, tapi saya melihat perbedaan berikut: A) Array kumulatif penuh tidak diperlukan, hanya istilah terakhir. B) Tidak ada batas bawah, dan batas atas adalah tetap. C) Inputnya berupa string, berlawanan dengan array angka. D) Jumlah sewenang-wenang dari string ini, dipisahkan oleh baris baru, harus masing-masing dijalankan secara terpisah dan dijumlahkan untuk mendapatkan hasilnya.
ETHproduk

1
@ ETHproductions Semua itu kecuali B adalah perbedaan I / O. Masalah intinya masih sama.
Mego

Jawaban:


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

Membutuhkan -pbendera:

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

Kerusakan:

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

Menghitung rep sebelum dan sesudah untuk setiap baris. Penggunaan pertama saya eval!


2

Haskell, 98 93 byte

Berkat BlackCap untuk golf ini lebih lanjut. Sekarang, saya pikir untuk mencoba lambda di tantangan nanti, sekarang.

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 baris pertama adalah penilaian, a & b adalah skor, f adalah perbedaan dan g adalah fungsi yang memperjelas spesifikasi.

Pemakaian:

g"UUUuuuuuUUUuuUUUUUUuuuUUUuuUUUUuuuuUUUdddddddUU" -- 4

Anda dapat menggabungkan dua baris terakhir dan mendapatkan 1 byte: g = sum.map (\ x -> (10 & x) - (5 & x)). Baris Anda juga dapat menghapus tanda kurung untuk empat byte lainnya: g = sum.map (\ x-> 10 & x-5 & x) .lines
BlackCap

Dan 3 byte lagi jika Anda menggabungkan peta dan flip: a & b = foldl (\ d g-> min 200 $ d + a # g) 0b
BlackCap

1

Lua, 196 Bytes

Program ini mengambil argumen multi-garis tunggal sebagai input, dan mencetak perbedaan total dalam 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)

Saya berasumsi saya diizinkan untuk meminta jalur baru di input, jika saya tidak, inilah solusi 204 Bytes yang tidak memerlukannya.

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)

Tidak terseret dan penjelasan

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.