ฉันต้องการชื่อเสียงมากแค่ไหน?


23

การเขียนโปรแกรมปริศนาและรหัสกอล์ฟได้จบการศึกษาจากรุ่นเบต้า ในไม่ช้าเราจะได้รับการออกแบบเว็บไซต์ที่กำหนดเองและด้วยขอบเขตของชื่อเสียงสำหรับสิทธิ์จะเพิ่มขึ้น ผู้ใช้จำนวนมากจะสูญเสียสิทธิ์บนไซต์ ดังนั้นงานของคุณคือการเขียนโปรแกรมที่บอกเราว่าเราจะต้องรักษาชื่อเสียงของเราไว้เป็นพิเศษ

งาน

งานของคุณคือการเขียนรหัสที่สั้นที่สุดเพื่อค้นหาจำนวนชื่อเสียงพิเศษที่ผู้ใช้จะต้องเก็บรักษาสิทธิ์ปัจจุบันของพวกเขาหลังจากการออกแบบเว็บไซต์ตามจำนวนคะแนนชื่อเสียง

อินพุต / เอาต์พุต

คุณสามารถยอมรับอินพุตและให้เอาต์พุตในแบบที่คุณต้องการตราบใดที่มันเป็นไปตามกฎเหล่านี้:

อินพุต - จำนวนเต็มจาก 1 ถึง 250000+ รวม โปรแกรมหรือฟังก์ชั่นของคุณควรจะยอมรับตัวเลขที่มากกว่านี้ได้ แต่จะต้องยอมรับตัวเลขในช่วงนี้

เอาท์พุท - จำนวนเต็มแสดงถึงคะแนนชื่อเสียงที่ผู้ใช้จะต้องได้รับเพื่อรักษาสิทธิ์ปัจจุบันของพวกเขาหลังจากสำเร็จการศึกษา

ไม่มีช่องว่างมาตรฐานกรุณา

อัลกอริทึมตัวอย่าง

  1. ตั้งค่าตัวแปรiเป็นอินพุต
  2. ตั้งค่าตัวแปรให้กับตัวแปรri
  3. ในขณะที่rไม่อยู่ในรายการbeta:
    1. ลบจาก1r
  4. ตั้งค่าnไปยังตำแหน่งของในrbeta
  5. ตั้งค่าrไปยังรายการของngraduated
  6. ตั้งค่าตัวแปรเพื่อผลมาจากการor - i
  7. ถ้าo < 0:
    1. ตั้งค่าตัวแปรที่จะo0
  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 |

Testcases

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

การนับจำนวนชื่อเสียงไม่ถูกต้อง ณ เวลาที่เขียน
ถ้าคุณต้องการให้ชื่อเสียงในอดีตหรือปัจจุบันของคุณนับที่นี่เพียงแค่แสดงความคิดเห็นด้านล่างและฉันอาจจะเพิ่ม


2
คุณควรมีกรณีทดสอบสองสามข้อ
เดนนิส

3
Btw มีส่วนร่วมในเกณฑ์meta rep ใน 5 สำหรับเว็บไซต์เบต้าเช่นกัน PPCG มีการปรับแต่งเพื่อให้ผู้ใช้ใหม่สามารถใช้ sandbox สิ่งนี้ไม่ควรเปลี่ยนแปลงเมื่อเราสำเร็จการศึกษา
เดนนิส

1
@cat ฉันใช้จริง ๆ ; ขอบคุณ!
wizzwizz4

2
@ wizzwizz4 ขอบคุณสำหรับสิ่งนั้น หัวของฉันเริ่มที่จะระเบิดและฉันต้องการเพียง 250 ตัวแทนเพิ่มเติม
แมว

1
@ wizzwizz4 ไม่หรอกมันคงดูไม่ดีถัดจาก Dennis :-)
xnor

คำตอบ:


4

Python 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เคล็ดลับของคุณดีจริงๆ รวมกับการบีบอัดรายการของฉันให้ 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)83:
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

JavaScript (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

บางคำตอบไม่สามารถใช้งานได้กับ testcase ของผู้ใช้ใหม่ หากคุณใช้ไม่ได้โปรดแก้ไข
wizzwizz4

@ wizzwizz4 อ่าการเปลี่ยนแปลงสิทธิ์ของเมตาคืออะไร? แน่นอนว่าเป็นการแก้ไขที่ง่าย
Neil

คุณคิดว่าคุณสามารถเพิ่มคำอธิบายรหัสและรายละเอียดได้หรือไม่
wizzwizz4

2

Python ขนาด 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

500ทั้งตัวแทนรายการเขตแดนจะสั้นลงโดยตัวแทนหลายรายการ


คุณอาจแทนที่[3]*2+[4]ด้วย[3,3,4]9 vs 8 bytes
CalculatorFeline

@CatsAreFluffy ขอบคุณฉันลืมฉันเปลี่ยนจากทศนิยมที่มันคุ้มค่า
xnor

2

Python 156 152 ไบต์

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 ตัวแทนยังคงต้องการโพสต์สำเร็จการศึกษาอย่างน้อย 3k แม้ว่าพวกเขาจะเป็นผู้ใช้ที่จัดตั้งขึ้นที่ 1k รายการคือ เรียงจากตัวแทนสูงสุดก่อนถึงตัวแทนต่ำสุด


คุณคิดว่าคุณสามารถเพิ่มคำอธิบายรหัสและรายละเอียดได้หรือไม่
wizzwizz4

@ wizzwizz4 เสร็จสิ้น
pppery

อืม ... ตอนนี้นั่นเป็นเทคนิคที่ฉลาด
wizzwizz4

1

Pyth - 71 70 69 77 75 77 ไบต์

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

Test Suite


สิ่งนี้ใช้ไม่ได้กับwizzwizz4testcase
wizzwizz4

1
บางคำตอบไม่สามารถใช้งานได้กับ testcase ของผู้ใช้ใหม่ ฉันสังเกตเห็นว่าคุณไม่ได้; โปรดแก้ไขมัน!
wizzwizz4

คุณคิดว่าคุณสามารถเพิ่มคำอธิบายรหัสและรายละเอียดได้หรือไม่
wizzwizz4

1

LiveCode 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 คือชื่อเสียงปัจจุบันของผู้ใช้ เทียบเท่ากับใน Pythonccdef g(c)

local b,g,r

สร้างสามตัวแปรท้องถิ่น: b, และg จะเป็นการตัดชื่อเสียงสำหรับสิทธิ์ในเบต้าจะมีการตัดชื่อเสียงใหม่หลังจากสำเร็จการศึกษาและจะแสดงถึงชื่อเสียงโดยรวมที่ผู้ใช้จะต้องมีหลังจากสำเร็จการศึกษาเพื่อรักษาสิทธิ์ของตนrbgr

put c into r

สำเนานี้ค่าของc(ชื่อเสียงปัจจุบันของผู้ใช้) rลงใน เทียบเท่ากับr=cใน Python)

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

เช่นเดียวกับข้างต้นชุดนี้ b เป็นสตริงที่มีรายการที่ตัดด้วยเครื่องหมายจุลภาคของการตัดชื่อเสียงในเบต้าหารด้วย 1,000 เทียบเท่ากับb="0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5"ใน Python

split b by ","

สิ่งนี้จะแยกตัวแปรโลคัลbลงในอาร์เรย์โดยใช้,เป็นตัวคั่น อาร์เรย์นี้มีการตัดชื่อเสียงในรุ่นเบต้าหารด้วย 1,000 เทียบเท่ากับb.split(",")ใน Python

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

เหมือนข้างต้นยกเว้นgตอนนี้มีรายการของการตัดชื่อเสียงหลังจากสำเร็จการศึกษาหารด้วย 5,000

repeat with i=1 to 11

คล้ายกับการforวนซ้ำในภาษาอื่นซึ่งจะทำซ้ำ 11 ครั้งโดยiกำหนดค่าถัดไปในลำดับที่ 1 ถึง 11 ในแต่ละครั้ง อาร์เรย์ใน LiveCode เริ่มต้นที่ดัชนี 1. for i in range(11)ในหลามนี้จะเป็น

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

นี่คือตรรกะหลักของฟังก์ชั่น มันตรวจสอบเพื่อดูว่าผู้ใช้มีชื่อเสียงเพียงพอสำหรับสิทธิ์ในตำแหน่งiของรายการเบต้าหรือไม่ถ้าเป็นเช่นนั้นและหากพวกเขาไม่มีชื่อเสียงเพียงพอสำหรับสิทธิ์หลังจากสำเร็จการศึกษาก็กำหนดตัวแปรr(แสดงถึงชื่อเสียงโดยรวมที่ผู้ใช้ จะต้องมีการรักษาสิทธิ์ของพวกเขาหลังจากสำเร็จการศึกษา) เพื่อตัดชื่อเสียงหลังจากสำเร็จการศึกษาสำหรับสิทธิ์นั้น (เฉพาะในกรณีที่ชื่อเสียงใหม่สูงกว่าก่อนหน้านี้) รหัส Python ที่เทียบเท่ากันจะเป็นการif c>b[i]*1000 and not c>g[i]*5000: r=max(g[i]*5000,r) สิ้นสุดการเล่นซ้ำสิ้นสุดการวนซ้ำซ้ำ คล้ายกับ C หรือของ }Java LiveCode ใช้ซินแทกซ์end 'insert contruct nameเพื่อสิ้นสุดการrepeatวนซ้ำ, เป็นif, switch...

return r-c

ค่อนข้างอธิบายตนเอง

end g

gสิ้นสุดการทำงาน


ผู้ใช้ใหม่โพสต์คำตอบในความท้าทายของฉัน ? ฉันรู้สึกเป็นเกียรติ +1 และยินดีต้อนรับสู่เว็บไซต์
wizzwizz4

คุณสามารถปรับปรุงโพสต์นี้โดยการเพิ่มคำอธิบายรหัสและรายละเอียด (อธิบายว่าโค้ดทำอะไรทีละบรรทัดด้านล่างโค้ดของคุณ)
wizzwizz4

@ wizzwizz4 เพิ่มคำอธิบาย
โทษทัณฑ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.