逆さまのピラミッドの追加…逆転!


22

逆さまピラミッド追加は、数字のリストを取得し、1つの数字に達するまで連続して追加するプロセスです。

番号を指定すると2, 1, 1、次のプロセスが発生します。

 2   1   1
   3   2 
     5

これは数字で終わり5ます。


あなたのタスク

上下ピラミッド(昇順)の右側を指定して、元のリストを返すプログラムまたは関数を作成します。

新しい追加チャレンジ: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
短い言語を見つけることができないという自由な洞察:
f[abcde]=[1464101331001210001100001][abcde]
Lynn

4
参考までに、これはCodeWars kataと同じです。
ggorlen

6
@ggorlen私は知っています。私はカタ:)作られたものだ
Whimpers

8
Try doing this in less than O(n)確かに、nサイズの配列を割り当てたり、その中のO(n)アイテムをO(n)の複雑さより速く変更することは不可能ですか?
私の代名詞は

回答:


17

JavaScript(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[]

@オリバー、はい
シャギー



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
ニックケネディ

IƬUZḢA与えられた質問でも動作します。どこかにバイトが保存されているのだろうか…
ジョナサンアラン

ạƝƬZṪ€動作しますが、再び6です。
ニックケネディ

はい、私はそのバリアントに気づきました。私は今あまり望んでいない。
ジョナサンアラン

5バイトだけを投稿しましたが、ピラミッド構築後の部分に関するあなたのアプローチとは少し異なります。
アウトゴルファーのエリック

4

MathGolf14 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

パリ/ GP、36バイト

@Lynnのコメントに基づく:

f[abcde]=[1464101331001210001100001][abcde]

Pari / GPにはPascalマトリックス用のビルトインがあり、その逆はまさに必要なマトリックスです。

[1000011000121001331014641]1=[1000011000121001331014641]

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

オンラインでお試しください!


3

R69 67バイト

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

オンラインでお試しください!

列ベクトルを返します。

キリルLのおかげで-2バイト

Lynnのコメントにも基づく:

3 - 1

f[abcde]=[1464101331001210001100001][abcde]

他のRの回答よりも長いですが、ゴルフに挑戦してみるのは興味深いアプローチでした。


2

Javascript(ES6)、127バイト

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}

元のコード

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;
}

ああ、私は...多くの...前の答えに...を失いました...



2

05AB1E12 11 バイト

R.¥.Γ¥}¨ζнR

@JonathanAllanのJelly回答のポート。ただし、この場合のJellyのより便利な組み込みについてはゼリーです。;)@Emignaの
おかげで-1バイト。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

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
R.¥.Γ¥}¨デルタが入力であるリストから開始することで、バイトを保存できます。
エミグナ

@Emignaああ、プリペンドでバイトを保存するために、デルタのあるループにアンデルタします。:)ありがとう!
ケビンクルーッセン


2

Perl 6、37バイト

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

オンラインでお試しください!

要素ごとの減算により繰り返し減少し、各リストの最後の数を逆順に返します。

説明:

{                                  }  # 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

、19バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Fθ«

元のリストの各用語に対して1回ループします。

PI§θ±¹↑

リストの最後の用語を出力しますが、用語が逆順で出力されるように、カーソルを前の行の先頭に移動します。

UMθ⁻§θ⊖λκ

リストの長さを変更しない操作を使用できるように、最初にダミー値を挿入して、デルタを計算します。




1

C、76バイト

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);}  

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

説明
までに右側から行く、最後の要素は、入力と出力の両方に同じよう関数内のループは、単純に三角形の次に高い番号は徐々に終わりにそのまま答えを残してトップに達する見つけました。

ungolfed(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

Japt11 9バイト

Nc¡=äa
yÌ

それを試してみてください

Oliverのおかげで2バイト節約されました。

12 11バイト

_äa}hUÊN yÌ

それを試してみてください

Oliverのおかげで1バイト節約されました。



@Oliverは、使用することを考えていなくてもy(f)十分ですが、改行を完全に忘れることは許されません!まもなく更新されます。ありがとう:)
シャギー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.