싫어하는 사람들을 골프


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 는 공감 도의 백분율입니다. 로 돌아올 false수0 있습니다.

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

  • 만일 U> 0 및 U = 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-d및 u = 100 * v/(v + d)V D는 upvotes 및 downvotes 수있는 각각 V 대한. 파생 된 수식은 v = 50에 대해 정의되어 있지 않으므로 해당 경우 (첫 번째 if 문으로 처리)를 처리해야합니다.

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