担当者の再計算にご協力ください!


12

数か月前に、質問に対する賛成票で与えられる評判を高めることについて、メタについて議論しました。投票の現在の評判システムの基本は次のとおりです。1

  • 質問に賛成票を投じるU価値は5つあります。
  • 回答の賛成票uは10名の価値があります。
  • 質問または回答のダウン票dは、-2評判に値します。

新しいシステムにはさまざまな提案がありましたが、現在最も人気のあるものは上記と同じですが、質問の賛成票が+10 repにスケーリングされています。この課題は、このシステムが導入された場合にどれだけ多くの担当者を獲得できるかを計算することです。

例を見てみましょう。投票アクティビティがの場合、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を掛けるだけです。幸いなことに、担当者システムはそれほど単純ではありません。担当者キャップもあります。これは、すべてのサイトで200に設定されます。

また、担当者の上限はリアルタイムで適用されます。すでに196人の担当者を獲得し、回答の賛成票を受け取った場合、200人の担当者がいます。その直後にダウン票を取得すると、200から2担当者が差し引かれるため、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 repです。

チャレンジ

あなたの課題は、複数行の文字列を取り込んで、上記のアルゴリズムで得られる合計担当者を出力するプログラムまたは関数を作成することです。各行は1 UTC日としてカウントされるため、担当者の上限は行ごとに1回のみ適用されます。

テストケース

(1行以上の入力とそれに続く出力整数。)

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
Geobits

@Mego可能ですが、次の違いがあります。A)完全な累積配列は不要で、最後の用語だけです。B)下限はなく、上限は固定されています。C)数値の配列ではなく、入力は文字列です。D)改行で区切られたこれらの文字列の任意の量は、それぞれ個別に実行され、結果を得るために合計されなければなりません。
ETHproductions

1
@ETHproductions B以外のすべてはI / Oの違いです。コアの問題はまだ同じです。
メゴ

回答:


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

ハスケル、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

最後の2行をマージして1バイトを獲得できます:g = sum.map(\ x->(10&x)-(5&x))。linesさらに4バイトの括弧を削除することもできます:g = sum.map(\ x-> 10&x-5&x)
.lines-ブラックキャップ

マップとフォールドをマージする場合、さらに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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.