싫어하는 사람들을 골프 비트 정수입니다 (부호 또는 부호 없음을

설정:

소셜 네트워크는 게시물이 두 가지 방식으로보고합니다. 순 공감 수 (총 공감 수-총 공감 수)와 공감 율이 높은 투표 수 (% ) 는 가장 가까운 정수 (.5 반올림)입니다. net upvotes의 수는 정수 (양수일 필요는 없음)이며 두 번째는 0과 +100 사이의 정수 여야합니다. 업 보트 수와 다운 보트 수는 모두 0 또는 양의 32 비트 정수입니다 (부호 또는 부호 없음을 지정할 수 있음). 총 투표 수가 0 인 경우 공표 된 백분율이 0으로보고된다고 가정하십시오.

도전 과제 :

이 두 정수 (net upvotes 및 % upvoted)가 주어지면, 위의 모든 제약 조건을 충족하면서 게시물을받은 총 upvotes 의 가장 적은 수를 결정하는 가장 짧은 프로그램은 무엇 입니까?

입력 제약 조건이 보장됩니다. 입력이 위의 제약 조건을 만족하지 않으면 프로그램 동작은 사용자의 몫입니다. 무한 루프에 들어 가지 않거나 충돌하는 경우 보너스 kudos. 더 자세한 안내가 필요하면 음수를 반환하십시오.

일반적인 규칙:

  • 이것은 이므로 가장 짧은 유효한 솔루션 (바이트 단위로 측정)이 이깁니다.
  • 코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하지 마십시오. ‘모든’프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오. Javascript와 같은 클라이언트 측 웹 언어에 대한 보너스 제안.
  • 여러 언어로 흥미로운 솔루션이있는 경우 별도로 게시하십시오 .
  • 표준 규칙이 답변에 적용 되므로 STDIN / STDOUT, 함수 / 방법을 적절한 매개 변수 및 리턴 유형 또는 전체 프로그램과 함께 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트 링크를 추가하십시오.
  • 또한 코드 작동 방식에 대한 설명을 추가하십시오.
  • rounds 보다는 잘리는 정수 나누기 연산 (예 : 20 / 3 = 6)을 수행하는 경우 에는 완전히 정확하지 않을 수 있습니다.
  • 위의 제약 조건에서 에지 사례를 탐색하는 추가 테스트 사례를 환영합니다.
  • 예상되는 반환 유형은 숫자이지만 0 대신 부울 “false”를 사용할 수 있습니다 .

테스트 사례 예 :

첫 번째 열은 토론을 용이하게하기 위해 포함 된 참조 번호 일뿐입니다.

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


답변

자바 스크립트 (ES6), 47 바이트

카레 구문으로 입력을 받습니다. (n)(p)여기서 n 은 순 공감 수의 수이고 p 는 공감 도의 백분율입니다. 로 돌아올 false0 있습니다.

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

온라인으로 사용해보십시오!

댓글

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)

가장자리 케이스

하자 F N (U) = U / (U – N / 2) * 50 + 0.5

  • 경우 U = 0N = 0 , 다음, F , N (U) = NaN이F N (U) XOR p = 쪽 . 따라서 n = p = 0 (첫 번째 테스트 사례의 첫 번째 반복) 인 경우 u = 0 을 반환 하거나 p! = 0 (세 번째 테스트 사례의 첫 번째 반복) 인 경우 재귀를 계속합니다 .

  • 만일 U> 0U = N / 2 다음 F N (U) = + 무한대 및 – 다시 – F N (U) XOR p = P . p = 0이 아니라면 다음 반복으로 넘어갑니다. (이는 9 번째와 11 번째 테스트 사례에서 발생합니다.)


답변

Stax , 17 바이트

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

실행 및 디버깅

이것은 무차별적인 힘입니다. 후보 upvotes의 경우 0으로 시작하고 수식을 충족 할 때까지 증가합니다.

포장을 풀고 포장을 풀고 주석을 달았습니다.

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

이것을 실행


답변

면도 , 114 (107) 104 바이트

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

온라인으로 사용해보십시오!

$ :: Int Int -> Real인수가 부호있는 정수이고 반환 값이 32 비트 부호있는 정수로 정확하게 표현할 수있는 배정 밀도 부동 소수점 인 함수를 정의합니다 .

그것은 모든 값을 확인 c식에서 b=-cd/(d+1)찾을 b만족 a+c=b하고 b/(b+c)=d최소 때문에c 작은 결과 b, 모든 솔루션 세트의 첫 번째 요소를 가지고.


답변

05AB1E , 13 바이트 [약간 깨짐]

*²·т-/ò²т;Qi1

온라인으로 사용해보십시오!

설명:

이 문제를 해결하기 위해 입력 a, b 및 예상 결과 x를 가정했습니다. 설정 정보가 주어지면 방정식을 얻었습니다.

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

x에 대한 재정렬

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

이것이 작동하지 않는 유일한 테스트 사례는 0, 50입니다. 간단히 확인하기 위해 하드 코딩했습니다.

*²·т-/ò²т;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(...)] }

답변

1.10, 154 바이트로 이동

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에서 사용해보십시오! (TIO는 수학 1.Round가없는 Go 1.9를 실행합니다)

언 골프 버전

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
}

설명을 추가의 이익에있어서, R에 대한 상기 식을 동시에 해결함으로써 도출 될 수 n=v-du = 100 * v/(v + d)V D는 upvotes 및 downvotes 수있는 각각 V 대한. 파생 된 수식은 v = 50에 대해 정의되어 있지 않으므로 해당 경우 (첫 번째 if 문으로 처리)를 처리해야합니다.