파스칼의 머리띠 생성 40545

이것은 파스칼의 머리띠입니다 :

 1 4  15  56   209   780    2911    10864     40545      151316      564719
1 3 11  41  153   571   2131    7953     29681     110771      413403      1542841
 1 4  15  56   209   780    2911    10864     40545      151316      564719

나는 그것을 완전히 만들었다. Blaise Pascal은 내가 알 수있는 한 머리 끈이 없었으며, 그가 말한 경우 아마도 숫자 대신 머리카락으로 만들어졌습니다.

다음과 같이 정의됩니다.

  1. 첫 번째 열에는 1중간에 단일 이 있습니다.
  2. 두 번째 열은 1상단과 하단에 있습니다.
  3. 이제 우리는 숫자를 중간 또는 두 개의 사본을 위와 아래에 넣는 것을 번갈아 가며합니다.
  4. 숫자가 맨 위나 맨 아래에 있으면 인접한 두 숫자의 합이됩니다 (예 🙂 56 = 15 + 41. 머리를 약간 기울이면 파스칼의 삼각형 단계와 같습니다.
  5. 숫자가 중간에 가면 인접한 세 숫자 (예 :)의 합계가됩니다 41 = 15 + 11 + 15.

당신의 임무는이 머리띠를 인쇄하는 것입니다.

입력

단일 integer를 수신하여 n출력 할 마지막 열의 색인을 제공 하는 프로그램 또는 함수를 작성해야 합니다.

첫 번째 열 ( 1중간 줄에 하나만 인쇄 )이 n = 0또는에 해당 하는지 여부를 선택할 수 있습니다 n = 1. 이는 가능한 모든 입력에서 일관된 선택이어야합니다.

산출

파스칼 브레이드를 n열 까지 출력합니다 . 공백은 짧은 줄을 공백이있는 긴 줄 길이로 채울 수 있고 선택적으로 단일 후행 줄 바꿈을 출력 할 수 있다는 점을 제외하고는 위의 예제 레이아웃과 정확히 일치해야합니다.

즉, 모든 열은 해당 열의 숫자 (또는 동일한 숫자 쌍)만큼 정확하게 넓어야하며 연속 열의 숫자는 겹치지 않아야하며 열 사이에 공백이 없어야합니다.

결과를 STDOUT (또는 가장 가까운 대안)에 인쇄하거나 함수를 작성하는 경우 동일한 내용의 문자열 또는 세 개의 문자열 (각 줄에 하나씩) 목록을 리턴 할 수 있습니다.

추가 세부 사항

당신은 그 가정 할 수 있습니다 n첫 번째 열의 인덱스 (그래서 적어도 이상이어야한다 0또는 1당신의 색인에 따라). 또한 브레이드의 마지막 번호가 256 또는 중 언어의 기본 정수 타입에 의해 가장 큰 숫자 표현할 수 있다고 가정 할 수 이상을 . 따라서 원시 정수 유형이 바이트 만 저장할 수있는 경우 가장 큰 값 n은 0 또는 1을 사용하는지 여부에 따라 최대 값 9또는 100 이라고 가정 할 수 있으며 n부호있는 32 비트 정수를 저장할 n수있는 경우 최대 값 33또는 34입니다.

표준 규칙이 적용됩니다. 가장 짧은 코드가 승리합니다.

OEIS

여기 몇 가지 관련 OEIS 링크가 있습니다. 물론 여기에는 브레이드에 숫자를 생성하는 다양한 방법에 대한 스포일러가 포함되어 있습니다.

테스트 사례

이 테스트 사례는 1-베이스 색인을 사용합니다. 각 테스트 케이스는 4 줄이며, 첫 번째는 입력이고 나머지 3 개는 출력입니다.

1

1

---
2
 1
1
 1
---
3
 1
1 3
 1
---
5
 1 4
1 3 11
 1 4
---
10
 1 4  15  56   209
1 3 11  41  153
 1 4  15  56   209
---
15
 1 4  15  56   209   780    2911
1 3 11  41  153   571   2131    7953
 1 4  15  56   209   780    2911
---
24
 1 4  15  56   209   780    2911    10864     40545      151316      564719       2107560
1 3 11  41  153   571   2131    7953     29681     110771      413403      1542841
 1 4  15  56   209   780    2911    10864     40545      151316      564719       2107560


답변

젤리 , 31 30 29 바이트

Q;S⁹o_
3ḶḂç@⁸СIµa"Ṿ€o⁶z⁶Zµ€Z

이것은 모나드 링크입니다. 0 기반 열 색인을 인수로 승인하고 문자열 목록을 리턴합니다.

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

작동 원리

Q;S⁹o_                  Helper link.
                        Arguments: [k, 0, k] and [0, m, 0] (any order)

Q                       Unique; deduplicate the left argument.
 ;                      Concatenate the result with the right argument.
  S                     Take the sum of the resulting array.
   ⁹o                   Logical OR with the right argument; replaces zeroes in the
                        right argument with the sum.
     _                  Subtract; take the difference with the right argument to
                        remove its values.
                        This maps [k, 0, k], [0, m, 0] to [0, k + m, 0] and
                        [0, m, 0], [k, 0, k] to [m + 2k, 0, m + 2k].


3ḶḂç@⁸СIµa"Ṿ€o⁶z⁶Zµ€Z  Monadic link. Argument: A (array of column indices)

3Ḷ                      Yield [0, 1, 2].
  Ḃ                     Bit; yield [0, 1, 0].
        I               Increments of n; yield [].
      С                Apply...
   ç@                       the helper link with swapped arguments...
     ⁸                      n times, updating the left argument with the return
                            value, and the right argument with the previous value
                            of the left one. Collect all intermediate values of
                            the left argument in an array.
         µ         µ€   Map the chain in between over the intermediate values.
            Ṿ€          Uneval each; turn all integers into strings.
          a"            Vectorized logical AND; replace non-zero integers with
                        their string representation.
              o⁶        Logical OR with space; replace zeroes with spaces.
                z⁶      Zip with fill value space; transpose the resulting 2D
                        array after inserting spaces to make it rectangular.
                  Z     Zip; transpose the result to restore the original shape.
                     Z  Zip; transpose the resulting 3D array.

답변

Pyth , 44 바이트

숫자 생성에는 20 바이트가, 서식에는 24 바이트가 걸렸습니다.

jsMC+Led.e.<bkC,J<s.u+B+hNyeNeNQ,1 1Qm*;l`dJ

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

jsMC+Led.e.<bkC,J<s.u+B+hNyeNeNQ,1 1Qm*;l`dJ   input as Q
                   .u          Q,1 1           repeat Q times, starting with [1,1],
                                               collecting all intermediate results,
                                               current value as N:
                                               (this will generate
                                                more than enough terms)
                       +hNyeN                  temp <- N[0] + 2*N[-1]
                     +B      eN                temp <- [temp+N[-1], temp]

now, we would have generated [[1, 1], [3, 4], [11, 15], [41, 56], ...]

jsMC+Led.e.<bkC,J<s                 Qm*;l`dJ
                  s                            flatten
                 <                  Q          first Q items
                J                              store in J
                                     m    dJ   for each item in J:
                                         `     convert to string
                                        l      length
                                      *;       repeat " " that many times

jsMC+Led.e.<bkC,
              C,     transpose, yielding:
[[1, ' '], [1, ' '], [3, ' '], [4, ' '], [11, '  '], ...]
(each element with as many spaces as its length.)
        .e            for each sub-array (index as k, sub-array as b):
          .<bk            rotate b as many times as k

[[1, ' '], [' ', 1], [3, ' '], [' ', 4], [11, '  '], ...]

jsMC+Led
    +Led              add to each sub-array on the left, the end of each sub-array
   C                  transpose
 sM                   sum of each sub-array (reduced concatenation)
j                     join by new-lines

답변

파이썬 2, 120 바이트

a=1,1,3,4
n=input()
y=0
exec"y+=1;t='';x=0;%sprint t;"%(n*"a+=a[-2]*4-a[-4],;v=`a[x]`;t+=[v,len(v)*' '][x+y&1];x+=1;")*3

Ideone에서 사용해보십시오.


답변

MATL , 38 바이트

1ti:"yy@oQ*+]vG:)!"@Vt~oX@o?w]&v]&hZ}y

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

(고유 한) 숫자로 배열을 계산하려면 처음 17 바이트가 필요합니다. 포맷에는 나머지 21 바이트가 필요합니다.

설명

1 부 : 숫자 생성

이렇게하면 첫 번째와 두 번째 행의 숫자가 증가하는 배열이 생성됩니다 [1; 1; 3; 4; 11; 15; ...]. 그것은 시작 1, 1. 각각의 새로운 숫자는 앞의 두 숫자에서 반복적으로 얻습니다. 그중 두 번째는 반복 인덱스에 곱 1하거나 2반복 색인에 따라 첫 번째로 합산하여 새 수를 생성합니다.

반복 횟수는 입력과 같습니다 n. 이것은 n+2숫자가 생성됨을 의미합니다 . 일단 생성되면 첫 번째 n항목 만 유지 되도록 배열을 다듬어야 합니다.

1t      % Push 1 twice
i:      % Take input n. Generage array [1 2 ... n]
"       % For each
  yy    %   Duplicate the two most recent numbers
  @o    %   Parity of the iteration index (0 or 1)
  Q     %   Add 1: gives 1 for even iteration index, 2 for odd
  *+    %   Multiply this 1 or 2 by the most recent number in the sequence, and add
       %    to the second most recent. This produces a new number in the sequence
]       % End for each
v       % Concatenate all numbers in a vertical array
G:)     % Keep only the first n entries

2 부 : 출력 형식

획득 한 배열의 각 숫자에 대해 두 문자열을 생성합니다. 숫자의 문자열 표현과 문자 0이 반복되는 동일한 길이의 문자열 (문자 0은 MATL에서 공백으로 표시됨)입니다. 반복해도이 두 문자열은 서로 바뀝니다.

그런 다음 두 줄을 세로로 연결합니다. 따라서 n2D 문자 배열은 다음과 같이 생성됩니다 ( ·문자 0을 나타내는 데 사용 ).

·
1

1
·

·
3

4
·

··
11

15
··

그런 다음 이러한 어레이는 수평으로 연결되어

·1·4··15
1·3·11··

마지막으로이 2D 문자 배열은 두 개의 행으로 분할되고 첫 번째는 스택의 맨 위에 복제됩니다. 3 개의 문자열이 각각 다른 줄에 순서대로 표시되어 원하는 출력을 생성합니다

!       % Transpose into a horizontal array [1 1 3 4 11 15 ...]
"       % For each
  @V    %   Push current number and convert to string
  t~o   %   Duplicate, negate, convert to double: string of the same length consisting
        %   of character 0 repeated
  X@o   %   Parity of the iteration index (1 or 0)
  ?     %   If index is odd
    w   %     Swap
  ]     %   End if
  &v    %   Concatenate the two strings vertically. Gives a 2D char array representing
        %   a "numeric column" of the output (actually several columns of characters)
]       % End for
&h      % Concatenate all 2D char arrays horizontally. Gives a 2D char array with the
        % top two rows of the output
Z}      % Split this array into its two rows
y       % Push a copy of the first row. Implicitly display

답변

하스켈, 101 바이트

a=1:1:t
t=3:4:zipWith((-).(4*))t a
g(i,x)=min(cycle" 9"!!i)<$>show x
f n=[zip[y..y+n]a>>=g|y<-[0..2]]

함수를 정의합니다 f :: Int → [String].

  • Michael Klein unlines은 결과 를 호출 할 필요가 없으며 7 바이트를 절약 할 수 있다고 상기 시켰습니다 . 감사!

  • 나는 대체하여 바이트를 저장 " 9"!!mod i 2하여 cycle" 9"!!i.

  • 를 사용하는 대신 두 개의 코어 커런트 목록을 작성하여 3 바이트를 더 추가합니다 drop.

  • 내 여자 친구는 0대신에 답변을 시작하여 2 바이트를 더 절약 할 수 있다고 지적했습니다 1.


답변

C, 183 (177) 176 바이트

#define F for(i=0;i<c;i++)
int i,c,a[35],t[9];p(r){F printf("%*s",sprintf(t,"%d",a[i]),r-i&1?t:" ");putchar(10);}b(n){c=n;F a[i]=i<2?1:a[i-2]+a[i-1]*(i&1?1:2);p(0);p(1);p(0);}

설명

C는 더 높은 수준의 언어에 대한 간결한 상을 얻지 못하지만 연습은 흥미롭고 좋은 연습입니다.

매크로 F는 가독성으로 6 바이트를 줄입니다. 변수는 여러 선언을 피하기 위해 전역 적으로 선언됩니다. sprintf에 문자 버퍼가 필요했지만 K & R이 유형 검사로 느슨해 졌기 때문에 sprintf와 printf는 t [9]를 36 바이트 버퍼에 대한 포인터로 해석 할 수 있습니다. 이것은 별도의 선언을 저장합니다.

#define F for(i=0;i<c;i++)
int i,c,a[35],t[9];

예쁜 인쇄 기능. 여기서 r은 행 번호입니다. Sprintf는 숫자를 형식화하고 열 너비를 계산합니다. 공간을 절약하기 위해 각 출력 행마다 하나씩 세 번 호출합니다. ri & 1 표현식은 인쇄되는 내용을 필터링합니다.

p(r) {
    F
        printf("%*s", sprintf(t, "%d", a[i]), r-i&1 ? t
                                                    : " ");
    putchar(10);
}

진입 점 함수, 인수는 열 수입니다. 열 값 a []의 배열 a를 계산 한 다음 각 출력 행에 대해 인쇄 함수 p를 한 번 호출합니다.

b(n) {
    c=n;
    F
        a[i] = i<2 ? 1
                   : a[i-2] + a[i-1]*(i&1 ? 1
                                          : 2);
    p(0);
    p(1);
    p(0);
}

샘플 호출 (응답 및 바이트 수에 포함되지 않음) :

main(c,v) char**v;
{
    b(atoi(v[1]));
}

업데이트

tomsmeding에서 인라인 스프린트 제안을 통합했습니다. 이 수치는 183 자에서 177 자로 줄었습니다. 이것은 또한 printf (sprintf ()) 블록 주위의 중괄호를 제거 할 수있게합니다. printf (sprintf ()) 블록은 이제 하나의 명령문 일 뿐이지 만, 구분자로 공백이 여전히 필요하므로 한 문자 만 저장했습니다. 176으로 줄였습니다.


답변

PowerShell v2 +, 133 바이트

param($n)$a=1,1;1..$n|%{$a+=$a[$_-1]+$a[$_]*($_%2+1)};$a[0..$n]|%{$z=" "*$l+$_;if($i++%2){$x+=$z}else{$y+=$z}$l="$_".Length};$x;$y;$x

값을 계산하려면 44 바이트, ASCII를 공식화하려면 70 바이트

입력을받습니다 $n 을 인덱스없는 열로 사용합니다. 시퀀스 배열의 시작을 설정합니다 $a=1,1. 에 우리는 다음 루프까지 $n1..$n|%{...}배열을 구성합니다. 각 반복마다 (두 요소 전) + (이전 요소) * (홀수 또는 짝수 여부)의 합으로 연결됩니다. 최대을 생성 $a=1,1,3,4,11...합니다 $n+2.

따라서 $a첫 번째 0..$n요소 만 가져 오도록 슬라이스 하고 다른 루프를 통해 파이프해야합니다 |%{...}. 우리가 헬퍼를 설정 한 각 반복 $z은 공백과 현재 요소를 문자열로 더한 것과 같습니다. 그런 다음 연결 여부를 분리합니다$x$y 간단한 홀수 짝수 if/ (위와 아래 행) 또는 (중간 행)에else . 그런 다음 $l현재 숫자를 취하고 문자열로 묶고를 사용하여 공백 수를 계산합니다 .Length.

마지막으로 $x , $y그리고 $x다시 파이프 라인 및 출력은 암시 적이다. .ToString()STDOUT으로 인쇄 할 때 배열 의 기본 구분 기호는 줄 바꿈이므로 무료로 얻을 수 있습니다.

PS C:\Tools\Scripts\golfing> .\pascal-braid.ps1 27
 1 4  15  56   209   780    2911    10864     40545      151316      564719       2107560       7865521        29354524
1 3 11  41  153   571   2131    7953     29681     110771      413403      1542841       5757961       21489003
 1 4  15  56   209   780    2911    10864     40545      151316      564719       2107560       7865521        29354524