Fibonacci tarzı matris genişletme


25

Her satır ve daha sonra bir matrisin sütunu için, o satırdaki veya sütundaki son iki girişin toplamıyla ek bir giriş ekleyebiliriz. Örneğin, aşağıdaki giriş matrisi ile:

[ 1 1 1 ]
[ 2 3 4 ]

Elde edilen matris şöyle olacaktır:

[ 1 1 1 2 ]
[ 2 3 4 7 ]
[ 3 4 5 9 ]

Bir N tamsayısı ve en az 2x2 büyüklüğünde bir [X, Y] matrisi girişi göz önüne alındığında, yukarıdaki genişleme N kere gerçekleştirilir ve sonuç verilir. Elde edilen matris her zaman [X + N, Y + N] boyutunda olacaktır.

Örnekler:

Input:                     Output:

2, [ 0 0 ]                 [ 0 0 0 0 ]
   [ 0 0 ]                 [ 0 0 0 0 ]
                           [ 0 0 0 0 ]
                           [ 0 0 0 0 ]


3, [ 1 1 1 ]               [ 1  1  1  2  3  5 ]
   [ 2 3 4 ]               [ 2  3  4  7 11 18 ]
                           [ 3  4  5  9 14 23 ]
                           [ 5  7  9 16 25 41 ]
                           [ 8 11 14 25 39 64 ]

Yanıtlar:


8

MATL , 13 14 15 16 20 21 bayt

2*:"!tP2:Y)sv

1 byte kaldırmak için teşekkürler @ Zgarb!

Çevrimiçi deneyin!

2*         % implicitly input number N and multiply by 2
:          % create vector [1,2,...,2*N]
"          % for loop: do this 2*N times
  !        %   transpose. Implicitly input matrix in the first iteration
  tP       %   duplicate and flip vertically
  2:       %   vector [1,2]
  Y)       %   pick submatrix formed by the first two rows
  s        %   sum of each column
  v        %   append as a new row
           % end for
           % implicit display

1
MATL'yi tanımıyorum, fakat 2Niki Nkez döngü yapmaktan daha uzun döngü süresi değil mi?
Zgarb

Tabii @Zgarb! Bunu nasıl özledim? Teşekkürler!!
Luis Mendo

MATL, bir sayıyı iki katına çıkarmak için yerleşik mi?
Zgarb

@ Zgarb Hayır. İhtiyacınız var 2*(postfix notation). Belki bir karakter dahili yerleşik olmalıdır, sık kullanılır. Ayrıca 2^(kare). Ama kod alanım tükeniyor :-)
Luis Mendo

6

J, 19 bayt

(v"1@v=.,[+&{:}:)^:

Bu sayıyı solda alan ve matrisi sağdan alan bir fiil üreten bir zarf tanımlar. İkinci örnek için, verir

  3 ((v"1@v=.,[+&{:}:)^:) 2 3 $ 1 1 1 2 3 4
1  1  1  2  3  5
2  3  4  7 11 18
3  4  5  9 14 23
5  7  9 16 25 41
8 11 14 25 39 64

açıklama

(v"1@v=.,[+&{:}:)^:  Left argument x, right argument y
(               )^:  Repeat x times:
     v=.               Bind the following verb to v, and apply to y:
         [    }:         y and y-without-last-item
          +&{:           Sum of their last items
        ,                Append that to y
                       (v automatically threads to rows)
 v"1@                  then apply v to columns

3

K, 23 bayt

{x(2({x,+/-2#x}'+)/)/y}

Eylemde:

  {x(2({x,+/-2#x}'+)/)/y}[3;(1 1 1;2 3 4)]
(1 1 1 2 3 5
 2 3 4 7 11 18
 3 4 5 9 14 23
 5 7 9 16 25 41
 8 11 14 25 39 64)

Burada dene .


lider {xve y}
izleri

3

Jöle, 15 13 12 bayt

@ Bayt tarafından -1 bayt

ṫ-S;@"Z
ÇḤ}¡

@ LuisMendo'nun MATL cevabı gibi, bu da bir eksen boyunca dönüşüm yapmadan önce diziyi aktarır. Bu nedenle, işlevi 2 * n kez çağırmamız gerekir.

ṫ-S;@"Z       Helper link. Input: x (2D array)
 -              Numeric literal: -1
ṫ               Get x[-1:], i.e. last two rows in x
  S             Sum
   ;@"          Append each to x. " is 'zipWith'; @ switches argument order.
      Z         Transpose the array.
ÇḤ}¡          Main link. Input: a, n
Ç               Call the last link on a
 Ḥ}             2n
   ¡            times.

Burada dene .


2

ES6, 134 bayt

(n,a)=>[...a.map(b=>[...b,...Array(n)].map(c=>(c<1/0?0:c=a+d,d=a,a=c))),...Array(n)].map(b=>(b?0:b=[...a].map((c,j)=>c+d[j]),d=a,a=b))

Açıklama:

(n,a)=> // arguments n is number to expand, a is original array
    [...
        a.map(b=> // for each row in a
            [...b,...Array(n)] // append n elements to the row
            .map(c=>(c<1/0?0:c=a+d,d=a,a=c))) // scan the elements and fill the new ones by summing the previous two
        ,...Array(n)] // append n rows
    .map(b=>(b?0:b=[...a].map((c,j)=>c+d[j]),d=a,a=b)) // scan the rows and fill the new rows by summing the previous two rows

2

Haskell, 67 bayt

o%m=m++[o(+)(last m)$last$init m]
(!!).iterate(map(id%).(zipWith%))

Kullanım örneği:

*Main> ( (!!).iterate(map(id%).(zipWith%)) ) [[1,1,1],[2,3,4]] 3
[[1,1,1,2,3,5],[2,3,4,7,11,18],[3,4,5,9,14,23],[5,7,9,16,25,41],[8,11,14,25,39,64]]

Nasıl çalışır:

(!!).iterate(    ...         )  -- repeatedly apply ... to the first agrument and
                                -- pick the iteration defined by the second arg
                   (zipWith%)   -- for one iteration add a new row and
          map(id%)              -- then a new element at the end of each each row

o%m                             -- add row or element at the end of a row resp.
                                -- argument o is a "modify function"
                                --          m the whole matrix or a row
 m++[    (last m)(last$init m)] -- take m and append the result of combining the
                                -- last and 2nd last element of m
     o(+)                       -- with a modified version of (+)
                                -- modification is none (aka. id) when adding an
                                -- element to the end of a row and
                                -- zipping elementwise (zipWith) when adding a row

Ben bir hasnell acemi değilim. Ben elimden gelenin sudo apt-get install haskell-platformen ghciiyisini yaptım ve bana bilgi veren REPL'i çalıştırıyorum Prelude> . Yapıştırdığımda o%m=m++[o(+)(last m)$last$init m]alırım <interactive>:2:4: parse error on input '='. Bunu bir kaynak dosyadan çalıştırarak veya REPL'de küçük bir prim verebilir misiniz?
Dijital Travma,

@DigitalTrauma: Ya o%m=...satırı (ve sadece bu satırı) bir dosyaya koyalım diyelim fib-matrix.hs. Ardından tanımları yüklemek için :l fib-matrix.hskomutunu kullanabilir ve ghcikullanım örneğimde açıklandığı gibi ana işlevi çağırabilirsiniz. - Veya kullan let o%m=... in ( (!!). ... ) [[1,1,1]...] 3.
nimi

1
@DigitalTrauma: oh, 3. bir yol var: ana fonksiyona bir isim verin, örneğin f=ikinci satırın önüne bir tane ekleyin :, f=(!!).iterate...her iki satırı da bir dosyaya kaydedin ve yükleyin l: <filename.hs>. Sonra arayabilirsin f [[1,1,1],[2,3,4]] 3, vb.
nimi

Bunu geçerli haskell olarak kabul edeceğime emin değilim, üst satır bir fonksiyon tanımıdır ve REPL'de kullanım için modifikasyona ihtiyaç duyar, ancak 2. satır sadece REPL'de kullanılabilir.
Daniel Hill,

@DanielHill: meta üzerinde global yardımcı fonksiyonlara bağlı adsız fonksiyonlara izin veren bir konu var .
nimi

2

CJam, 17 16 bayt

q~2*{~_2$.+]z}*p

Giriş formatı önce bir matristir (CJam tarzı 2D dizisi olarak) ve daha sonra yineleme sayısıdır.

Burada test et.

açıklama

Bunun, diğer herkesle aynı çözüm olduğu ortaya çıktı:

q~      e# Read and evaluate input.
2*      e# Double the iteration count.
{       e# Run this block that many times...
  ~     e#   Dump all rows on the stack.
  _     e#   Copy the last row.
  2$    e#   Copy the penultimate row.
  .+    e#   Vectorised addition.
  ]     e#   Wrap all rows in a new array.
  z     e#   Transpose such that the next iteration processes the other dimension.
}*
p       e#   Pretty-print.

1

Cidden, 20 bayt

,,τ"┬`;d@d@X+@q`M"£n

Daha sonra, giriş (2B liste olarak) matris alır N. 2B liste çıkarır.

Bu sürüm bir nedenle çevrimiçi tercüman üzerinde çalışmıyor, ancak bu ön yarışma görevi ile çalışıyor .

23 bayt için çevrimiçi çalışan bir sürüm:

,τ",┬`;d@d@X+@q`M"nkΣ£ƒ

Girdiyi ters sırada ( Nsonra matris) alır.

Çevrimiçi deneyin!

Bir süre uyuduktan sonra bir açıklama ekleyeceğim. Tercüman hatalarının etrafında çalışmak hiç eğlenceli değil.


1

Pyth, 13 12 bayt

u+Rs>2dCGyEQ

Çevrimiçi deneyin. Test odası.

Çoğu cevabı aynı algoritmayı kullanır. İlk satırdaki ve nikinci satırdaki matrisi girdi olarak 2B dizi olarak alır .

açıklama

u        yEQ     do 2*N times, starting with input matrix:
       CG          transpose
 +R                append to each row:
   s                 sum of
    >2d              last 2 elements of row

1

Matlab, 60 bayt

İlk önce Matlab'ın fantezi endeksleme yöntemleriyle (yani A(end+1,:)=sum...) uğraşıyordum , bu nadir durumda basit birleştirmenin Matlab'da daha ucuz olduğunu fark etmeden önce. Çok kötü, bunu gerçek bir işleve dönüştürmek zorunda kaldım. Octave ile de çalışmalı.

function A=f(A,n)
for i=1:2*n
A=[A;sum(A(end-1:end,:))]';end

Bunun nasıl bir örnektir herhalde değil algoritmaları yapmak. A = 2x2, n = 1000 için bu algoritma dizüstü bilgisayarımda zaten 5 saniye sürüyor, n = 2000 ise neredeyse 50 saniye! (veya A, gpuArraygüvenilir Quadro 1000M'ye teşekkür ediyorsa yaklaşık 30s )


Matlab'ın bir kopyası bende değil. Bunu GNU oktavında çalıştırabilir miyim? Eğer öyleyse talimat verebilir misin?
Dijital Travma

1
Evet, Matlab olarak adlandırdım çünkü herhangi bir Octave spesifik fonksiyon kullanmıyor. Basitçe fm adlı bir dosyaya koyun ve örneğin çalıştırınf([0,1;2,3],1000)
Sanchises

Anlıyorum. 1) olarak kaydedin f.m. 2) Başlat octave. 3) load f.m; f([1,1,1;2,3,4],3)REPL komut istemine yapıştırın - benim için çalışıyor.
Dijital Travma

Öyle diyorsan! Sadece oktav çevrimiçi web sitesini kullanıyorum, bu yüzden başka türlü nasıl çalışması gerektiği hakkında hiçbir fikrim yok. Oradan permalink edip edemeyeceğimi göreceğim
Sanchises

1

Java, 2179 bayt

Sadece çalıştı: - Bu kod Java dilinde.

import java.util.Scanner;

public class FebonnaciMatrix {
        static Scanner scan=new Scanner(System.in);

        public static void main(String[] args) {

        int x,y;
        System.out.println("For the Array to Work Upon:- ");

        System.out.println("Enter the Row:- ");
        int row=scan.nextInt();
        System.out.println("Enter the Column:- ");
        int col=scan.nextInt();

        int inpArr[][]=new int[row][col];

        System.out.println("Enter the values");
        inpArr=inpValues(row,col);

        System.out.println("The Input Array is:- ");
        display(inpArr,row,col);

        System.out.println("Input the Array size of Febonacci Array ");

        System.out.println("Enter the Row");
        int frow=scan.nextInt();
        System.out.println("Enter the Column");
        int fcol=scan.nextInt();

        int febArr[][]=new int[frow][fcol];
        febArr=copyValue(inpArr,febArr,row,col);

        for(x=0;x<row;x++)
        {
            for(y=col;y<fcol;y++)
                febArr[x][y]=febArr[x][y-2]+febArr[x][y-1];
        }

        for(x=row;x<frow;x++)
        {
            for(y=0;y<fcol;y++)
                febArr[x][y]=febArr[x-2][y]+febArr[x-1][y];
        }

        System.out.println();
        System.out.println("The Febonacci Array:-");
        display(febArr,frow,fcol);
    }

    static void display(int[][] arr,int row,int col)
    {
        int x,y;
        for(x=0;x<row;x++)
        {
            for(y=0;y<col;y++)
                System.out.print(arr[x][y]+"\t");
            System.out.println();
        }
    }

    static int[][] inpValues(int row,int col)
    {
        int arr[][]=new int[row][col];
        int x,y;
        for(x=0;x<row;x++)
        {
            for(y=0;y<col;y++)
            {
                System.out.print("Enter the value:- ");
                arr[x][y]=scan.nextInt();
            }
        }
        return arr;
    }

    static int[][] copyValue(int[][] old, int[][] ne, int row,int col)
    {
        int x,y;    
        for(x=0;x<row;x++)
        {
            for(y=0;y<col;y++)
                ne[x][y]=old[x][y];

        }
        return ne;
    }

}

1
Programlama Bulmacaları ve Code Golf'a Hoş Geldiniz! Soru kod-golf olarak adlandırılıyor, bu da cevapların mümkün olan en kısa kod miktarına (bayt cinsinden) yazılmakta olduğu anlamına geliyor. Cevabınız sorunu iyi çözebilir, ancak kodu "golf" yapmaya çok az teşebbüs görüyorum (yani mümkün olduğu kadar kısa). Bunu kodunuzla yapmak için pek çok önemli fırsat var, örneğin 1-char isimli değişkenler ve gereksiz beyaz boşlukların kaldırılması. Bunun ötesinde , özellikle java için bu ipuçlarını okuyabilirsiniz
Digital Trauma,

... code-golf için wiki etiketine bakın , özellikle kod golfüne nasıl cevap vermeliyim? Herhangi bir ipucu? Bölüm. Ayrıca, java'nın diğer birçok dille karşılaştırıldığında kısa koddan aşağıya golf oynamak zor olduğunu da unutmayın. Bununla birlikte, bu durum sizi caydırmamalı - iyi bir golf java cevabınız varsa, diğer cevaplardan daha uzun olsa bile, oldukça popüler olması muhtemeldir. Zekice bükülen kısa esolang cevaplarından kaçının - bu topluluk dil engellerini hesaba katmakta iyi olma eğilimindedir.
Dijital Travma

@ DigitalTrauma- Teşekkürler ... bana bunun için bir yenidoğan olarak yardım ettiğin için ... Kesinlikle bağlantılar üzerinden gidip yeni bir kod
bulacağım

Yeni bir kullanıcı olduğunuzdan, daha iyi biçimlendirme için cevabınızı düzenleme özgürlüğünü kullandım. Özellikle a) dili ve bayt sayısını belirten açık bir başlık, b) kodunuzun kod biçimlendirmesi. Tüm stackexchange sitelerinde kod biçimlendirme kolaydır - tüm kod satırlarınızı 4 boşlukla önekleyin. Aslında daha kolay - düzenleme kutusunda, kodunuzu seçin, ardından {}düzenleme kutusunun üstündeki simgesini tıklayın - bu otomatik olarak bu ön eki gerçekleştirir.
Dijital Travma

Tamam ... Sadece kontrol edeceğim ...
Dhruv Govila

1

Python, 103 105 bayt

f=lambda n,L:f(n-1,[l+[sum(l[-2:])]for l in L])if n else L
lambda n,L:zip(*f(n,map(list,zip(*f(n,L)))))

Anonim işlev listeyi alır ve özyinelemeli işleve geçer f. Çıktı aktarılır ve daha sonra ftekrar geçirilir , ardından ikinci harcanın çıktısı yeniden aktarılır. Çıktı, trollerin bir listesidir

Bakuriu sayesinde iki bayt kurtardı


1
n>0basitçe olabilir n, çünkü pozitif ile başlar ve değerine nulaştığınızda 0yanlıştır.
Bakuriu


0

Perl 6 ,  87 73  71 bayt

->\c,\m{for ^c {.[+*]=[+] .[*X-1,2]for m;m.push: [map {[+] m[*X-1,2;$_]},m[0].keys]};m}
->\c,\m{for ^c {.[+*]=[+] .[*X-1,2]for m;m[+*]=[m[*-2;*] »+«m[*-1]]};m}
->\c,\m{for ^c {.[+*]=[+] .[*X-1,2]for m;m[+*]=[m[*-2;*]Z+m[*-1;*]]};m}
-> \c, \m {
  for ^c { # 0 ..^ c

    # each row
    .[+*]                            # new column at the end of row ($_)
          = [+] .[ * X- 1,2 ]        # add up the last two entries in row ($_)
                              for m; # for every row

    # too bad this was longer than the above code
    # m[*;+*]=map *+*,m[*;*-2,*-1]

    # each column
    m[ +* ]                 # add new row
            = [             # make it an Array rather than a List
                m[ *-2; * ] # the second to last row
                »+«         # added columnwise with
                m[ *-1 ]    # the last row
              ]
  };

  m # return the result
}

Kullanımı:

use v6.c;
# give it a lexical name
my &code = ->\c,\m{  }

my @return = code 3,[[1,1,1],[2,3,4]];

put '[ ', $_».fmt('%2d'), ' ]' for @return;

put '';

put @return.perl ~~ {S:g/' '//};
[  1  1  1  2  3  5 ]
[  2  3  4  7 11 18 ]
[  3  4  5  9 14 23 ]
[  5  7  9 16 25 41 ]
[  8 11 14 25 39 64 ]

[[1,1,1,2,3,5],[2,3,4,7,11,18],[3,4,5,9,14,23],[5,7,9,16,25,41],[8,11,14,25,39,64]]

Bunu yapıştırmak perl6 bana bazı hatalar veriyor . Perl acemi değilim - ne yapıyorum yanlış?
Dijital Travma

@DigitalTrauma Üzgünüm, kullanımın yukarıdaki kodla değiştirilmesi gerektiğini my &code = ->\c,\m{ … }açıkça belirtmek için ->\c,\m{ … }kullanmalıydım. Genellikle üstü kapalı $_ya @_da açık bir yer tutucu parametreleri kullanırım $^açünkü daha kısa olma eğilimindedirler. Sadece düşünmedim. Ayrıca yeterince yeni bir sürüm kullandığınızdan emin olun ( $*PERL.compiler.version !before 2015.12)
Brad Gilbert b2gills

@DigitalTrauma Ayrıca gidebilirsiniz # perl6 freenode.net ve kullanım camelia kanaldan (bu şekilde) (Precede ile çizgiler kod çalıştırmasına m: msg camelia doğrudan Ayrıca can ve boşluk)
Brad Gilbert b2gills
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.