입력 n이 주어지면 n 번째 Narayana-Zidek-Capell 수를 생성하십시오 . 가장 적은 바이트가 이깁니다.
f (1) = 1, f (n)은 이전 층 (n / 2) Narayana-Zidek-Capell 항의 합계입니다.
테스트 사례 :
f(1)=1
f(9)=42
f(14)=1308
f(15)=2605
f(23)=664299
입력 n이 주어지면 n 번째 Narayana-Zidek-Capell 수를 생성하십시오 . 가장 적은 바이트가 이깁니다.
f (1) = 1, f (n)은 이전 층 (n / 2) Narayana-Zidek-Capell 항의 합계입니다.
테스트 사례 :
f(1)=1
f(9)=42
f(14)=1308
f(15)=2605
f(23)=664299
답변:
HĊrµṖ߀Sȯ1
n
인수로 취하여 결과를 인쇄합니다.
H divide input by 2
Ċ round up to get first n to recurse
r inclusive range from that to n
µ (chain separator)
Ṗ remove n itself from the range
߀ call self recursively on each value in the range
S sum results
ȯ1 if sum was zero, return one
Narayana-Zidek-Cappell 숫자에 대한 OEIS 페이지의 수식을 사용 합니다 .
편집 : feersum과 Neil 덕분에 연산자 우선 순위를 사용하여 괄호를 제거했습니다.
f=->x{x<4?1:2*f[x-1]-x%2*f[x/2]}
x%2
않습니까?
x%2*
적어도 넣어도 아닙니다 .
x<2?
... 이라고 제안했습니다. 이것은 훨씬 명확하게 감사합니다!
OEIS 페이지에서 가져온 알고리즘. 아무런 영향없이 n<3
변경 될 수 있습니다 n<4
. 양의 정수인 n
th 수를 리턴합니다 n
.
a=lambda n:n<3or 2*a(n-1)-n%2*a(n/2)
05AB1E와 같은 반복 솔루션에는 기능이 없습니다.
X¸sGDN>;ï£Os‚˜}¬
X¸ # initialize a list with 1
sG } # input-1 number of times do
D # duplicate current list
N>;ï£ # take n/2 elements from the list
O # sum those elements
s‚˜ # add at the start of the list
¬ # get the first element and implicitly print
OEIS 알고리즘의 번역. 여기에는 C 코드가 충분하지 않습니다!
f(n){return n<3?:2*f(n-1)-n%2*f(n/2);}
n<3?:(...)
작동합니까?
def f(n):
x=1,
for i in range(n):x+=sum(x[-i//2:]),
print(x[-1])
인수를 통해 입력을 받아 STDOUT에 인쇄하는 함수입니다. 이것은 정의를 직접 구현 한 것입니다.
작동 원리
def f(n): Function with input target term index n
x=1, Initialise term list x as tuple (1)
for i in range(n):... For all term indices in [0,n-1]...
x[-i//2:] ..yield the previous floor(i/2) terms...
x+=sum(...) ...and append their sum to x
print(x[-1]) Print the last term in x, which is the nth term
L|syM>/b2Ub1
Narayana-Zidek-Capell-number y(n)
를 반환 하는 함수 를 정의합니다 n
.
If[#<4,1,2#0[#-1]-#~Mod~2#0[(#-1)/2]]&
익명의 기능. 𝑛를 입력으로 사용하고 𝑓 (𝑛)을 출력으로 반환합니다. Ruby 솔루션을 기반으로합니다.
이것은 재귀없는 전체 프로그램입니다. 재귀 함수는 52 바이트로 정의 할 수 있지만 (이를 능가 할 수는 있지만) sherlock9의 대답의 지루한 포트 일뿐입니다 (그리고 f (100) 이상을 요구하면 오류가 발생합니다). 더 길고 재미있는 버전
<?php for($i=$argv[1];$j=$i;$i--)for(;--$j*2>=$i;)$a[$j]+=$a[$i]?:1;echo$a[1]?:1;
많은 (O [n]) 통지를 유발하지만 괜찮습니다.
O(n)
통지? 응?
f=n=>Math.round(n<3?1:2*f(n-1)-n%2*f(parseInt(n/2)))
C 답변을 기반으로합니다 .
parseInt
대신 에 사용하여 2 바이트 절약Math.floor