더 많은 평판이 필요합니까?


23

프로그래밍 퍼즐과 코드 골프는 베타를 졸업했습니다. 곧 우리는 커스텀 사이트 디자인을 얻게 될 것이며, 그에 따라 권한에 대한 명성이 높아질 것입니다. 많은 사용자가 사이트에 대한 권한을 잃게됩니다. 그래서 당신의 임무는 우리가 우리의 특권을 유지하기 위해 얼마나 많은 추가 평판이 필요한지를 알려주는 프로그램을 작성하는 것입니다.

태스크

당신의 임무는 사용자가 평판 포인트의 수를 고려할 때 사이트 디자인 후 현재 권한을 유지해야하는 추가 평판의 양을 찾기 위해 가장 짧은 코드를 작성하는 것입니다.

입출력

다음 규칙을 따르는 한 원하는 방식으로 입력을 수락하고 출력 할 수 있습니다.

입력 -1에서 250000+ 까지 의 정수 . 프로그램이나 함수 이보다 큰 숫자를 받아 들일 수 있어야 하지만 이 범위의 숫자를 받아 들여야합니다.

출력 -졸업 후 사용자가 현재 권한을 유지해야하는 평판 점수의 수를 나타내는 정수입니다.

표준 허점은 없습니다 .

알고리즘 예

  1. 변수 i를 입력으로 설정
  2. variable r을 variable로 설정하십시오 i.
  3. r목록에없는 동안 beta:
    1. 빼기 1에서 r.
  4. 설정 n의 위치 r에서 beta.
  5. r항목 n으로 설정하십시오 graduated.
  6. 변수 o를의 결과로 설정하십시오 r - i.
  7. 만약 o < 0:
    1. 변수 o를로 설정하십시오 0.
  8. 출력 변수 o.

테이블

변경 될 권한 테이블

 | privilege name              | beta rep | graduation rep |
-+-----------------------------+----------+----------------+-
 | create tags                 |      150 |           1500 |
 | access review queues        |      350 |            500 |
 | cast close and reopen votes |      500 |           3000 |
 | established user            |      750 |           1000 |
 | edit questions and answers  |     1000 |           2000 |
 | create tag synonyms         |     1250 |           2500 |
 | approve tag wiki edits      |     1500 |           5000 |
 | access to moderator tools   |     2000 |          10000 |
 | protect questions           |     3500 |          15000 |
 | trusted user                |     4000 |          20000 |
 | access to site analytics    |     5000 |          25000 |
-+-----------------------------+----------+----------------+-
 | privilege name              | beta rep | graduation rep |

변경되지 않는 권한 테이블

 | privilege name               | reputation |
-+------------------------------+------------+-
 | create posts                 |          1 |
 | participate in meta          |          1 |
 | create wiki posts            |         10 |
 | remove new user restrictions |         10 |
 | vote up                      |         15 |
 | flag posts                   |         15 |
 | talk in chat                 |         20 |
 | comment everywhere           |         50 |
 | set bounties                 |         75 |
 | create chatrooms             |        100 |
 | edit community wiki          |        100 |
 | vote down                    |        125 |
-+------------------------------+------------+-
 | privilege name               | reputation |

테스트 케이스

wizzwizz4                |   750 |  2250
cat                      |  2004 |  7996
Dennis ♦                 | 72950 |     0
Dr Green Eggs and Ham DJ |  4683 | 15317
New User                 |     1 |     0

모든 평판 수는 작성 당시 정확한
당신이 원하는 경우 과거 또는 현재 여기에 평판 수, 아래 단지 코멘트를 나는거야 아마 추가합니다.


2
몇 가지 테스트 사례를 포함해야합니다.
Dennis

3
BTW 메타에 참여하는 베타 사이트 5 담당자 임계 값뿐만 아니라. PPCG는 새로운 사용자가 샌드 박스를 사용할 수 있도록 사용자 정의했습니다. 졸업 할 때 바뀌지 않아야합니다.
Dennis

1
@cat 실제로 사용했습니다. 감사!
wizzwizz4

2
@ wizzwizz4 감사합니다; 내 머리가 터지기 시작했고 250 명만 더 원했다.
고양이

1
@ wizzwizz4 아, 데니스 옆에 낮게 보일 것입니다 :-)
xnor

답변:


4

파이썬, 101 바이트

lambda n:max(0,eval("+(n>=%d)*%d"*7%(5e3,5e3,4e3,5e3,35e2,5e3,2e3,5e3,15e2,2e3,5e2,15e2,150,15e2))-n)

나는 당신이 당신이 필요로하는 새로운 담당자를 제공한다고 생각합니다. 따라서 f(750)해야 1250하지 2000. 쉽게 고쳐야합니다.
xnor

@xnor 음, f(750)해야 2250하지 1250:)
orlp

아직도 f(72950)줄 필요가 있습니다 0.
xnor

당신의 eval트릭은 정말 좋습니다. 내 목록 압축과 결합하면 83 :이 lambda n:max(eval("+(n>=%s*500)*%s*500"*7%(.3,3,1,3,3,4,4,10,7,10,8,10,10,10))-n,0)됩니다.
xnor

코드 설명과 분석을 추가 할 수 있다고 생각하십니까?
wizzwizz4

4

젤리 , 40 37 바이트

19112203.3b11×ȷḞ>Ḥ¬×9999322D‘¤S×.ȷ_»0

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

19112203.3b11×ȷḞ>Ḥ¬×9999322D‘¤S×.ȷ_»0  Main link. Argument: n

19112203.3b11                          Convert the float to base 11. Yields
                                       [10, 8, 7, 4, 3, 1, 0.30000000074505806].
             ×ȷ                        Multiply each by 1000.
               Ḟ                       Floor. Yields
                                       [10000, 8000, 7000, 4000, 3000, 1000, 300].
                 Ḥ                     Unhalve; yield 2n.
                >                      Compare each integer in the list with 2n.
                  ¬                    Negate the resulting Booleans.
                             ¤         Chain the three links to the left:
                    9999322D           Convert the integer to base 10.
                            ‘          Increment each digit. Yields 
                                       [10, 10, 10, 10, 4, 3, 3].
                   ×                   Multiply the Booleans with the corr. digits.
                              S        Compute the sum of the products.
                               ×.ȷ     Multiply the sum by 500.
                                  _    Subtract n.
                                   »0  Return the maximum of the difference and 0.

3

CJam, 38 바이트

0000000: 72 69 5f 35 30 2f 22 64 50 46 28 1e 0a 03 22 66  ri_50/"dPF(..."f
0000010: 3c 3a 2b 22 fa c8 96 64 32 1e 0f 00 22 3d 69 65  <:+"...d2..."=ie
0000020: 32 5c 2d 55 65 3e                                2\-Ue>

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 . 1

작동 원리

ri                        Read an integer n from STDIN.
  _50/                    Push a copy and divide it by 50.
     "…"                  Push the string with code points [100 80 70 40 30 10 3].
        f<                Compare each code point with n / 50.
          :+              Add the resulting Booleans.
            "…"           Push the string with code points
                          [250 200 150 100 50 30 15 0].
               =          Select the one at the index of the sum.
                i         Convert from character to integer.
                 e2       Multiply by 100.
                   \-     Subtract n from the product.
                     Ue>  Take the maximum of the difference and 0.

1 코드에 널 바이트가 포함되어 일부 브라우저에서 문제가 발생합니다.


3

자바 스크립트 (ES6), (137) 135 (102) 81 바이트

n=>(n-=[5,0,.3,.6,1,2,3,4][[.3,1,3,4,7,8,10].findIndex(m=>m*500>n)+1]*5e3)<0?-n:0

사용자의 평판이 5000 이상이면 findIndex실패하고 -1을 반환하므로 결과는 필요한 새로운 평판의 배열로 색인을 생성 할 수 있도록 증가합니다. 편집 : 입력 및 출력 배열을 조정하여 21 바이트를 절약했습니다.

   [.3,1,3,4,7,8,10]        Old reputations of note, divided by 500
    .findIndex(m=>m*500>n)  Skip ones that have been achieved
     +1                     Normalise the return value
  [5,0,.3,.6,1,2,3,4][]     Index into new reputation needed
   *5e3                     Scaling factor
 n-=                        Compare to the current reputation
()<0?-n:0                   Negate to return the requirement

일부 사용자 답변은 새 사용자 테스트 케이스에서 작동하지 않습니다. 문제가 해결되지 않으면 해결하십시오.
wizzwizz4

@ wizzwizz4 아, 메타 특권 변경? 물론, 그것은 간단한 수정입니다.
Neil

코드 설명과 분석을 추가 할 수 있다고 생각하십니까?
wizzwizz4

2

파이썬, 88 바이트

lambda n:max(sum(500*b*(n>=a*500)for a,b in zip([.3,1,3,4,7,8,10],[3,3,4]+[10]*4))-n,0)

새로운 베타 권한이 초과 될 때마다 다음 번 졸업 한 권한을 얻는 데 필요한 담당자 수를 추가합니다. 그런 다음 필요한 추가 담당자는 새 담당자에서 현재 담당자를 뺀 값이지만 0 이상입니다.

두 개의 rep 경계 목록은 rep의 배수로 짧아집니다 500.


당신은뿐만 아니라 대체 수 [3]*2+[4][3,3,4], 9 8 대 바이트.
CalculatorFeline

@ CatsAreFluffy 감사합니다. 가치가있는 소수점 이하 자릿수를 변경하지 않았습니다.
xnor

2

파이썬 156152 바이트

s=str.split;n=input()
for k,v in map(s,s('5e3 5r4e3 5r3500 30./7r2e3 5r1500 10./3r500 6r1 1','r')):
 w=u(k);r=eval(v)*w
 if w<=n:print max(0,r-n);break

데이터 문자열 ( 5e3 5r4e3 5r3500 30./7r2e3 5r1500 10./3r500 6r1 1)은 (old_rep1) (new_rep1/old_rep1)r(old_repr) (new_rep2/old_rep2)새로운 최대 응답을 설정하는 개인 전용 만 포함 하는 형식의 목록입니다 (응답이> 750 이상인 사용자는 1k에서 정식 사용자가 되더라도 여전히 졸업 후 3k 이상의 응답이 필요합니다). 가장 높은 담당자부터 가장 낮은 담당자까지 정렬했습니다.


코드 설명과 분석을 추가 할 수 있다고 생각하십니까?
wizzwizz4

@ wizzwizz4 완료
pppery

흠 ... 지금 그것은 영리한 기술입니다.
wizzwizz4

1

Pyth- 71 70 69 77 75 77 바이트

eS,Z-@CM"\x00ǴϨלߐৄஸᎈ✐㪘丠憨"xKCM"\x00ŞˮϨӢǴלߐඬྠᎈ"e<#QK

테스트 스위트 .


wizzwizz4테스트 케이스 에서는 작동하지 않습니다 .
wizzwizz4

1
일부 사용자 답변은 새 사용자 테스트 케이스에서 작동하지 않습니다. 나는 너의 것이 아니라는 것을 알아 차렸다. 고쳐주세요!
wizzwizz4

코드 설명과 분석을 추가 할 수 있다고 생각하십니까?
wizzwizz4

1

라이브 코드 8, 318 바이트

function g c
    local b,g,r
    put c into r
    put "0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5" into b
    split b by ","
    put "0.3,0.1,0.6,0.2,0.4,0.5,1,2,3,4,5" into g
    split g by ","
    repeat with i=1 to 11
       if c>b[i]*1000 and not c>g[i]*5000 then put max(r,g[i]*5000) into r
    end repeat
    return r-c
 end g

wizzwizz4제안 된 대로 여기에 설명이 있습니다.

function g c 

g하나의 매개 변수를 사용하여 이름이 지정된 함수를 만듭니다 c. c사용자의 현재 평판입니다. def g(c)파이썬과 동일합니다 .

local b,g,r

세 지역 변수를 만들고 b, g하고 r. b베타에서 권한에 대한 g평판 컷오프가되고 졸업 후 새로운 평판 컷오프가 포함되며, r졸업 후 권한을 유지하기 위해 사용자가 가져야 할 총 평판이 나타납니다.

put c into r

이것은 c(사용자의 현재 평판)의 값을에 복사합니다 r. r=c파이썬과 동일 )

put "0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5" into b

위와 유사하게, b를 쉼표로 구분 된 평판 컷오프 목록을 1000으로 나눈 값으로 1000으로 나눈 문자열로 설정합니다 b="0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5". Python과 같습니다 .

split b by ","

이것은 분리 문자로 b사용하여 지역 변수 를 배열로 분할합니다 ,. 이 배열은 이제 베타로 평판 평판을 1000으로 나눈 값을 포함합니다 b.split(",").

put "0.3,0.1,0.6,0.2,0.4,0.5,1,2,3,4,5" into g
split g by ","

g졸업 후 평판 컷오프 목록을 5000으로 나눈다는 점을 제외하면 위와 동일

repeat with i=1 to 11

for다른 언어 의 루프와 유사하게 매번 i시퀀스 1에서 11까지 다음 값 이 할당되어 11 회 반복 됩니다. LiveCode의 배열은 인덱스 1에서 시작합니다 for i in range(11). Python에서이 값은입니다 .

if c>b[i]*1000 and not c>g[i]*5000 then put max(r,g[i]*5000) into r

이것이 기능의 주요 논리입니다. 사용자가 i베타 목록의 위치 에 있는 특권에 대한 평판이 충분한 지 확인하고, 그렇다면 졸업 후 특권에 대한 평판이 충분하지 않은 경우 변수를 설정합니다 r(사용자의 총 평판을 나타냄) (특정 졸업 후 자신의 특권을 유지해야 함) 해당 특권 졸업 후 평판 컷오프 (새로운 평판이 이전 평판보다 높을 경우에만). 동등한 파이썬 코드는 if c>b[i]*1000 and not c>g[i]*5000: r=max(g[i]*5000,r) end repeat입니다. 반복 루프를 종료합니다. C 또는 Java와 유사합니다 }. LiveCode 구문을 사용 end 'insert contruct name끝면하는 repeat루프 if하는 switch등 ..

return r-c

상당히 자명하다.

end g

기능을 종료합니다 g.


브랜드의 새로운 사용자에 대한 답변을 게시 도전을? 영광입니다. +1하고 사이트에 오신 것을 환영합니다.
wizzwizz4

코드 설명과 분석을 추가하여이 게시물을 개선 할 수 있습니다. (코드 아래에 한 줄씩 코드 아래에 코드의 기능을 설명하십시오.)
wizzwizz4

@ wizzwizz4 설명이 추가되었습니다.
penalosa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.