Nefret dışarı golf


20

Kurulum:

Bir sosyal ağ, bir yayının sahip olduğu oy sayısını iki şekilde bildirir : net upvotes (toplam upvotes - toplam downvotes) ve upvotes olan oyların yüzdesi , en yakın tamsayıya yuvarlandı (.5 mermi). Net upvotes sayısı bir tamsayıdır (mutlaka pozitif değil) ve ikincisinin 0 ile +100 arasında bir tamsayı olduğu garanti edilir. Upvotes ve downvotes hem sıfır hem de pozitif 32 bit tamsayılardır (imzalı veya imzasız belirleyebilirsiniz). Toplam oy toplamı sıfırsa, oylanan yüzde sıfır olarak rapor edilir.

Meydan okuma:

Bu iki tamsayı göz önüne alındığında (net upvotes ve% upvoted), yazabileceğiniz en kısa program nedir ve bu da alınan tüm upvotların en düşük sayısını belirleyerek yukarıdaki tüm kısıtlamaları karşılar mı?

Giriş kısıtlamaları garanti edilir. Giriş yukarıdaki kısıtlamaları karşılamıyorsa, program davranışı size bağlıdır. Sonsuz bir döngü veya başka bir çökme girmezse bonus kudos. Daha fazla rehberlik istiyorsanız negatif bir sayı döndürmeyi düşünün.

Genel kurallar:

  • Bu , bu nedenle (bayt cinsinden ölçülen) en kısa geçerli çözüm kazanır.
  • Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın. Javascript gibi bir istemci tarafı Web dili için bonus kudos.
  • Birden çok dilde ilginç çözümleriniz varsa, bunları ayrı olarak gönderin .
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem, uygun parametreler ve dönüş tipi veya tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan boşluklar yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, lütfen kodun nasıl çalıştığına dair bir açıklama ekleyin.
  • Eğer bir tamsayı bölme işlemini yapıyoruz eğer unutmayın o kesikler (örneğin 20 = 3/6) yerine mermi , o kudreti tam olarak doğru olmayabilir.
  • Yukarıdaki kısıtlamalarda son durumları araştıran ek test senaryoları kabul edilir.
  • Beklenen dönüş türü sayısal olsa da , 0 yerine boole "false" kullanılabilir .

Örnek test örnekleri:

İlk sütun, tartışmayı kolaylaştırmak için dahil edilen bir referans numarasıdır.

ref net  %up    answer
1   0    0   => 0    
2   -5   0   => 0    
3   -4   17  => 1    
4   -3   29  => 2    
5   -2   38  => 3    
6   -1   44  => 4    
7   0    50  => 1    
8   5    100 => 5    
9   4    83  => 5    
10  3    71  => 5    
11  2    63  => 5    
12  1    56  => 5    
13  1234 100 => 1234
14  800  90  => 894  (tip: don't refer to this as the "last test case;" others may be added.)

Sıfır toplam oy özel davası oldukça titiz. Eşit sayıda yukarı ve aşağı oy varsa, yukarı oyların yüzdesi% 50'dir, oylama olmadığında% 0'dır, yukarı oy-aşağı oy simetrisini kırar.
xnor

2
@xnor 0/0 genellikle tanımsızdır, bu nedenle bir varsayım yapılmalıdır. Bu seçenekle, ikinci giriş 0 ise otomatik bir "answer = second input" ve ikinci giriş 100 ise otomatik "answer = first input"
WBT

1
Önerilen test durumu @nwellnhof ödünç: 1000, 100. Beklenen cevabın olduğunu teyit edebilir misiniz 1000?
Arnauld

1
Düşenler nefret etmeli çünkü :)
Hosch250

@Arnauld ve nwellnhof: yorumunuzda sizinkinden hemen önce belirtildiği gibi, ikinci girdi = 100 ise, cevap = ilk girdi. 100 gerçekten biraz daha düşük bir yüzde yuvarlanmışsa, net oy = ilk girdi elde etmek için yukarı oyların ilk girişinden daha fazlası gerekir ve bu meydan okuma en düşük toplam yukarı oy sayısını arar.
WBT

Yanıtlar:


10

JavaScript (ES6), 47 bayt

Currying sözdiziminde girdi alır; (n)(p)burada n , net yukarı oyların sayısı ve p , yukarı oyların yüzdesidir. Döndürebilir falseiçin0 .

n=>p=>(g=u=>u/(u-n/2)*50+.5^p?g(u+1):u)(n>0&&n)

Çevrimiçi deneyin!

Yorumlananlar

n => p => (          // given n and p
  g = u =>           // g = recursive function taking u = number of upvotes
    u / (u - n / 2)  //   compute u / (total_votes / 2)
    * 50 + .5        //   turn it into a percentage, add 1/2
    ^ p ?            //   XOR it with p, which gives 0 if the integer parts are matching
                     //   if the result is not equal to 0:
      g(u + 1)       //     try again with u + 1
    :                //   else:
      u              //     stop recursion and return u
)(n > 0 && n)        // initial call to g() with u = max(0, n)

Edge kutuları

Let F N (u) = u / (u - N / 2) * 50 + 0.5

  • Eğer U = 0 ve n = 0 , daha sonra F N (u) = NaN ve F N (u), XOR p = s . Yani, biz dönmek u = 0 eğer n = p = 0 (İlk test davanın ilk yineleme) ve yineleme eğer devam p! = 0 (7 Test davanın ilk yineleme).

  • Eğer U> 0 ve u = n / 2 , daha sonra F N (u) = + Sonsuz ve - daha - K , n (u), XOR p = s . P = 0 olmadıkça , bir sonraki yinelemeye devam ederiz. (Bu, 9. ve 11. test durumlarında olur.)


Güzel! Dil seçimi ve canlı bir demoya açıklama + bağlantı eklemek için bonus kudos kazanırsınız!
WBT

6

Stax , 17 bayt

ëI╩½• ╠☺Vì∞«S↑♠αS

Çalıştır ve hata ayıkla

Bu kaba kuvvet. Aday upvotes için 0 ile başlar ve formülü karşılayana kadar artar.

Ambalajından çıkarılmış, golf edilmemiş ve yorum yapılmış gibi görünüyor.

0       push zero
{       start filter block...
        candidate upvotes is on the stack
  cHx-  calculate candidate downvotes for denominator (upvotes * 2 - net)
  c1?   if denominator is zero, replace it with 1
  :_    floating point division
  AJ*   multiply by 100
  j     round to integer
  ;=    is equal to second input?
        increment until a match is found
}gs

Bunu çalıştır


2

Temiz , 114 107 104 bayt

import StdEnv
? =toReal o toInt
$a d#e= ?d
= ?a+until(\c#b= ~c*e/(e-100.0)
= ?(?100*b/(?b+c))==e)inc 0.0

Çevrimiçi deneyin!

$ :: Int Int -> RealBağımsız değişkenlerin işaretli tamsayı olduğu ve dönüş değerinin, 32 bit işaretli bir tamsayı ile tam olarak temsil edilebilen çift kesinlikli bir kayan nokta olduğu işlevi tanımlar .

cDenklemin her değerini tatmin edici b=-cd/(d+1)bulmak için kontrol eder ve en küçük sonuçtaki en küçük sonuçlar tüm çözümlerin ilk elemanını alır.ba+c=bb/(b+c)=dcb


2

05AB1E , 13 bayt [hafif kırık]

*²·т-/ò²т;Qi1

Çevrimiçi deneyin!

Açıklama:

Bunu çözmek için, a, b girişleri ve beklenen sonuç x olduğunu varsaydım. Kurulumdaki bilgiler göz önüne alındığında, bana denklemi verdi:

 2x         100x
———— - a = ——————
 a           b

X için yeniden düzenleme

        ab
x = ——————————
     2b - 100

Bunun işe yaramadığı tek test durumu 0, 50 - Bunu kontrol etmek için sadece kodladım.

*²·т-/ò²т;Qi1     Implicit Inputs: a, b              STACK (bottom to top)
*                 Multiply the inputs together       [ab]
 ²·               Take the second input * 2          [ab, 2b]
   т-             Subtract 100                       [ab, 2b - 100]
     /ò           Divide and round                   [round(ab/(2b-100))]
       ²т;Qi1     If 2nd input = 50, push 1 to stack
                  { Implicitly output top item of stack [either 1, or round(...)] }

Bu, bazı girişler için düzgün çalışmıyor. 800 net oy ile% 90, 894 oyla yapılabilir.
özyinelemeli

@recursive Ne olduğunu biliyorum. % 89.5 değil,% 90 olduğunu varsayar.
Geno Racklin Asher

Peki, bu durumda% 90.5'e yakın ama evet.
özyinelemeli

1
Şimdi düşündüğümden daha zor olduğunun farkındayım. Bunu düşüneceğim, ama şimdilik kırılmış olarak işaretleyeceğim.
Geno Racklin Asher

@GenoRacklinAsher Şimdi düşündüğümden daha zor olduğunu anlıyorum. Bunu düşüneceğim ... Okumayı sevdiğim yorum türleri, iyi bir bulmacanın ayırt edici özelliği :-).
WBT

0

1.10, 154 bayt git

func h(n,u float64)float64{if u==50{return 1};r:=Round(n*u/(2*u-100));s:=Round(n*(u+.5)/(2*u-99));v:=s/(2*s-n);if v>1||Round(v*100)!=u{return r};return s}

Go Playground'da deneyin! (TIO, matematik içermeyen Go 1.9'u çalıştırır.

Ungolfed sürümü

func haters(n, u float64) float64 {
    if u == 50 {
        return 1
    }
    r := Round(n * u / (2*u - 100))
    //Test the case where we were given a percentage that was rounded down (e.g. 90.4% given as 90%)
    //We test this by adding 0.5% to u. The denominator is just a simplified form of 2*(u+0.5) - 100
    s := Round(n * (u + .5) / (2*u - 99))
    //Check if s is a valid result
    v := s / (2*s - n)
    if v > 1 || Round(v*100) != u {
        return r
    }
    //s is strictly less than r, so we don't need to check the minimum.
    return s
}

Bir açıklama eklemek için yukarıdaki r formülü, eşzamanlı olarak çözülerek n=v-dve u = 100 * v/(v + d)v için türetilebilir ; burada v ve d, sırasıyla yukarı ve aşağı oy sayısıdır. Türetilmiş formül v = 50 için tanımlanmamıştır, bu nedenle bu durumu ele almalıyız (ilk if ifadesiyle yaptığımız).

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.