파스칼의 마름모


20

Pascal의 Rhombus (실제 삼각형)는 패턴을 추가하여 얻습니다.

  *
 ***
  x

대신에

* *
 x

즉, 각 셀은 바로 위의 행에있는 세 개의 셀과 그 위의 행 2에있는 하나의 셀의 합입니다. 파스칼의 삼각형처럼, 0 번째 줄에는 1삼각형을 생성 하는 단일 행이 있습니다.

파스칼 마름모의 첫 두 줄

      1
    1 1 1
  1 2 4 2 1
1 3 8 9 8 3 1

태스크

행 번호 (위에서 시작)와 열 번호 (해당 행의 0이 아닌 첫 번째 항목에서 시작)가 지정된 특정 셀의 값을 출력합니다. 두 입력 모두 1 또는 0 색인이 될 수 있습니다 (원하는 경우 혼합하여 일치시킬 수 있음).

이것은 이므로 소스 코드의 파일 크기를 가능한 작게 만드는 것을 목표로해야합니다.

OEIS A059317


4
파스칼의 삼각형과 마찬가지로 마름모의 패리티는 멋지고 프랙탈 패턴을 만듭니다.
Martin Ender

소스 코드의 파일 크기를 가능한 작게 만드는 것을 목표로해야합니다. 코드를 명령 줄 인수로 사용하면 어떻게됩니까? : P
Outgolfer Erik

바로 가기를 위해 인터넷 검색을했으며 분명히 arxiv.org/abs/1504.04404에 따르면 결과를 직접 계산하는 것은 코드 골프에는 사용할 수 없습니다.
JollyJoker

답변:


12

하스켈 , 59 55 바이트

파스칼의 마름모? Haskell의 Rhombus와 비슷합니다! 맞습니까?

Ørjan Johansen 덕분에 4 바이트 절약

나는 내 문제를 해결하고 하스켈을 연습 할 것이라고 생각했다. 잘하면 이것은 더 많은 사람들이 이것에 대답하도록 영감을 줄 것입니다.

1!1=1
n!k=sum[(n-2)!(k-2)+sum(map((n-1)!)[k-2..k])|n>1]

온라인으로 사용해보십시오!

설명

이것은 최신 골프와 약간 오래된 것입니다

계산하는 대신

  *
 ***
  x

우리는 계산

*
***
  x

이것은 우리의 삼각형 전체가

1
1 1 1
1 2 4 2 1
1 3 8 9 8 3 1

이렇게하면 모든 행이 정렬되어 열의 n 번째 항목을 쉽게 색인 할 수 있습니다. 그런 다음 기본 사례를 정의합니다.

0 번째 줄은 모두 0이므로

0!_=0

1위치에 단일 이 1,1있으므로

1!1=1

그리고 첫 번째 행의 나머지도 0으로 정의합니다

1!_=0

그런 다음 위에서 설명한 패턴을 사용하여 일반적인 경우를 재귀 적으로 정의합니다.

n!k=(n-2)!(k-2)+(sum$map((n-1)!)[k-2..k])

날 이길! 이것은 또한 내 것보다 훨씬 깨끗합니다.
Julian Wolf

@JulianWolf 죄송합니다.이 글을 올렸을 때 Jorg가 다른 사람처럼 보이지 않았습니다. 여전히 솔루션을보고 싶습니다.
밀 마법사

1
을 사용하여 4 바이트를 저장할 수 있습니다 n!k=sum[(n-2)!(k-2)+sum(map((n-1)!)[k-2..k])|n>1].
Ørjan Johansen

10

파스칼 , 122 바이트

음, 그건 파스칼의 마름모.

@manatwork 덕분에 37 바이트 절약

function f(n,k:integer):integer;begin f:=1-Ord((k<0)or(k>n*2));if n>0then f:=f(n-1,k-2)+f(n-1,k-1)+f(n-1,k)+f(n-2,k-2)end;

온라인으로 사용해보십시오!


전체 if조건 에 대한 괄호 는 의미가 없습니다. (첫 번째 에는 키워드와 앞자리 사이에 공백을 두지 않고 if두 번째 if1 문자 에 2자를 저장합니다 then.) 아, 변수 r은 완전히 필요하지 않습니다.
manatwork

Ideone에 파스칼이있는 이상한 동물. 이전에 파스칼 변형에서 큰 따옴표로 구분 된 문자열을 본 적이 없습니다. 당신은 제거 할 수있는 한 가지 더 다음 ;전과 functionend.
manatwork

@manatwork 그래, 이제 언급했을 때 다른 모든 온라인 편집자들이 그것에 대해 불평했다
Uriel

@manatwork 확실하지 않습니다. 으로 코드를 길게 만들지 >= <=않겠습니까? 나는 여전히 보존해야합니다if n=0
Uriel

죄송합니다 @Uriel, 더 이상 해당 버전이 없습니다. 현재 저는function f(n,k:integer):integer;begin f:=1-Ord((k<0)or(k>n*2));if n>0then f:=f(n-1,k-2)+f(n-1,k-1)+f(n-1,k)+f(n-2,k-2)end;
manatwork

7

PHP , 86 바이트

재귀 방식으로 함수 행과 열만 인덱스 됨

function f($r,$c){return$r|$c?$r<0?0:f($r-=1,$c)+f($r,$c-1)+f($r,$c-=2)+f($r-1,$c):1;}

온라인으로 사용해보십시오!

PHP , 114 바이트

재귀 방식 전체 프로그램 행 및 열 0- 색인

<?=f(...$_GET);function f($r,$c){return$r|$c?$r<0|$c<0|$c>2*$r?0:f($r-=1,$c)+f($r,$c-1)+f($r,$c-=2)+f($r-1,$c):1;}

온라인으로 사용해보십시오!

PHP , 129 바이트

행 및 열 0- 색인

for(;$r<=$argv[1];$l=$t[+$r++])for($c=~0;$c++<$r*2;)$t[+$r][$c]=$r|$c?$t[$r-2][$c-2]+$l[$c]+$l[$c-1]+$l[$c-2]:1;echo$l[$argv[2]];

온라인으로 사용해보십시오!


실제로 향상시키기 위해 +1 :)
Uriel


3

MATL , 22 20 19 바이트

Ti:"2Y6Y+FT_Y)]!i_)

두 입력 모두 0 기반입니다.

온라인으로 사용해보십시오!

설명

하자 rc각각 0 기반의 행과 열을 지정하는 두 개의 입력을 나타낸다.

파스칼의 마름모의 각 새 행에 의해 이전의 두 행을 포함하는 행렬로부터 만들어 질 수 컨볼 루션 커널과 [1 1 1; 0 1 0]및 교환 결과의 마지막 두 행을 유지. 이것은 rmatrix에서 시작하여 수행됩니다 1.

[0 1 0; 1 1 1; 0 1 0]사전 정의 된 리터럴 인 kernel을 사용하는 것이 더 짧습니다 . 이것은 추가 행을 생성하여 버려집니다.

예를 들어 고려 r = 3, 그래서 거기에 3반복은.

  1. 에서 출발

    1
    

    회선으로는 [0 1 0; 1 1 1; 0 1 0]제공

    0 1 0
    1 1 1
    0 1 0
    

    마지막 두 행 (이 경우 전체 행렬)을 유지하고 바꾸면

    0 1 0
    1 1 1
    
  2. 와 위의 컨볼 루션을 [0 1 0; 1 1 1; 0 1 0]제공합니다

    0 0 1 0 0
    0 1 1 1 0
    1 2 4 2 1
    0 1 1 1 0
    

    마지막 두 행으로 교체 된 행렬은

    0 1 1 1 0
    1 2 4 2 1
    

    여기에는 맨 아래에 새 행이 포함되고 앞 행은 0으로 확장됩니다.

  3. 다시 수익을 올리다

    0 0 1 1 1 0 0
    0 1 2 3 2 1 0
    1 3 8 9 8 3 1
    0 1 2 4 2 1 0
    

    마지막 두 행을 바꾸면

    0 1 2 4 2 1 0
    1 3 8 9 8 3 1
    

r반복이 완료된 후 출력은 최종 행렬의 마지막 행에 포함됩니다. 예를 들어 c = 2(0 기반)의 경우 결과는입니다 8. 마지막 행과 원하는 열을 인덱싱하는 대신 각 행 의 대칭 을 활용하는 트릭을 사용할 수 있습니다 . 최종 행렬이 바뀝니다.

0 1
1 3
2 8
4 9
2 8
1 3
0 1

- -c번째 요소가 취해집니다. 선형 인덱싱을 사용합니다. 즉, 행렬은 단일 인덱스열 주요 순서로 인덱스 됩니다 . 인덱싱이므로 모듈0-entry은 오른쪽 아래 (값 1) 및 -2번째 엔트리 (값보다 두 단계이다 8).

T       % Push true
i       % Input row number
:"      % Do the following that many times
  2Y6   %   Push predefined literal [0 1 0; 1 1 1; 0 1 0]
  Y+    %   2D convolution, increasing size
  FT_   %   Push [0 -1]
  Y)    %   Matrix with rows 0 (last) and -1 (second-last), in that order
]       % End
!       % Transpose
i       % Input: colun number
_       % Negate
)       % Entry with that index. Implicitly display



2

매스 매 티카, 56 바이트

If[#<1,Boole[##==0],Sum[#0[#-i,#2-j],{i,2},{j,2i-2,2}]]&

순수 함수는 두 개의 정수 인수 (행 첫 번째, 열 두 번째)를 사용하여 정수를 리턴합니다. 음의 정수 인수에도 적용되며을 반환 0합니다. 매우 간단한 재귀 구조 : 재귀 정의 If[#<1,Boole[##==0],...]Sum[#0[#-i,#2-j],{i,2},{j,2i-2,2}]구현하는 동안 0 번째 행 이상에 대한 기본 사례 동작을 정의합니다.



1

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

f=(y,x)=>x<0|x>y+y?0:x>0&x<y+y?f(--y,x)+f(y,--x)+f(y,--x)+f(--y,x):1

1

수학, 53 바이트

D[1/(1-x(1+y+y^2(1+x))),{x,#},{y,#2}]/#!/#2!/.x|y->0&

생성 기능 사용.


0

파이썬 3 , 82 84 바이트

이것은 1 인덱싱 된 행과 열을 사용한 재귀 구현입니다. (기술적으로는f= 으로 앞이 . 누군가 84 바이트로 변경 해야하는지 알려주십시오. 여전히 새 규칙이며 100 % 확실하지는 않습니다.)

이것은 OEIS 페이지 에있는 재귀 공식을 사용 하지만 k의 줄이 왼쪽으로 올바로 정렬되도록합니다. 우연히도 sum(f(n-1,k-i)for i in(0,1,2))와 같은 크기 f(n-1,k)+f(n-1,k-1)+f(n-1,k-2)입니다. 전체 기능 파이썬이고 and ork는 삼각형 내부에있는 경우 상기 제 조건 검사 트릭 아닌 경계가되는 경우에 재귀 공식이 사용된다. 없는 경우, 이후의 부분은 or경우 어떤 검사를 반환 k(1, 2*n-1)반환, 경계에 즉, TrueFalse. k+1in(2,2*n)보다 1 바이트 짧습니다 k in(1,2*n-1). 괄호로 묶고 +앞에 배치하면 정수로 변환되어 필요한 것입니다.

f=lambda n,k:2*n-1>k>1and sum(f(n-1,k-i)for i in(0,1,2))+f(n-2,k-2)or+(k+1in(2,2*n))

온라인으로 사용해보십시오!


재귀 함수에는 f=.
밀 마법사

다소 묻힌 메타 합의 에 따라 개인적으로 동의하지 않지만 파이썬 처럼 행동하기 때문에 True대신 출력 할 수 있습니다 . 이렇게하면 끝 부분 을 제거 할 수 있습니다 . 출력을 조금 이상하게 보이기 때문에 옵션이기 때문에 이것을 원하지 않으면 이해합니다. 11+(...)
밀 마법사

@WheatWizard 와우 정말 흥미 롭습니다. 팁 고마워.
C McAvoy


0

파이썬 3 , 75 바이트

이것은 열과 행을 0 인덱싱 된 정수로 취하는 재귀 람다입니다.

p=lambda r,c:(r<0 or((c==0)|p(r-1,c-2)+p(r-1,c)+p(r-1,c-1)+p(r-2,c-2))+1)-1

다음은 인쇄 기능을 갖춘 (약간) 더 읽기 쉬운 버전입니다.

p = lambda r,c:(r<0 or ((c==0) | p(r-1,c-2)+p(r-1,c)+p(r-1,c-1)+p(r-2,c-2))+1)-1

def pp(r):
    ml = len(str(p(r,r)))+1
    for i in range(0, r):
            a=" "*ml*(r-i)
            for j in range(0,i*2 + 1):
                    a+=str(p(i,j))+(" "*(ml-len(str(p(i,j)))))
            print(a)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.