Ile jeszcze reputacji potrzebuję?

23

Programowanie zagadek i Code Golf ukończył beta. Wkrótce otrzymamy niestandardowy projekt strony, a wraz z tym wzrosną granice reputacji przywilejów. Wielu użytkowników utraci uprawnienia na stronie. Twoim zadaniem jest napisanie programu, który mówi nam, ile dodatkowej reputacji będziemy potrzebować, aby zachować nasze przywileje.

Zadanie

Twoim zadaniem jest napisanie najkrótszego kodu, aby znaleźć ilość dodatkowej reputacji, której użytkownik będzie potrzebował, aby zachować swoje obecne uprawnienia po zaprojektowaniu witryny, biorąc pod uwagę liczbę punktów reputacji.

Wejście wyjście

Możesz akceptować dane wejściowe i przekazywać dane wyjściowe w dowolny sposób, pod warunkiem przestrzegania następujących zasad:

Wejście - liczba całkowita od 1 do 250000+ włącznie . Twój program lub funkcja powinna być w stanie przyjmować liczby większe niż to, ale musi akceptować liczby z tego zakresu.

Dane wyjściowe - liczba całkowita reprezentująca liczbę punktów reputacji, które użytkownik będzie musiał uzyskać, aby zachować swoje bieżące uprawnienia po ukończeniu studiów.

Poproszę o brak standardowych luk .

Przykładowy algorytm

  1. Ustaw zmienną ina wejście
  2. Ustaw zmienną rna zmienną i.
  3. Chociaż rnie ma na liście beta:
    1. Odejmij 1od r.
  4. Ustaw nna pozycję rin beta.
  5. Ustaw rjako element nz graduated.
  6. Ustaw zmienną ona wynik r - i.
  7. Jeżeli o < 0:
    1. Ustaw zmienną ona 0.
  8. Zmienna wyjściowa o.

Stoły

Tabela uprawnień, które się zmienią

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

Tabela uprawnień, które się nie zmienią

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

Przypadki testowe

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

Nie wszystkie liczby reputacji są poprawne w momencie pisania.
Jeśli chcesz, aby liczyła się tutaj twoja przeszła lub obecna reputacja, po prostu skomentuj poniżej, a może dodam ją.

wizzwizz4
źródło
2
Powinieneś dołączyć kilka przypadków testowych.
Dennis
3
Przy okazji udział w progu meta rep w 5 również dla stron beta. PPCG ma to dostosowane, aby nowi użytkownicy mogli korzystać z piaskownicy. To nie powinno się zmienić, kiedy skończymy szkołę.
Dennis
1
@cat faktycznie tego użyłem; dzięki!
wizzwizz4
2
@ wizzwizz4 Dzięki za to; moja głowa zaczyna eksplodować i chciałem tylko 250 powtórzeń.
kot
1
@ wizzwizz4 Nie, po prostu wyglądałoby to nisko obok Dennisa :-)
xnor 24.04.2016

Odpowiedzi:

4

Python, 101 bajtów

lambda n:max(0,eval("+(n>=%d)*%d"*7%(5e3,5e3,4e3,5e3,35e2,5e3,2e3,5e3,15e2,2e3,5e2,15e2,150,15e2))-n)
orlp
źródło
Myślę, że dajesz nowego przedstawiciela, którego potrzebujesz, a nie wzrost. Więc f(750)powinno być 1250, nie 2000. Powinno być łatwym rozwiązaniem.
xnor
@xnor Cóż, f(750)powinno być 2250, nie 1250:)
lub
Wciąż muszę f(72950)dać 0.
xnor
Twoja evalsztuczka jest naprawdę dobra. Łącząc go z mojej listy kompresji daje 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
Czy uważasz, że możesz dodać wyjaśnienie i podział kodu?
wizzwizz4 24.04.16
4

Galaretka , 40 37 bajtów

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

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

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.
Dennis
źródło
3

CJam, 38 bajtów

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>

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe . 1

Jak to działa

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 Zauważ, że kod zawiera bajt zerowy, co powoduje problemy w niektórych przeglądarkach.

Dennis
źródło
3

JavaScript (ES6), 137 135 102 81 bajtów

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

Jeśli użytkownik ma 5000 lub więcej reputacji, wówczas findIndexkończy się niepowodzeniem, zwracając -1, więc wynik jest zwiększany do tego, że mogę indeksować w tablicy potrzebnych nowych reputacji. Edycja: Zapisano 21 bajtów, skalując tablicę wejściową i wyjściową.

   [.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
Neil
źródło
Niektóre odpowiedzi nie działają z testową wersją nowego użytkownika. Jeśli twój nie działa, proszę to naprawić.
wizzwizz4
@ wizzwizz4 Ah, zmiana uprawnień meta? Jasne, to proste rozwiązanie.
Neil,
Czy uważasz, że możesz dodać wyjaśnienie i podział kodu?
wizzwizz4 24.04.16
2

Python, 88 bajtów

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)

Za każde przekroczenie nowego przywileju beta dodaje liczbę powtórzeń potrzebną do przejścia do następnego stopniowanego przywileju. Następnie wymagane dodatkowe powtórzenie to nowe powtórzenie minus bieżące powtórzenie, ale nie mniej niż 0.

Obie listy granic rep są skracane przez rep w wielokrotnościach 500.

xnor
źródło
Równie dobrze można zastąpić [3]*2+[4]z [3,3,4]9 vs 8 bajtów.
CalculatorFeline
@CatsAreFluffy Dzięki, zapomniałem, że zmieniłem je z miejsc po przecinku, gdzie warto.
xnor
2

Python 156 152 bajtów

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

Łańcuch danych ( 5e3 5r4e3 5r3500 30./7r2e3 5r1500 10./3r500 6r1 1) jest listą w formacie (old_rep1) (new_rep1/old_rep1)r(old_repr) (new_rep2/old_rep2)zawierającym tylko uprawnienia, które ustawiają nowe maksymalne powtórzenie (użytkownicy z> 750 powtórzeń nadal potrzebują co najmniej 3k powtórzeń po ukończeniu studiów, nawet jeśli będą ustalonym użytkownikiem przy 1k. Lista jest posortowane od najwyższego powtórzenia jako pierwsze do najniższego powtórzenia jako ostatnie.

pppery
źródło
Czy uważasz, że możesz dodać wyjaśnienie i podział kodu?
wizzwizz4
@ wizzwizz4 Gotowe.
pppery 24.04.16
Hmm ... teraz to sprytna technika.
wizzwizz4 24.04.16
1

Pyth - 71 70 69 77 75 77 bajtów

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

Pakiet testowy .

Maltysen
źródło
To nie działa dla przypadku wizzwizz4testowego.
wizzwizz4
1
Niektóre odpowiedzi nie działają z testową wersją nowego użytkownika. Zauważyłem, że twój nie; proszę napraw to!
wizzwizz4
Czy uważasz, że możesz dodać wyjaśnienie i podział kodu?
wizzwizz4 24.04.16
1

LiveCode 8, 318 bajtów

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

Jak wizzwizz4sugerowano, oto wyjaśnienie:

function g c 

Utwórz funkcję o nazwie gprzyjmującą pojedynczy parametr c. cjest obecną reputacją użytkownika. Odpowiednik def g(c)w Pythonie.

local b,g,r

Utwórz trzy zmienne lokalne: b, g, i r. bbędą odcięcia reputacji dla przywilejów w wersji beta, gbędą zawierać nowe odcięcia reputacji po ukończeniu studiów i rbędą reprezentować całkowitą reputację, jaką użytkownik będzie musiał mieć po ukończeniu studiów, aby zachować swoje uprawnienia.

put c into r

Spowoduje to skopiowanie wartości c(bieżącej reputacji użytkownika) do r. Odpowiednik r=cw Pythonie)

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

Podobnie jak powyżej, ustawia b na ciąg zawierający rozdzieloną przecinkami listę wartości odcięcia reputacji w wersji beta, podzieloną przez 1000. Odpowiednik b="0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5"w Pythonie.

split b by ","

Dzieli to zmienną lokalną bna tablicę, używając ,jako separatora. Ta tablica zawiera teraz odcięcia reputacji w wersji beta, podzielone przez 1000. Odpowiednik b.split(",")w Pythonie.

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

To samo co powyżej, z tym wyjątkiem, że gteraz zawiera listę odcięć reputacji po ukończeniu studiów, podzieloną przez 5000

repeat with i=1 to 11

Podobnie jak forw innych językach, pętla ta powtarza się 11 razy, za każdym razem iprzypisywana jest kolejna wartość w sekwencji od 1 do 11. Tablice w LiveCode zaczynają się od indeksu 1. W Pythonie byłoby to 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

To jest główna logika tej funkcji. Sprawdza, czy użytkownik ma wystarczającą reputację do przywileju na pozycji ilisty beta, jeśli tak, a jeśli nie ma wystarczającej reputacji do przywileju po ukończeniu studiów, ustawia zmienną r(reprezentującą całkowitą reputację, którą użytkownik będą musieli zachować swoje przywileje po ukończeniu studiów) do odcięcia reputacji po ukończeniu tego uprawnienia (tylko jeśli nowa reputacja jest wyższa od poprzedniej). Równoważny kod Pythona toif c>b[i]*1000 and not c>g[i]*5000: r=max(g[i]*5000,r) zakończenie powtarzania Kończy pętlę powtarzania. Podobne do C lub Java }. LiveCode wykorzystuje składnię end 'insert contruct nameaby zakończyć repeatpętlę, co oznacza if, A switchitd ...

return r-c

Dość oczywiste.

end g

Kończy funkcję g .

penalosa
źródło
Zupełnie nowy użytkownik opublikował odpowiedź na moje wyzwanie? Jestem zaszczycony. +1 i witamy na stronie.
wizzwizz4 24.04.16
Możesz poprawić ten post, dodając wyjaśnienie kodu i podział. (Wyjaśnij, co robi kod, wiersz po wierszu, poniżej kodu.)
wizzwizz4 24.04.16
@ wizzwizz4 Dodano wyjaśnienie.
penalosa