Допоможіть перерахувати репутацію!


12

Пару місяців тому ми обговорили мета про те, як збільшити репутацію нагороджених для випускників на питання. Ось основи нашої нинішньої системи репутації голосів: 1

  • Оновлення питання Uвартує 5 репутації.
  • Оголошення відповіді uвартує 10 репутації.
  • Питання чи відповідь на нижчу dсуму стоїть -2 репутація.

Існує багато різноманітних пропозицій щодо нової системи, але найпопулярніша в даний час ідентична вище, але з питаннями, що перевищують питання, масштабуються до +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 представників від цього сценарію.

Поки що обчислити змінений представник не так складно; просто порахуйте кількість Us і помножте на 5. На щастя, система повторень не така проста: є також відбиток , який є найбільшою репутацією, яку ви можете заробити за голоси за один UTC день. На всіх сайтах встановлено 200.

Крім того, обмеження для повторень застосовується в режимі реального часу: якщо ви вже заробили 196 повторень і отримаєте підсумковий відповідь, тепер у вас буде 200 повторень. Якщо ви одразу після цього отримаєте зворотну позицію, 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 особу за те, що заборонили відповідь, і існують відкликання, які дивні і дотримуються власних правил ; і скасувати закони, які навіть не мають дотримуватися правил .


1
Приємний виклик. Шкода, що це, мабуть, не станеться ...
AdmBorkBork

2
Ви не втрачаєте репрезентації на запитання, що зволікають; просто відповіді. Повірте мені: P
Геобіт

@Mego Можливо, але я бачу такі відмінності: A) Повний накопичувальний масив не потрібен, лише останній термін. В) Нижня межа не існує, а верхня межа фіксована. В) Вхід - це рядок, на відміну від масиву чисел. Г) Довільні суми цих рядків, розділені новими рядками, повинні проходити кожен окремо і підсумовуватися, щоб отримати результат.
ETHproductions

1
@ETHproductions Усі ці, крім B, є різницею вводу / виводу. Основна проблема залишається тією ж.
Мего

Відповіді:


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-> min 200 $ d + a # g) 0b
BlackCap

1

Луа, 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 байтів, яке йому не потрібно.

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)

Необурені і пояснення

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.