C (N) 숫자로 A (N) / B (N)을 계산합니다


15

세 가지 수열, 고려 A, BC:

  • A:로 f(n) = f(n-1)+f(n-2)시작 되는 되풀이 관계를 기반으로하는 시퀀스 입니다 f(1) = 3, f(2) = 4. 따라서 시퀀스는 다음과 같이 시작됩니다.3 4 7 11 18 29 47 76 ...
  • B: 복합 숫자 , 즉 소수 (또는 1)가 아닌 모든 정수 :4 6 8 9 10 12 14 15 16 ...
  • C: Pi의 자릿수 : 3 1 4 1 5 9 2 6 5 ...

양수 감안할 때 N < 50, 함수의 인수 또는 STDIN으로 하나, 소수의 소수 값 반환 A(N)/B(N)C(N)소수점 자리수한다. 반올림에 대한 일반 규칙이 적용됩니다 (N + 1 번째 자릿수가 5 이상인 경우 올림). N 번째 자릿수 pi가 0이면 정수를 인쇄해야합니다. 과학적 표기법 / 표준 형식 은 1000보다 큰 숫자에 허용됩니다.

이것은 코드 골프이므로 바이트 단위의 최단 답변이 이깁니다.

몇 가지 예 :

N = 1: 0.750
N = 2: 0.7
N = 3: 0.8750
N = 4: 1.2
N = 6: 2.416666667
N = 10: 11.056
N = 20: 764.8750

물론 표준 코드 골프 규칙이 적용됩니다.

이 기능은 최신 랩톱에서 2 분 이내에 종료되어야합니다.


C(n)숫자 를 말할 때 뒤에 0을 포함시켜야합니까?
Maltysen

시간 제한은 어느 입력에 적용됩니까?
Dennis

@Dennis, 무슨 뜻 N인가요? 그렇다면 최대 N = 49입니다. 아니면 다른 것입니까?
Stewie Griffin

JavaScript의 부동 소수점 정확도는 16으로 제한되어 있습니다. 과거에 부정확 한 결과가 나옵니다. 괜찮습니까?
Downgoat

1
@vihan My solution (미공개 ATM)은 pi의 처음 49 자리를 문자열로 저장합니다. 그리고 걱정되는 경우 결과에 9 자리 이상의 정확도가 필요하지 않습니다.
ETHproductions

답변:


9

Pyth, 60 57 58 바이트

.[K`.Rchu,eGsGQjT7e.ftPZQ)Je/u+/*GHhyHy^TQr^T3ZZT\0+xK\.hJ

테스트 하니스

그것은 매우 간단합니다-pi, 피보나치 시리즈 및 합성물을 C (n) 자릿수로 반올림하고 C (n) 자릿수로 패드를 더한 소수점 자리의 위치를 ​​계산합니다.

A (n) : hu,eGsGQjT7

B (n) : e.ftPZQ)

C (n) : e/u+/*GHhyHy^TQr99ZZT

60-> 57 : pi 계산에서 n = 1 특수 사례를 정리했습니다.

57-> 58 : 전체 입력 범위에 대해 pi에 대해 충분히 높은 정밀도를 사용하지 않고 99 회 반복을 1000 회 반복으로 증가 시켰습니다.

반올림에 대한 참고 사항 : OP에 지정된 "무한대"시스템 대신 Python의 "가장 고른"반올림 시스템을 사용합니다. 그러나 반올림 지점 바로 뒤에 오는 숫자 5000...가 1 자리로 반올림 된 1.25 인 경우에만 차이가 중요합니다 . 입력 범위를 확인했는데 결코 발생하지 않으므로 항상 올바른 결과가 반환됩니다.


2

PowerShell, 420 바이트 (ayyyyyyyy) 378 바이트

param($n);[int[]]$p="03141592653589793238462643383279502884197169399375"-Split'';$a=@(0,3,4);for($i=3;$i-lt50;$i++){$a+=$a[$i-1]+$a[$i-2]};$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111";$b=@(0);for($i=4;$i-le70;$i++){if($c[$i]-eq'1'){$b+=$i}};[double]$r=$a[$n]/$b[$n];$q=$p[$n+1];$s="";(0..($q-1))|%{$s+="0"};([math]::Round($r,$q,[MidpointRounding]::AwayFromZero)).ToString("0.$s")

질문이 반올림되는 방식을 계산해 41 바이트를 절약 해 준 isaacg 에게 감사드립니다 . 내가 끔찍한 말을 포함 할 [MidpointRounding]::AwayFromZero필요가없고으로 명시 적으로 캐스트 할 필요가 없었 음을 의미합니다 [double].

이것은 큰 재미이었다!

넓히는:

# Take input N
param($n)

# First digits of pi, stored as integer array
[int[]]$p="03141592653589793238462643383279502884197169399375"-Split''

# Fibonacci sequence A(N)
$a=@(0,3,4)
for($i=3;$i-lt50;$i++){
  $a+=$a[$i-1]+$a[$i-2]
}

# Zero-indexed bitmask for if the n-th integer is composite (1) or not (0)
$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111"

# Populate B(N) as an array using the $c mask
$b=@(0)
for($i=4;$i-le70;$i++){
  if($c[$i]-eq'1'){
    $b+=$i
  }
}

# Calculation Time!
$r=(a($n))/$b[$n]

# A small golf, as $p[$n+1] gets used a couple times
$q=$p[$n+1]

# Need to generate a string of zeroes for padding
$s=""
(0..($q-1))|%{$s+="0"}

# Round the number, then send it to a string so we get the necessary number of zeroes
([math]::Round($r,$q)).ToString("0.$s")

PowerShell의 재귀는 느리다. 우리는 말할 것이기 때문에 A(N)다른 방향 을 만들어서 배열에 저장 한 다음 색인해야합니다.


낡은

또한 성스러운 소는 출력 요구 사항으로 인해 이것을 죽였습니다. PowerShell은 기본적으로 반올림-가장 가까운 a / k / 뱅커의 반올림 [MidpointRounding]::AwayFromZero으로 설정 됩니다 . 이렇게 하면 장황한 스타일 을 전환하기 위해 매우 자세한 정보 를 사용해야합니다 . 게다가 우리는 후행 0을 채울 필요가 있습니다. 그 두 가지 요구 사항에서 라인의 마지막 몇 차례 결합하여 20 바이트 [math]::Round($r,$q)102 바이트 (으로부터 $s=""+$s)와우 ...).


훌륭한 설명 / 설명! 32 개 문자 [MidpointRounding]::AwayFromZero만은 사실 거의 너무 / 좋은 나쁜 ... =)
스튜이 그리핀

1
내 대답에서 반올림에 대한 내 메모를 참조하십시오. PowerShell 기본 반올림이 양호해야합니다.
isaacg

1

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

한마디 : 미완성.

x=>{a=[0,3,4],b=[0],c='03141592653589793238462643383279502884197169399375';for(i=1;i<x;a[i+2]=a[i]+a[++i]);for(i=1,p=[];++i<70;v=p.every(x=>i%x),(v?p:b).push(i));r=''+Math.round(a[x]/b[x]*(l=Math.pow(10,c[x])))/l;if(x==33)return r;r.indexOf`.`<0&&(r+='.');while(!r[r.indexOf`.`+ +c[x]])r+='0';return r}

pi의 처음 49 자리 숫자는 문자열에 저장되고 다른 두 시퀀스는 자동 생성됩니다. 이것은 중간 쯤에 골프를 쳤다. 나는 거의 50 바이트를 짜낼 수 있다고 확신합니다.

모든 테스트 케이스에서 작동하며 나머지 테스트에서도 작동합니다. 49보다 크거나 0보다 작은 것은 충돌합니다 (어쨌든 이러한 상황이 발생하지 않아야 함). 나는 특히 0에 대한 결과를 좋아한다.

NaN.

왜 이것이 끝나지 않았습니까?
Beta Decay

@BetaDecay 나는 아직 골프를 마치지 않았다는 것을 의미했다. 시간이있는대로하겠습니다.
ETHproductions

1

옥타브, 276 236 바이트

우선이 수학적 도구에서 무제한 정확도를 사용하고 그것에 대한 지식을 새로 고치는 것이 멋지다고 생각했기 때문에 알고리즘을 작성하기 시작한 후 마침내 그 pi값이 너무 정확하지 않다는 것을 알게되었습니다. 배열을 다시 사용해야합니다. 다시 한번, 큰 성공은 없습니다 :

function c(A)p="3141592653589793238462643383279502884197169399375";f=ones (1,50);f(1)=3;f(2)=4;for i=3:53f(i)=f(i-1)+f(i-2);end
i=0;x=1;while i<A
x++;for j=2:x/2
if mod(x,j)==0 i++;break;end end end
printf(["%." p(A) "f\n"],f(A)/x);end

여전히 읽을 수 있는가?

용법

함수를 옥타브에 복사-붙여 넣기, c필요한 값의 인수로 함수 호출 :

>>> c(1)
0.750
>>> c(49)
407880480.04348

최적화 :

  • 대체 endif, endfor와 유사한 end동일한 방식으로 작동하는
  • i1 바이트 절약으로 변수 감소
  • num2str(str2num(p(A)))넌센스 제거 :)

나는 당신이 Octave 솔루션을 게시 한 것을 좋아합니다 (나는 MATLAB 사람입니다!). 이 코드는 MATLAB이 아니라 옥타브 전용입니다. MATLAB은을 (를) 사용 end하지 endif않으므로 많은 바이트가 저장되었습니다. MATLAB 용 기호 도구 상자가있는 vpa경우 pi :에 대한 충분한 소수점을 얻는 데 사용할 수 있습니다 vpa(sym(pi),49). 나는이 노트북에 그것을 가지고 있지 않기 때문에 sym거기에 필요한지 확실하지 않지만 어쨌든 꽤 많은 바이트를 절약해야합니다 =) 그리고 읽기 쉬운 코드 골프에서 반드시 좋은 것은 아닙니다 =)
Stewie Griffin

x ++도 MATLAB 명령이 아닙니다. 나는 둘 사이에 그렇게 큰 차이가 있다는 것을 몰랐다 ... IMO. 옥타브로 작성된 모든 코드는 MATLAB으로 이식 가능해야한다고 생각하지만 MATLAB에는 더 많은 옵션이 있으므로 반드시 다른 방법은 아닙니다.
Stewie Griffin

수정 사항을 승인했습니다. 여기에 matlab이 없으므로 테스트 할 수 없었습니다. 옥타브에서 더 많은 10 진수를 얻는 솔루션을 찾고 있었지만 불행히도 배열보다 짧지는 않았습니다. 그러나 ommiting while에서 endwhile내가 :) 몇 적은 문자로 답을 갱신하고있어, 그래서 벌금과 유사한 작품
Jakuje
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.