파스칼의 교대 삼각형


21

파스칼의 삼각형1각 행이 연속적인 덧셈 으로 시작하여 시작함으로써 생성됩니다 . 대신 곱셈과 덧셈을 번갈아 가면서 삼각형을 만들겠습니다.

우리 1는 독방으로 행 을 시작합니다 1. 그 후, 홀수 행에 가산이 행해지고 짝수 행에 대해 곱셈이 수행됩니다 (1 인덱스). 덧셈 단계를 수행 할 때 삼각형 외부의 공백이 0s 로 채워져 있다고 가정합니다 . 곱셈 단계를 수행 할 때 외부에 1s 가 채워져 있다고 가정합니다 .

여기에 7 행까지의 전체 삼각형이 있습니다. *또는 +그 행을 생성하기 위해 수행 된 어떤 단계 왼쪽에 나타낸다.

1                1
2 *            1   1
3 +          1   2   1
4 *        1   2   2   1
5 +      1   3   4   3   1
6 *    1   3  12  12   3   1
7 +  1   4  15  24  15   4   1

도전

입력이 주어지면 이 삼각형 n의 세 n번째 행을 출력하십시오 .

규칙

  • 대신 0- 인덱스를 선택할 수도 있지만 덧셈과 곱셈 행은 플립 플롭해야하므로 위와 정확히 동일한 삼각형이 생성됩니다. 이 작업을 선택하면 제출물에 기재하십시오.
  • 입력 및 출력은 언어의 기본 정수 유형에 맞는 것으로 가정 할 수 있습니다.
  • 입력 및 출력은 편리한 형식으로 제공 될 수 있습니다 .
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 가능하면 다른 사람들이 귀하의 코드를 시험해 볼 수 있도록 온라인 테스트 환경에 대한 링크를 포함하십시오!
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

여러 가지 중에서 출력의 두 가지 가능한 예 : 목록 또는 공백으로 구분 된 문자열을 표시합니다.

4
[1, 2, 2, 1]

8
"1 4 60 360 360 60 4 1"

2
@totallyhuman 아니오, stdout의 유일한 것은 nth 행 이어야합니다 .
AdmBorkBork

답변:


16

파스칼 , 249 247 233 바이트

자, 이것은 파스칼의 교대 삼각형입니다.

@ Mr.Xcoder 덕분에 1 바이트 절약

function f(n,k:integer):integer;begin if((k<1)or(k>n)or(n=1))then f:=n mod 2 else if n mod 2=0then f:=f(n-1,k-1)*f(n-1,k)else f:=f(n-1,k-1)+f(n-1,k)end;
procedure g(n:integer);var k:integer;begin for k:=1to n do write(f(n,k),' ')end;

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



7

파이썬 2 , 97 93 86 81 78 바이트

Rod 덕분에 -4 바이트 Halvard Hummel 덕분에 -10 바이트

f=lambda n:n and[[i+j,i*j][n%2]for i,j in zip([n%2]+f(n-1),f(n-1)+[n%2])]or[1]

인덱스가 0입니다.

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


1
잘 했어, 나는 (많은) 더 긴 접근 방식을 가졌다 . 나는 아직 골프를 할 시간이 없었지만.
Mr. Xcoder

1
나는 그것이 map([int.__add__ ,int.__mul__][i%2],[i%2]+a,a+[i%2])작동해야한다고 생각한다 (테스트되지 않았다)
Rod


1
아니요, 재귀입니다. 이름을 포함시켜야합니다.
Mr. Xcoder


5

젤리 , 17 12 바이트

µ×+LḂ$?Ḋ1;µ¡

이것은 STDIN으로부터 입력을받는 전체 프로그램 (또는 닐라 딕 링크)입니다.

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

작동 원리

µ×+LḂ$?Ḋ1;µ¡  Main link. No arguments. Implicit argument: 0

          µ¡  Start a monadic chain and apply the ntimes quick to the previous one.
              This reads an integer n from STDIN and executes the previous chain n
              times, with initial argument 0, returning the last result.
µ             Start a monadic chain. Argument: A (array or 0)
       Ḋ          Dequeue; yield A without its first element.
   LḂ$?           If the length of A is odd:
 ×                    Multiply A and dequeued A.
                  Else:
  +                   Add A and dequeued A.
        1;        Prepend a 1 to the result.

5

파이썬 2 , 96 89 87 바이트

s=a=[1]
for i in range(1,input()):a=s+[[k+l,k*l][i%2]for k,l in zip(a[1:],a)]+s
print a

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



@totallyhuman 감사합니다 .. 나는 그것을 롤백 ...
officialaimm

1
갑자기 exec 방법이 선도하고 있습니다 : D
Dead Possum

1
선언하는 87 바이트[1] .
Mr. Xcoder

3

CJam , 25 바이트

{1a\{2%!_2$+\{.*}{.+}?}/}

인덱스가 0입니다.

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

설명

이것은 스택에서 숫자를 가져 와서 스택에 결과를 남기는 익명의 블록입니다.

1a                        Push [1].
  \                       Bring the number to the top.
   {                 }/   For reach number 0 .. arg-1, do:
    2%!                    Push 0 if even, 1 if odd.
       _                   Copy that.
        2$+                Copy the list so far and prepend the 0 or 1 to it.
           \               Bring the 0 or 1 back to the top.
            {.*}{.+}?      If 1, element-wise multiplication. If 0, element-wise addition.

대기 2%!는 짝수이면 1을, 홀수이면 0을 눌러야합니다.
Esolanging Fruit


3

하스켈 , 76 72 바이트

인덱스가없는 솔루션 :

(p!!)
p=[1]:[zipWith o(e:l)l++[1]|(l,(o,e))<-zip p$cycle[((*),1),((+),0)]]

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

설명

p 대체 삼각형을 재귀 적으로 정의합니다. [1]

p=[1]:[                                                            ]

그런 다음 이전 줄 ( l) 을 가져 와서 삼각형을 만듭니다 . 그것으로 무엇을 해야하는지 알기 위해서는 올바른 연산자 ( o)와 해당 중립 요소 ( e)를 추적해야합니다 .

                           |(l,(o,e))<-zip p$cycle[((*),1),((+),0)]

이 줄에서 줄을 복제하여 새 줄을 만들고 한 사본에 중립 요소를 추가하고 연산자로 압축하고 1을 추가하십시오.

       zipWith o(e:l)l++[1]

3

R , 108 98 바이트

실제 곱하기 부호를 더하기 부호로 바꾸면 -10 바이트입니다. 용서해주세요

f=function(n){if(n<3)return(rep(1,n))else{v=f(n-1)};if(n%%2)`*`=`+`;return(c(1,v[3:n-2]*v[-1],1))}

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

일반적인 방법에 대해 매우 기뻐했지만 (처음 프리미티브에 별명을 붙였습니다), 특히 n <3이 많은 보일러 플레이트로 이어지는 경우의 어색한 처리로 골프가 아직 끝날 것이라고 확신합니다.


85 바이트 . 나는 당신의 솔루션을 정말로 좋아합니다 `*`=`+`! 아주 영리합니다. 내 개선의 나머지 부분은 표준 골프 기술이며, 귀하의 요청에 따라 설명해 드리겠습니다 :)
Giuseppe

80 바이트 . 내가 처리하는 경우에 대해 메모에서 영감을했다n<3
주세페

2

껍질 , 17 16 바이트

!G₅;1¢e*+
:1Sż⁰t

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

1 인덱스 솔루션.

설명

첫 번째 줄은 주 함수이며 두 번째 줄에서 도우미 함수를 호출합니다. 도우미 함수는 일반적으로로 호출 되지만이 경우에는 넘쳐 레이블 껍질의 기능 : 당신이 라인을 참조하면 N 과 함께 프로그램에 M <N의 , 당신은 라인 얻을 라인 N 모드 M을 수정 기능과 M / N이 적용되었습니다. 두 번째 수정 자 함수는입니다 flip. 따라서 추가 바이트 비용없이 도우미 함수의 인수를 뒤집기 위해 사용 하고 있습니다.

다음은 도우미 기능입니다.

:1Sż⁰t  Takes a function f and a list x.
   ż    Zip preserving elements of longer list
    ⁰   using function f
  S  t  x and its tail,
:1      then prepend 1.

주요 기능은 다음과 같습니다.

!G₅;1¢e*+  Takes a number n.
      e*+  2-element list of the functions * and +
     ¢     repeated infinitely.
 G         Left scan this list
  ₅        using the flipped helper function
   ;1      with initial value [1].
!          Get n'th element.

2

C # (. NET 코어) , 143 (134) 128 바이트

Phaeze 덕분에 -4 바이트 Zac Faragher
덕분에 -5 바이트 Kevin Cruijssen
덕분에 -6 바이트

n=>{int[]b={1},c;for(int i=0,j;++i<n;b=c)for(c=new int[i+1],c[0]=c[i]=1,j=0;++j<i;)c[j]=i%2<1?b[j-1]+b[j]:b[j-1]*b[j];return b;}

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

설명:

n =>
{
    int[] b = { 1 }, c;               // Create first layer
    for(int i = 0, j; ++i < n; b = c) // Iterate for every layer, replace last layer with a new one
        for(c = new int[i+1],         // Create new layer
            c[0] = c[i] = 1,          // First and last elements are always 1
            j = 0;
            ++j < i; )                // Replace every element (besides 1st and last)...
                c[j] = i % 2 == 0 ?
                    b[j - 1] + b[j] : // ... with addition...
                    b[j - 1] * b[j];  // ... or multiplication of two from previous layers
    return b;                         // Return latest layer
};

b 배열 초기화를로 변경 var b=new[]{1};하면 컴파일러에서 배열 유형을 결정합니다.
JustinM-복원 모니카

1
첫 번째 계층을 구성하는 또 다른 방법 int[]b={1};은 @Phaeze의 제안에서와 같이-11 바이트 대 20 또는 16입니다
Zac Faragher

1
@ZacFaragher와 Phaeze 감사합니다!
Grzegorz Puławski

1
꽤 오래 걸렸지 만 6 바이트 더 골프를 칠 수 있습니다 n=>{int[]b={1},c;for(int i=0,j;++i<n;b=c)for(c=new int[i+1],c[0]=c[i]=1,j=0;++j<i;)c[j]=i%2<1?b[j-1]+b[j]:b[j-1]*b[j];return b;}. 나는 이렇게 결합 c했다 int[]b={1},c;; 단축 i%2==0한다 i%2<1; 그리고 모든 것을 안에 넣어서 루프 브래킷을 제거했습니다.
케빈 크루이 센

큰! 감사합니다 @KevinCruijssen
Grzegorz Puławski


1

피스 , 22 바이트

@FryAmTheEggman 덕분에 수많은 바이트가 절약되었습니다 ! 초기 솔루션은 다음과 같습니다.

u++1@,+VGtG*VGtGlG1Q[1

전체 테스트 스위트 (0 인덱스).

Pyth , 40 38 36 35 바이트

이것은 너무 합리적으로 오래 느낀다 . 제안은 환영합니다.

K]1VStQ=K++]1m@,sd*hded%N2C,KtK]1;K

Suite를 테스트 하거나 온라인으로 사용해보십시오!


reduce를 사용하는 것이 훨씬 짧은 것 같습니다 . 나는 이것이 최적이라고 확신하지 못합니다. 서브 20 이하가 관리 가능하다고 생각합니까?
FryAmTheEggman

@FryAmTheEggman 내 개정 이력을 확인하십시오. 나는 reduce로 해결 방법을 찾으려고 노력 u했지만 말했다. 감사!
Mr. Xcoder

만약 Pyth에 prepend-append가 내장되어
있다면



1

Mathematica, 70 바이트

Fold[#2@@@Partition[#,2,1,{-1,1},{}]&,{1},PadRight[{},#,{1##&,Plus}]]&

Wolfram 샌드 박스 에서 사용해보십시오 ! 불행히도 Mathics에서는 작동하지 않습니다. 0 인덱스입니다.

설명 : Partition[#,2,1,{-1,1},{}]목록을 가져 와서 시작 및 종료에 대한 1 요소 목록과 함께 두 요소 서브리스트를 모두 리턴합니다 (예 : {1,2,3,4}됩니다) {{1}, {1,2}, {2,3}, {3,4}, {4}}. 길이가 입력 번호 인 (효과적으로 ) 및 PadRight[{},#,{1##&,Plus}]의 대체 목록을 만듭니다 . 그런 다음 es와 es가 적용된 파티션 기능을 반복적으로 적용 하여 삼각형의 행을 만듭니다.1##&TimesPlusFoldPlusTimes




0

TI 기본 (TI-84 Plus CE), 100 바이트

Prompt X
{1→M
For(A,2,X
LM→L
A→dim(M
For(B,2,A–1
If A/2=int(A/2
Then
LL(B–1)LL(B→LM(B
Else
LL(B–1)+LL(B→LM(B
End
End
1→LM(dim(LM
End
LM

1- 색인, 사용자에게 입력을 요청하고 n파스칼의 교대 삼각형의 세 번째 행을 포함하는 목록을 인쇄합니다 .

루핑하는 동안 : L M은 현재 행이고 L L은 이전 행입니다.

TI-Basic은 토큰 화 된 언어 입니다. 여기에 사용 된 모든 토큰은 1 바이트 토큰입니다.

나는 결국 M을 제자리에서 수정함으로써 이것을 더 골프화 할 수 있다고 생각합니다.

설명:

Prompt X            # 3 bytes; get user input, store in X
{1→M                # 5 bytes, store the first row into LM
For(A,2,X           # 7 bytes, Loop X-1 times, with A as the counter, starting at 2
LM→L                # 5 bytes, copy list M into list L
A→dim(M             # 5 bytes, extend M by one
For(B,2,A–1         # 9 bytes, for each index B that isn't the first or last...
If A/2=int(A/2      # 10 bytes,    if A is even...
Then                # 2 bytes,     then...
LL(B–1)LL(B→LM(B     # 17 bytes,        the Bth item in this row is the Bth times the (B-1)th of the previous row
Else                # 2 bytes,     else...
LL(B–1)+LL(B→LM(B    # 18 bytes,        the Bth item in this row is the Bth plus the (B-1)th of the previous row
End                 # 2 bytes,     endif
End                 # 2 bytes,  endfor
1→LM(dim(LM         # 9 bytes, the last item is always 1
End                 # 2 bytes, endfor
LM                  # 2 bytes, Implicitly print the final row


0

자바 스크립트 (ES6), 71 69 66 바이트

f=n=>n?(p=f(n-1),[...p.map((v,i)=>i--?n%2?v*p[i]:v+p[i]:1),1]):[1]

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

인덱스가 0입니다. @Arnauld에 의해
-3 바이트

f=n=>n?(p=f(n-1),[...p.map((v,i)=>i--?n%2?v*p[i]:v+p[i]:1),1]):[1]

for (var i = 0; i < 10; ++i) {
  console.log(JSON.stringify(f(i)));
}


1
삼항을 사용하면 3 바이트를 절약해야합니다.i--?n%2?v*p[i]:v+p[i]
Arnauld
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.