거꾸로 된 피라미드 추가…


22

거꾸로 된 피라미드 추가는 숫자 목록을 가져와 한 숫자에 도달 할 때까지 숫자를 연속적으로 추가하는 프로세스입니다.

숫자 2, 1, 1가 주어지면 다음 프로세스가 발생합니다.

 2   1   1
   3   2 
     5

이것은 숫자로 끝납니다 5.


당신의 임무

Upside-Down Pyramid (오름차순)의 오른쪽이 주어지면 원래 목록을 반환하는 프로그램이나 함수를 작성하십시오.

새로운 추가 챌린지 : O (n ^ 2) 미만으로 시도해보십시오

f([5, 2, 1]) => [2, 1, 1]
f([84,42,21,10,2]) => [4,7,3,8,2]

참고 : 거꾸로 된 피라미드는 절대 비어 있지 않으며 항상 양의 정수로만 구성됩니다.


6
PP & CG에 오신 것을 환영합니다! 이 문제는 개선 될 수는 있지만 괜찮습니다. Sandbox에 도전 과제를 게시하여 게시물을 게시하기 전에 먼저 게시물을 개선하는 것이 좋습니다 .
타우

13
무료 통찰력 I는 짧아의 언어를 찾을 수 없다는 :
f([a,b,c,d,e])=[1464101331001210001100001][abcde]
Lynn

4
참고로 CodeWars kata 와 동일합니다 .
ggorlen

6
@ggorlen 알고 있습니다. 나는 kata를 만든 사람이다 :)
Whimpers

8
Try doing this in less than O(n)분명히 n 크기 배열을 할당하거나 O (n) 복잡성보다 더 빠르게 O (n) 항목을 변경하는 것이 불가능합니까?
내 대명사는

답변:


17

자바 스크립트 (ES6),  62 58 49  46 바이트

@Oliver 덕분에 3 바이트 절약

목록을 쉼표로 구분 된 문자열로 반환합니다.

f=a=>+a||f(a.map(n=>a-(a=n),a=a.shift()))+[,a]

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

댓글

f = a =>              // f = recursive function taking the input list a[]
  +a                  // if a[] consists of a single positive integer:
                      //   stop recursion and return this integer
  ||                  // else:
    f(                //   do a recursive call to f:
      a.map(n =>      //     for each value n in a[]:
        a - (a = n),  //       yield the difference between the previous value and n
                      //       and update a to n
        a = a.shift() //       start by removing the first element and saving it in a
                      //       (because of the recursion, it's important here to reuse
                      //       a variable which is defined in the scope of f)
      )               //     end of map()
    )                 //   end of recursive call
    + [, a]           //   append the last entry from a[]

@Oliver,
쉐기



6

TI-BASIC, 54 바이트

Ans→L₁:dim(L₁→dim(L₂:While 1-Ans:L₁(Ans→L₂(Ans:-ΔList(L₁→L₁:dim(Ans:End:L₁(Ans→L₂(Ans:L₂

입력은 Ans챌린지에 설명 된대로 의 오른쪽 삼각형 목록입니다 .
출력은 상기 삼각형의 최상단이다.

예 :

{5,2,1
         {5 2 1}
prgmCDGF19
         {2 1 1}
{84,42,21,10,2
 {84 42 21 10 2}
prgmCDGF19
     {4 7 3 8 2}

설명 :
이 솔루션은 시작이 각 요소의 변경으로 삼각형의 오른쪽을 사용하여 형성된 삼각형을 남용합니다.

다른 말로,

2 1 1
 3 2
  5

된다 :

5 2 1
 3 1
  2

따라서 결과 목록은이 새 삼각형의 오른쪽이며, 결과 목록에서 마지막 요소를 상위 목록 길이의 색인으로 설정하여 형성 할 수 있습니다.

Ans→L₁          ;store the input list in L₁
dim(L₁→dim(L₂   ;set the length of L₂ to the length of L₁
While 1-Ans     ;while the L₁'s length is not 1
L₁(Ans→L₂(Ans   ;set the last element of L₁ to the corresponding index in L₂
-ΔList(L₁→L₁    ;get the change in each element, then negate
                ; (elements are in descending order so the change in each
                ;  element will be negative)
                ; and store the resulting list in L₁
dim(Ans         ;leave the length of L₁ in "Ans"
End
L₁(Ans→L₂(Ans   ;set the element again
                ; (needed for final step)
L₂              ;leave L₂ in "Ans"
                ;implicit print of "Ans"

참고 : TI-BASIC은 토큰 화 된 언어입니다. 문자 수는 바이트 수와 같지 않습니다 .


4

젤리 , 6 바이트

ṚIƬZḢṚ

정수 목록을 허용하는 정수 목록을 허용하는 모나드 링크.

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

방법?

전체 삼각형을 작성한 다음 필요한 요소를 추출합니다.

ṚIƬZḢṚ - Link: list of integers          e.g.  [84,42,21,10,2]
Ṛ      - reverse                               [2,10,21,42,84]
  Ƭ    - collect & apply until a fixed point:
 I     -   incremental differences            [[2,10,21,42,84],[8,11,21,42],[3,10,21],[7,11],[4],[]]
   Z   - transpose                            [[2,8,3,7,4],[10,11,10,11],[21,21,21],[42,42],[84]]
    Ḣ  - head                                  [2,8,3,7,4]
     Ṛ - reverse                               [4,7,3,8,2]

거의 동일한 솔루션이 있었지만 U대신 s가 사용되었습니다 !
Nick Kennedy

IƬUZḢA주어진 질문으로도 작동합니다. 어딘가에 바이트 저장이 있는지 궁금합니다.
Jonathan Allan

ạƝƬZṪ€작동하지만 다시 6입니다.
Nick Kennedy

그렇습니다. 나는 그 변종을 발견했습니다. 나는 지금 덜 희망적이다.
Jonathan Allan

방금 5 바이트를 게시했지만 피라미드 건설 후 부품에 대한 귀하의 접근 방식과 약간 다릅니다.
Outgolfer Erik

4

MathGolf , 14 11 바이트

xÆ‼├│?;∟;]x

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

설명

x             reverse int/array/string
 Æ     ∟      do while true without popping using 5 operators
  ‼           apply next 2 operators to TOS
   ├          pop from left of list
    │         get differences of list
     ?        rot3
      ;       discard TOS (removes rest from ├ command)
              loop ends here
        ;     discard TOS (removes empty array from stack)
         ]    wrap stack in array
          x   reverse array



3

Pari/GP, 36 bytes

Based on @Lynn's comment:

Free insight that I can't find a language it's shorter in:

f([a,b,c,d,e])=[1464101331001210001100001][abcde]

Pari/GP has a built-in for the Pascal matrix, and its inverse is exactly the matrix we need:

[1000011000121001331014641]1=[1000011000121001331014641]

a->r=Vecrev;r(r(a)/matpascal(#a-1)~)

Try it online!


3

R, 69 67 bytes

function(n,x=sum(n|1):1-1,`[`=outer)(x[x,choose]*(-1)^x[x,"+"])%*%n

Try it online!

Returns a column vector.

-2 bytes thanks to Kirill L.

Also based on Lynn's comment:

Free insight that I can't find a language it's shorter in:

f([a,b,c,d,e])=[1464101331001210001100001][abcde]

It's longer than the other R answer, but it was an interesting approach to take and try to golf.


2

Javascript (ES6), 127 bytes

f=a=>{for(e=[a],a=[a[l=a.length-1]],i=0;i<l;i++){for(e.push(g=[]),j=-1;j<l;)g.push(e[i][j]-e[i][++j]);r.unshift(g[j])}return r}

Original code

function f(a){
  var e=[a];
  var r=[a[a.length-1]];
  for (var i=1;i<a.length;i++){
    var g=[];
    for (var j=0;j<a.length;j++){
      g.push(e[i-1][j-1]-e[i-1][j]);
    }
    e.push(g);
    r.unshift(g[j-1]);
  }
  return r;
}

Oh, I lost like... a lot... to the previous answer...



2

05AB1E, 12 11 bytes

R.¥.Γ¥}¨ζнR

Port of @JonathanAllan's Jelly answer, although I'm jelly about Jelly's more convenient builtins in this case. ;)
-1 byte thanks to @Emigna.

Try it online or verify all test cases.

Explanation:

R            # Reverse the (implicit) input-list
             #  i.e. [16,7,4,3] → [3,4,7,16]
           # Undelta it (with leading 0)
             #  → [0,3,7,14,30]
    }      # Continue until the result no longer changes, and collect all steps:
     ¥       #  Get the deltas / forward differences of the current list
             #  → [[3,4,7,16],[1,3,9],[2,6],[4],[]]
       ¨     # Remove the trailing empty list
             #  → [[3,4,7,16],[1,3,9],[2,6],[4]]
        ζ    # Zip/transpose; swapping rows/column (with space as default filler)
             #  → [[3,1,2,4],[4,3,6," "],[7,9," "," "],[16," "," "," "]]
         н   # Only leave the first inner list
             #  → [3,1,2,4]
          R  # Revert it back
             #  → [4,2,1,3]
             # (after which it's output implicitly as result)

2
You can save a byte with R.¥.Γ¥}¨ by starting from the list whose delta is the input.
Emigna

@Emigna Ah, undelta into a loop with deltas to save a byte on the prepend. :) Thanks!
Kevin Cruijssen


2

Perl 6, 37 bytes

{[R,]($_,{@(.[]Z-.skip)}...1)[*;*-1]}

Try it online!

Repeatedly reduces by elementwise subtraction, and then returns the last number of each list in reverse.

Explanation:

{                                  }  # Anonymous code block
      $_,               ...   # Create a sequence starting from the input
         {             }      # Where each element is
            .[]Z-.skip          # Each element minus the next element
          @(          )         # Arrayified
                           1  # Until the list has one element left
 [R,]                                # Reverse the sequence
     (                     )[*;   ]  # For every list
                               *-1   # Take the last element



1

Charcoal, 19 bytes

Fθ«PI§θ±¹↑UMθ⁻§θ⊖λκ

Try it online! Link is to verbose version of code. Explanation:

Fθ«

Loop once for each term in the original list.

PI§θ±¹↑

Print the last term in the list, but move the cursor to the beginning of the previous line, so that the terms are output in reverse order.

UMθ⁻§θ⊖λκ

Compute the deltas, inserting a dummy value at the beginning so that we can use an operation that doesn't change the length of the list.




1

C, 76 bytes

i=0;int*f(int*a,int n){for(;i<n;a[i++]=a[i]-a[i+1]);if(!n)return a;f(a,n-1);}  

input : (*a = pointer to array, n = last element's index of that array)
output : return int* = output

Explanation
going from right side to up, as the last elements are same in both input and output the loop inside function simply finds next higher numbers in the triangle gradually reaching to the top leaving the answer intact in the end.

ungolfed(from C++)

#include <iostream>
#define SIZE_F 5

int*recFind(int*a, int n) {
    int i = 0;
    while (i < n)
        a[i++] = a[i] - a[i+1];
    if (!n) return a;
        recFind(a, n - 1);
}
int main()
{
    int first[SIZE_F],*n;
    for (int i = 0; i < SIZE_F; i++)
        std::cin >> first[i];

    n = recFind(first, SIZE_F - 1);//size - 1
    for (int i = 0; i < SIZE_F; i++)
        std::cout << n[i];
}

1

Japt, 11 9 bytes

Nc¡=äa
yÌ

Try it

2 bytes saved thanks to Oliver.

12 11 bytes

_äa}hUÊN yÌ

Try it

1 byte saved thanks to Oliver.



@Oliver, not thinking to use y(f) is bad enough, but completely forgetting the newline is unforgivable! Will update shortly. Thanks :)
Shaggy

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.