담당자를 다시 계산하십시오!


12

몇 달 전, 우리는 질문에 대한 찬사를받는 사람들의 명성을 높이는 것에 대한 메타 에 대해 토론했습니다 . 투표에 대한 현재 평판 시스템의 기본 사항은 다음과 같습니다. 1

  • 공감대 U는 5 점의 가치가 있습니다.
  • 답은 공평 u10 가치가 있습니다.
  • 질문이나 답변 downvote 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를 곱하면됩니다. 다행히도 rep 시스템은 그렇게 간단하지 않습니다. rep cap 도 있습니다.이 rep cap 은 UTC 투표에서 1 일 동안 얻을 수있는 가장 높은 평판입니다. 모든 사이트에서 200으로 설정되어 있습니다.

또한 담당자 한도는 실시간으로 적용됩니다. 이미 196 명의 담당자를 얻었고 답변 투표를 받으면 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 rep 입니다.

도전

여러 줄로 된 문자열을 가져 와서 위의 알고리즘으로 얻을 수있는 총 rep를 출력하는 프로그램이나 함수를 작성해야합니다. 각 줄은 UTC 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 명의 대표를 잃게되고, 이상 하지 않고 그들 자신의 규칙을 따르는 unvovotes 가 있습니다 ; 그리고 규칙을 준수하지 않은 undownvotes .


1
좋은 도전입니다. 너무 안 좋은 일이 일어날 것입니다 ...
AdmBorkBork

2
¹ 당신은 downvoting 질문에 대한 담당자를 잃지 않습니다; 그냥 대답하십시오. 날 믿어 : P
Geobits

@Mego 가능하지만 다음과 같은 차이점이 있습니다. A) 전체 누적 배열이 필요하지 않으며 마지막 용어 일뿐입니다. 나) 하한이없고 상한이 고정되어있다. 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

하스켈, 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)). lines 또 다른 4 바이트의 괄호를 제거 할 수도 있습니다. 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.