설정:
소셜 네트워크는 게시물이 두 가지 방식으로보고합니다. 순 공감 수 (총 공감 수-총 공감 수)와 공감 율이 높은 투표 수 (% ) 는 가장 가까운 정수 (.5 반올림)입니다. net upvotes의 수는 정수 (양수일 필요는 없음)이며 두 번째는 0과 +100 사이의 정수 여야합니다. 업 보트 수와 다운 보트 수는 모두 0 또는 양의 32 비트 정수입니다 (부호 또는 부호 없음을 지정할 수 있음). 총 투표 수가 0 인 경우 공표 된 백분율이 0으로보고된다고 가정하십시오.
도전 과제 :
이 두 정수 (net upvotes 및 % upvoted)가 주어지면, 위의 모든 제약 조건을 충족하면서 게시물을받은 총 upvotes 의 가장 적은 수를 결정하는 가장 짧은 프로그램은 무엇 입니까?
입력 제약 조건이 보장됩니다. 입력이 위의 제약 조건을 만족하지 않으면 프로그램 동작은 사용자의 몫입니다. 무한 루프에 들어 가지 않거나 충돌하는 경우 보너스 kudos. 더 자세한 안내가 필요하면 음수를 반환하십시오.
일반적인 규칙:
- 이것은 code-golf 이므로 가장 짧은 유효한 솔루션 (바이트 단위로 측정)이 이깁니다.
- 코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하지 마십시오. ‘모든’프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오. 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 는 공감 도의 백분율입니다. 로 돌아올 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 번째 테스트 사례에서 발생합니다.)
답변
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-d
및 u = 100 * v/(v + d)
V D는 upvotes 및 downvotes 수있는 각각 V 대한. 파생 된 수식은 v = 50에 대해 정의되어 있지 않으므로 해당 경우 (첫 번째 if 문으로 처리)를 처리해야합니다.