싫어하는 사람들을 골프


20

설정:

소셜 네트워크는 게시물이 두 가지 방식으로보고합니다. 순 공감 수 (총 공감 수-총 공감 수)와 공감 율이 높은 투표 수 (% ) 는 가장 가까운 정수 (.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.)

그 총 투표 제로 특별한 경우는 매우 까다 롭습니다. 동일한 투표 수와 공감 수가있는 경우 투표가 없을 때 0 %를 제외하고 공감 비-다운 보트 대칭을 깨는 비율을 제외하고 백분율 공감 율은 50 %입니다.
xnor

2
@xnor 0/0은 일반적으로 정의되어 있지 않으므로 가정해야합니다. 이 옵션을 선택하면 두 번째 입력이 0이면 자동 "응답 = 두 번째 입력", 두 번째 입력이 100이면 자동 "응답 = 첫 번째 입력"이 표시됩니다.
WBT

1
@nwellnhof에서 빌린 제안 된 테스트 케이스 : 1000, 100. 예상 답변이임을 확인할 수 있습니까 1000?
Arnauld

1
싫어하는 사람들이 싫어하기 때문에 Downvoted :)
Hosch250

@ Arnauld 및 nwellnhof : 두 번째 입력 = 100이면 답변 = 첫 번째 입력 인 주석 바로 앞에 언급 된 것처럼. 100이 실제로 약간 낮은 비율로 반올림 된 경우, 순 투표 수 = 첫 번째 입력을 얻으려면 첫 번째 입력 투표 수보다 많은 수의 투표가 필요하며이 도전 과제는 가장 적은 총 투표 수를 찾습니다.
WBT

답변:


10

자바 스크립트 (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 번째 테스트 사례에서 발생합니다.)


좋은! 언어를 선택하고 라이브 데모에 대한 설명 + 링크를 포함하여 보너스 칭찬을받습니다!
WBT

6

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

이것을 실행


2

면도 , 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, 모든 솔루션 세트의 첫 번째 요소를 가지고.


2

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(...)] }

일부 입력에서는 제대로 작동하지 않습니다. 800 개의 순 투표로 90 %가 894 개의 최대 투표로 완료 될 수 있습니다.
재귀

@ 재귀 나는 그것이 무엇인지 안다. 정확히 89.5 %가 아니라 90 %로 가정합니다.
Geno Racklin Asher

이 경우 90.5 %에 가깝지만 그렇습니다.
재귀

1
이제 생각보다 까다 롭습니다. 나는 그것에 대해 생각할 것이지만, 지금은 그것을 깨진 것으로 표시 할 것이다.
Geno Racklin Asher

@GenoRacklinAsher 이제 생각보다 까다 롭습니다. 나는 그것에 대해 생각할 것이다 ... 그것들은 내가 좋아하는 종류의 주석이며, 그것들을 좋은 퍼즐의 특징으로 본다 :-).
WBT

0

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 문으로 처리)를 처리해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.