Di quanta più reputazione ho bisogno?


23

Puzzle di programmazione e Code Golf si è laureato dalla beta. Presto avremo un design del sito personalizzato e con ciò saliranno i confini della reputazione per i privilegi. Molti utenti perderanno i privilegi sul sito. Quindi il tuo compito è quello di scrivere un programma che ci dice quanta reputazione extra avremo bisogno per mantenere i nostri privilegi.

Compito

Il tuo compito è quello di scrivere il codice più breve per trovare la quantità di reputazione extra di cui un utente avrà bisogno per mantenere i privilegi attuali dopo la progettazione del sito, dato il numero di punti reputazione.

Input Output

Puoi accettare input e fornire output nel modo che preferisci, purché segua queste regole:

Input - Un numero intero compreso tra 1 e 250000+ inclusi . Il tuo programma o funzione dovrebbe essere in grado di accettare numeri più grandi di questo, ma deve accettare numeri in questo intervallo.

Output : un numero intero che rappresenta il numero di punti reputazione che l'utente dovrà ottenere per mantenere i propri privilegi attuali dopo la laurea.

Nessuna scappatoia standard , per favore.

Algoritmo di esempio

  1. Imposta la variabile isull'input
  2. Imposta variabile rsu variabile i.
  3. Mentre rnon è nell'elenco beta:
    1. Sottrai 1da r.
  4. Impostare nsulla posizione di rin beta.
  5. Impostato rsull'elemento ndi graduated.
  6. Imposta la variabile osul risultato di r - i.
  7. Se o < 0:
    1. Imposta variabile osu 0.
  8. Variabile di uscita o.

tabelle

Tabella dei privilegi che cambierà

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

Tabella dei privilegi che non cambierà

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

Casi test

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

Non tutti i conteggi della reputazione sono corretti al momento della stesura
Se vuoi che il tuo passato o la reputazione attuale contino qui, commenta qui sotto e forse lo aggiungerò.


2
Dovresti includere alcuni casi di test.
Dennis,

3
A proposito, partecipa alla soglia di meta rep in 5 anche per i siti beta. PPCG lo ha personalizzato in modo che i nuovi utenti possano utilizzare il sandbox. Questo non dovrebbe cambiare quando ci diplomiamo.
Dennis,

1
@cat L'ho usato effettivamente; Grazie!
wizzwizz4,

2
@ wizzwizz4 Grazie per quello; la mia testa sta iniziando a esplodere e volevo solo 250 rappresentanti in più.
gatto,

1
@ wizzwizz4 Nah, sembrerebbe basso accanto a Dennis :-)
xnor

Risposte:


4

Python, 101 byte

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

Penso che stai dando il nuovo rappresentante di cui hai bisogno, non l'aumento. Quindi, f(750)dovrebbe essere 1250, no 2000. Dovrebbe essere una soluzione semplice.
xnor

@xnor Beh, f(750)dovrei essere 2250no 1250:)
orlp

Devo ancora f(72950)dare 0.
xnor

Il tuo evaltrucco è davvero buono. La combinazione con la mia lista di compressione dà 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

Pensi di poter aggiungere una spiegazione del codice e un'analisi dettagliata?
wizzwizz4,

4

Gelatina , 40 37 byte

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

Provalo online! o verifica tutti i casi di test .

Come funziona

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 byte

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>

Provalo online! o verifica tutti i casi di test . 1

Come funziona

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 Notare che il codice contiene un byte null, che causa problemi in alcuni browser.


3

JavaScript (ES6), 137 135 102 81 byte

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

Se l'utente ha 5000 o più reputazione, allora findIndexfallisce, restituendo -1, quindi il risultato è aumentato a quello che posso indicizzare nella matrice di nuove reputazioni necessarie. Modifica: salvato 21 byte ridimensionando l'array di input e output.

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

Alcune risposte non funzionano con la testcase Nuovo utente. Se il tuo non funziona, risolvilo.
wizzwizz4,

@ wizzwizz4 Ah, il cambio del meta privilegio? Certo, è una soluzione semplice.
Neil,

Pensi di poter aggiungere una spiegazione del codice e un'analisi dettagliata?
wizzwizz4,

2

Python, 88 byte

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)

Per ogni nuovo privilegio beta superato, aggiunge l'importo del rappresentante necessario per passare al privilegio successivo laureato. Quindi, il rappresentante aggiuntivo necessario è il nuovo rappresentante meno il rappresentante corrente, ma non meno di 0.

Entrambi gli elenchi di limiti di rep sono abbreviati da rep in multipli di 500.


Si potrebbe anche sostituire [3]*2+[4]con [3,3,4], 9 vs 8 byte.
CalculatorFeline

@CatsAreFluffy Grazie, ho dimenticato di averli cambiati da decimali dove ne vale la pena.
xnor

2

Python 156 152 byte

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

La stringa di dati ( 5e3 5r4e3 5r3500 30./7r2e3 5r1500 10./3r500 6r1 1) è un elenco con il formato (old_rep1) (new_rep1/old_rep1)r(old_repr) (new_rep2/old_rep2)che include solo i privilegi che impostano il nuovo rappresentante massimo (gli utenti con> 750 rappresentanti hanno ancora bisogno di almeno 3k rappresentanti post-laurea, anche se saranno utenti stabiliti a 1k. ordinati dal più alto rep prima all'ultimo più basso.


Pensi di poter aggiungere una spiegazione del codice e un'analisi dettagliata?
wizzwizz4,

@ wizzwizz4 Fatto.
pepery

Hmm ... ora questa è una tecnica intelligente.
wizzwizz4,

1

Pyth - 71 70 69 77 75 77 byte

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

Test Suite .


Questo non funziona per il wizzwizz4testcase.
wizzwizz4,

1
Alcune risposte non funzionano con la testcase Nuovo utente. Ho notato che il tuo no; per favore aggiustalo!
wizzwizz4,

Pensi di poter aggiungere una spiegazione del codice e un'analisi dettagliata?
wizzwizz4,

1

LiveCode 8, 318 byte

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

Come wizzwizz4suggerito, ecco una spiegazione:

function g c 

Creare una funzione denominata gprendendo un singolo parametro c. cè la reputazione attuale dell'utente. Equivalente a def g(c)in Python.

local b,g,r

Creare tre variabili locali: b, g, e r. bsaranno i limiti di reputazione per i privilegi in beta, gconterranno i nuovi limiti di reputazione dopo la laurea e rrappresenteranno la reputazione totale che l'utente dovrà avere dopo la laurea per conservare i propri privilegi.

put c into r

Questo copia il valore di c(la reputazione attuale dell'utente) in r. Equivalente a r=cin Python)

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

Simile a sopra, questo imposta b su una stringa contenente un elenco delimitato da virgole dei limiti di reputazione in beta, diviso per 1000. Equivalente a b="0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5"in Python.

split b by ","

Questo divide la variabile locale bin un array, usando ,come delimitatore. Questo array ora contiene i limiti di reputazione in beta, divisi per 1000. Equivalente a b.split(",")in Python.

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

Come sopra, tranne per il fatto che gora contiene un elenco dei limiti di reputazione dopo la laurea, diviso per 5000

repeat with i=1 to 11

Simile a un forloop in altre lingue, questo si ripete 11 volte, con iogni volta assegnato il valore successivo nella sequenza da 1 a 11. Le matrici in LiveCode iniziano dall'indice 1. In Python, questo sarebbe 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

Questa è la logica principale della funzione. Verifica se l'utente ha abbastanza reputazione per il privilegio in posizione inell'elenco beta, in tal caso, e se non ha abbastanza reputazione per il privilegio dopo la laurea, imposta la variabile r(che rappresenta la reputazione totale che l'utente dovrà conservare i propri privilegi dopo la laurea) al limite di reputazione dopo la laurea per quel privilegio (solo se la nuova reputazione è superiore alla precedente). Il codice Python equivalente sarebbe if c>b[i]*1000 and not c>g[i]*5000: r=max(g[i]*5000,r) end repeat Termina il ciclo di ripetizione. Simile a C o Java }. LiveCode utilizza la sintassi end 'insert contruct nameper terminare un repeatciclo, un if, un switchecc ...

return r-c

Abbastanza autoesplicativo.

end g

Termina la funzione g.


Un nuovo utente pubblica una risposta sulla mia sfida? Sono onorato. +1 e benvenuto nel sito.
wizzwizz4,

È possibile migliorare questo post aggiungendo una spiegazione del codice e un'analisi dettagliata. (Spiega cosa fa il codice, riga per riga, sotto il tuo codice.)
wizzwizz4

@ wizzwizz4 Aggiunta spiegazione.
penalosa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.