Помогите пересчитать свою репутацию!

12

Пару месяцев назад у нас была дискуссия о мета- росте репутации, которая присуждается за положительные отзывы по вопросам. Вот основы нашей нынешней системы репутации для голосов: 1

  • Вопрос upvote Uстоит 5 репутации.
  • Ответ upvote 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 повторение за отказ от ответа, и существуют отклонения, которые являются странными и следуют собственным правилам ; и отказов голосов, которые даже не имеют правил для подражания .

ETHproductions
источник
1
Хороший вызов. Жаль, что это вряд ли произойдет ...
AdmBorkBork
2
Rep Вы не теряете репутацию за вопросы голосования; просто ответы. Поверьте мне: P
Geobits
@Mego Возможно, но я вижу следующие различия: A) Полный кумулятивный массив не нужен, только последний член. Б) Нет нижней границы, и верхняя граница является фиксированной. C) Вводом является строка, а не массив чисел. D) Произвольное количество этих строк, разделенных символами новой строки, должно проходить по отдельности и суммироваться для получения результата.
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
andlrc
источник
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
Akangka
источник
Вы можете объединить две последние строки и заработать 1 байт: g = sum.map (\ x -> (10 & x) - (5 & x)). Lines Вы также можете удалить скобки для следующих четырех байтов: 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 байт

Эта программа принимает в качестве входных данных один многострочный аргумент и выводит общую разницу в 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)

Я предположил, что мне разрешено просить новую строку в конце ввода, если нет, вот решение на 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
Katenkyo
источник