세 가지 수열, 고려 A
, B
및 C
:
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 분 이내에 종료되어야합니다.
답변
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 인 경우에만 차이가 중요합니다 . 입력 범위를 확인했는데 결코 발생하지 않으므로 항상 올바른 결과가 반환됩니다.
답변
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)
와우 …).
답변
자바 스크립트 (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.
답변
옥타브, 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
동일한 방식으로 작동하는 i
1 바이트 절약으로 변수 감소num2str(str2num(p(A)))
넌센스 제거 🙂