분수를 계산


17

분수 각 경화가 아래 행 개의 동전 접촉 또는 하단 행이고, 하단 행이 접속되도록 행 동전의 구성도이다. 여기 21 개의 동전 분수대가 있습니다 :

http://mathworld.wolfram.com/Fountain.html에서


당신의 도전은 주어진 수의 동전으로 얼마나 많은 다른 분수를 만들 수 있는지 세는 것입니다.

양의 정수를 입력으로 제공합니다 n. n존재하는 서로 다른 동전 분수 의 수를 출력해야 합니다.

표준 I / O 규칙, 표준 허점은 금지되어 있습니다. 솔루션은 n = 101 분 안에 계산할 수 있어야합니다 .


원하는 출력 n = 1 ... 10:

1, 1, 2, 3, 5, 9, 15, 26, 45, 78

이 순서는 OEIS A005169 입니다.


이것은 코드 골프입니다. 가장 적은 바이트가 이깁니다.


가 있는가 n하는 프로그램이 작업을 보장해야합니까? (즉, 그 이후에 깨질 수 있음)
퀴 토피아

@quintopia n데이터 유형, 하드웨어 등의 한계까지 모두 작동해야합니다 .
isaacg

답변:


3

파이썬, 57 바이트

f=lambda n,i=0:sum(f(n-j,j)for j in range(1,i+2)[:n])or 1

OEIS 에서 관찰 한 것처럼 각 행을 그 아래 행에 대해 반씩 이동하면 열 크기는 양의 정수 시퀀스를 형성하며 최대 상향 단계는 1입니다.

이 함수 f(n,i)는 합 n과 마지막 수로 시퀀스를 계산합니다 i. 이러한 재귀에서 다음 열 크기의 각각의 선택에 대해 합산 될 수 1까지 i+1이다 range(1,i+2). 잘라내 기는 range(1,i+2)[:n]열이 남아있는 것보다 많은 동전을 사용하지 못하도록하여 음수를 n줄 필요가 없습니다 0. 또한 빈 합계는 0되풀이되지 않고 명시적인 경우를 피 하지만 대신 (와 같이 ) 충분 f(0)하도록 1대신 설정해야합니다 .or 1+0**n


Pyth 17 바이트 :M|sgL-Gd<ShHG1gQ0
isaacg

5

Mathematica, 59 바이트

SeriesCoefficient[1-Fold[1-x^#2/#&,Range[#,0,-1]],{x,0,#}]&

Jean-François Alcover의 OEIS Mathematica 프로그램을 기반으로합니다.


이것을 수식으로 다시 쓸 수 있습니까 (방금 찾은 수식과 비교하고 싶습니다)? 난 그냥 Mathematica =)를 읽을 수 없습니다
flawr

@flawr 시퀀스의 생성 함수는 1/(1-x/(1-x^2/(1-x^3/(1-x^4/(1-x^5/(...))))))입니다.
alephalpha

설명해 주셔서 감사합니다. 강력한 CAS를 보유하고 있다면 정말 좋은 방법입니다.)
flawr

3

하스켈, 60 48 바이트

더 짧은 솔루션을 제공 한 @nimi에게 감사합니다!

n#p|p>n=0|p<n=sum$map((n-p)#)[1..p+1]|1<2=1
(#1)

구 버전.

t n p|p>n=0|p==n=1|p<n=sum[t (n-q) q|q<-[1..p+1]]
s n=t n 1

값을 계산하는 함수는 https://oeis.org/A005169s 에서 찾을 수있는 재귀 수식의 구현입니다.


버그 : 재귀 호출은 t (n-p) q입니다. 골프 팁 :에 대해 중위 연산자를 t사용하고 가드를 교체 한 map다음 목록 이해 대신 사용 하십시오 n#p|p>n=0|p<n=sum$map((n-p)#)[1..p+1]|1<2=1. ss=(#1)이지만 주 함수에 이름을 지정할 필요는 없으므로 (#1)충분합니다. 48 바이트
nimi

힌트 주셔서 대단히 감사합니다! 방금 Haskell의 기초를 배우기 시작했습니다. 사용법 #$여기에서 first =) 사용법에 대해 배워야합니다.
flawr

설명의 조금 : #그냥 같은 사용자 정의 중위 함수이고 +, *중위 함수를 미리 정의 등. $우선 순위를 조정하는 또 다른 방법입니다 (괄호 제외) f (g (h x))-> f$g$h x또는 우리의 경우 sum(map(...)[...])-> sum$map(...)[...].
nimi

감사합니다. 알기에 매우 유용합니다. 설명해 주셔서 감사합니다.
flawr

3

하스켈, 43 바이트

n%i=sum[(n-j)%j|j<-take n[1..i+1]]+0^n
(%0)

설명 은 Python 답변 을 참조하십시오 .

다음이 min아닌 동일한 길이 take:

n%i=sum[(n-j)%j|j<-[1..min(i+1)n]]+0^n
(%0)


1

Matlab, 115105 바이트

function F=t(n,varargin);p=1;if nargin>1;p=varargin{1};end;F=p==n;if p<n;for q=1:p+1;F=F+t(n-p,q);end;end

https://oeis.org/A005169 에서 찾을 수있는 재귀 공식의 구현

function F=t(n,varargin);
p=1;
if nargin>1
    p=varargin{1};
end;
F=p==n;
if p<n;
    for q=1:p+1;
        F=F+t(n-p,q);
    end;
end;

1

줄리아, 44 43 바이트

f(a,b=1)=a>b?sum(i->f(a-b,i),1:b+1):1(a==b)

OEIS에서 재귀 수식을 사용합니다.

설명

function f(a, b=1)
    if a > b
        # Sum of recursing
        sum(i -> f(a-b, i), 1:b+1)
    else
        # Convert bool to integer
        1 * (a == b)
    end
end

44를 통한 파업은 규칙적인 44라는 것을 다른 사람이 알았습니까?


0

파이썬 3, 88 바이트

f=lambda n,p:sum([f(n-p,q)for q in range(1,p+2)])if p<n else int(p==n)
t=lambda n:f(n,1)

0

자바 스크립트 (ES6), 63

OEIS 페이지에서 재귀 수식 구현

F=(n,p=1,t=0,q=0)=>p<n?eval("for(;q++<=p;)t+=F(n-p,q)"):p>n?0:1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.