Daha fazla üne ihtiyacım var?


23

Programming Puzzles ve Code Golf beta programından mezun oldu. Yakında özel bir site tasarımı elde edeceğiz ve bununla ayrıcalıklar için itibar sınırları artacaktır. Sitede birçok kullanıcı ayrıcalıklarını kaybedecek. Bu yüzden sizin göreviniz, ayrıcalıklarımızı korumamız için ne kadar fazla itibar göstermemiz gerektiğini söyleyen bir program yazmak.

Görev

Göreviniz, bir itibar noktası sayısı göz önüne alındığında, bir kullanıcının site tasarımından sonra geçerli ayrıcalıklarını sürdürmesi için ihtiyaç duyacağı fazladan itibar miktarını bulmak için en kısa kodu yazmaktır.

Giriş çıkış

Bu kuralları takip ettiği sürece girişi kabul edebilir ve istediğiniz şekilde çıktı verebilirsiniz:

Giriş - 1 - 250000+ dahil bir tam sayı . Programınız veya işleviniz bundan daha büyük sayıları kabul edebilmelidir, ancak bu aralıktaki sayıları kabul etmelidir .

Çıktı - Kullanıcının mezuniyetten sonra mevcut ayrıcalıklarını korumak için sahip olması gereken itibar puanını temsil eden bir tam sayı.

Standart boşluklar yok , lütfen.

Örnek algoritma

  1. Değişkeni igirişe ayarlayın
  2. Değişkeni rdeğişkene ayarlayın i.
  3. İken rlistede yok beta:
    1. Çıkar 1dan r.
  4. Set npozisyonuna riçinde beta.
  5. Set röğeye nait graduated.
  6. Değişkeni osonucuna ayarlayın r - i.
  7. Eğer o < 0:
    1. Değişkeni oolarak ayarlayın 0.
  8. Çıkış değişkeni o.

Tablolar

Değişecek ayrıcalıklar tablosu

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

Değişmeyecek ayrıcalıklar tablosu

 | 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

Tüm itibar sayıları yazarken doğru değildir Geçmiş veya bugünkü sayınızın burada
olmasını istiyorsanız, aşağıya yorum yapın, belki ekleyeyim.


2
Birkaç test durumu eklemelisiniz.
Dennis,

3
Ancak , beta siteleri için de 5'teki meta rep eşiğine katılın. PPCG özelleştirildi, böylece yeni kullanıcılar sanal alanı kullanabilirler. Mezun olduğumuzda bu değişmemeli.
Dennis,

1
@ cat Aslında bunu kullandım; Teşekkürler!
wizzwizz4

2
@ wizzwizz4 Bunun için teşekkürler; kafam patlamaya başlıyor ve sadece 250 daha fazla temsilci istedim.
kedi

1
@ wizzwizz4 Nah, sadece Dennis :-) yanında düşük görünüyordu
xnor

Yanıtlar:


4

Python, 101 bayt

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

Sanırım ihtiyacın olan yeni temsilciyi veriyorsun, artışı değil. Yani, f(750)olması gerektiği 1250değil 2000. Kolay bir düzeltme olmalı.
xnor

@xnor Eh, f(750)olmalı 2250, 1250:)
orlp

Hala f(72950)vermen gerekiyor 0.
xnor

Kişisel evalhile gerçekten iyidir. Benim liste sıkıştırma ile birleştirerek 83: verir 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

Bir kod açıklaması ve incelemesi ekleyebileceğinizi düşünüyor musunuz?
wizzwizz4

4

Jöle , 40 37 bayt

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

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

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 bayt

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>

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın . 1

Nasıl çalışır

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 Kodun bazı tarayıcılarda sorunlara neden olan bir boş bayt içerdiğini unutmayın.


3

JavaScript (ES6), 137 135 102 81 bayt

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

Eğer kullanıcı 5000 veya daha fazla üne sahipse findIndex, o zaman başarısız olur, -1 döndürür, böylece sonuç, gerekli olan yeni itibar dizisine endeksleyebileceğim şekilde artar. Düzenleme: Giriş ve çıkış dizisini ölçekleyerek 21 bayt kaydedildi.

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

Bazı cevaplar Yeni Kullanıcı test çantasıyla çalışmıyor. Seninki işe yaramazsa, lütfen düzelt.
wizzwizz4

@ wizzwizz4 Ah, meta ayrıcalık değişikliği? Tabii, bu basit bir düzeltme.
Neil

Bir kod açıklaması ve incelemesi ekleyebileceğinizi düşünüyor musunuz?
wizzwizz4

2

Python, 88 bayt

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)

Her yeni beta ayrıcalığı aşıldığında, bir sonraki mezun ayrıcalığına ulaşmak için gereken rep miktarını ekler. Daha sonra, gerekli olan ek rep, geçerli rep olan eksidir, ancak 0'dan az olmaz.

Her iki rep sınır listeleri katlarının çoğunda rep ile kısaltılmıştır 500.


9 ve 8 byte [3]*2+[4]ile de değiştirebilirsiniz [3,3,4].
Hesap MakinesiFeline

@CatsAreFluffy Teşekkürler, unutmayalım, değerlerini onluktan değiştirdiğimi unuttum.
xnor

2

Python 156 152 bayt

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

Veri dizgisi ( 5e3 5r4e3 5r3500 30./7r2e3 5r1500 10./3r500 6r1 1), (old_rep1) (new_rep1/old_rep1)r(old_repr) (new_rep2/old_rep2)yalnızca yeni max rep'i ayarlayan ayrıcalıkları içeren bir listedir (> 750 rep olan kullanıcılar, mezun olduktan sonra en az 3k rep'e ihtiyaç duyarlar, 1k'de kurulmuş bir kullanıcı olsalar bile. ilk önce en yüksek temsilci ile en düşük temsilci sırasına göre sıralı


Bir kod açıklaması ve incelemesi ekleyebileceğinizi düşünüyor musunuz?
wizzwizz4

@ wizzwizz4 Tamamlandı.
pppery

Hmm ... şimdi bu akıllı bir teknik.
wizzwizz4

1

Pyth - 71 70 69 77 75 77 bayt

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

Test Takımı .


Bu wizzwizz4test çantası için işe yaramıyor .
wizzwizz4

1
Bazı cevaplar Yeni Kullanıcı test çantasıyla çalışmıyor. Sizinkilerin olmadığını; lütfen düzelt!
wizzwizz4

Bir kod açıklaması ve incelemesi ekleyebileceğinizi düşünüyor musunuz?
wizzwizz4

1

LiveCode 8, 318 bayt

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

Gibi wizzwizz4önerdi aşağıda bir açıklaması var:

function g c 

gTek bir parametre alarak adlı bir işlev oluşturun c. ckullanıcının mevcut itibarıdır. def g(c)Python ile eşdeğer .

local b,g,r

: Üç yerel değişkenler oluşturma b, gve r. bbeta'daki imtiyazlar için itibar kesintileri golacak, mezuniyetten sonra yeni itibar kesintileri içerecek rve kullanıcının imtiyazlarını korumak için mezun olduktan sonra sahip olması gereken toplam itibarı temsil edecektir.

put c into r

Bu c(kullanıcının şu anki itibarı) değerini kopyalar r. r=cPython ile eşdeğerdir )

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

Yukarıdakine benzer şekilde, bu, b'yi, 1000'de bölerek beta'da itibar kesimlerinin virgülle ayrılmış bir listesini içeren bir dizgiye ayarlar b="0.15,0.35,0.5,0.75,1,1.25,1.5,2,3.5,4,5". Python'a eşdeğerdir .

split b by ","

Bu, yerel değişkeni , sınırlayıcı olarak bkullanarak bir diziye böler ,. Bu dizi şimdi beta olarak itibar kesmelerini içerir, bölü 1000. b.split(",")Python ile eşdeğerdir .

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

Yukarıdakilerin aynısı, ancak gşimdi mezun olduktan sonra itibar kesintilerinin bir listesini içeren, 5000'e bölünmüş

repeat with i=1 to 11

forDiğer dillerdeki bir döngüye benzer şekilde , bu, iher seferinde 1 ila 11 sıralarında bir sonraki değer atanarak, 11 kez tekrarlanır . LiveCode'daki diziler 1. dizinde başlar. Python'da bu olur 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

Bu, fonksiyonun ana mantığıdır. Kullanıcının ibeta listesinin bulunduğu ayrıcalık için yeterli üne sahip olup olmadığını kontrol eder , eğer öyleyse ve mezun olduktan sonra ayrıcalık için yeterli üne sahip değilse, değişkeni belirler r(kullanıcının toplam itibarını temsil eder) Mezun olduktan sonra imtiyazlarını muhafaza etmek zorunda kalacaklardı), bu imtiyaz için mezun olduktan sonra itibar sınırına (sadece yeni itibar öncekinden daha yüksekse) korunmalıdır. Eşdeğer Python kodu if c>b[i]*1000 and not c>g[i]*5000: r=max(g[i]*5000,r) son tekrar olacaktır Tekrar döngüsünü sonlandırır. C veya Java'nın benzer }. LiveCode end 'insert contruct namebir repeatdöngü, bir if, switchvb. Gibi bir sonlandırmak için sözdizimini kullanır .

return r-c

Oldukça kendini açıklayıcı.

end g

İşleve son verir g.


Yepyeni bir kullanıcı benim meydan okumaya cevap yazabiliyor mu? Onur duydum +1 ve siteye hoş geldiniz.
wizzwizz4

Bu gönderiyi bir kod açıklaması ve incelemesi ekleyerek geliştirebilirsiniz. (Kodun ne yaptığını, satır satır, kodunuzun altında olduğunu açıklayın.)
wizzwizz4

@ wizzwizz4 Açıklama eklendi.
penalosa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.