Dizin toplamı ve matrisimi soy


9

Dizin toplamı ve matrisimi soy

Tercih ettiğiniz dilde bir matris / 2d dizisi verildi

Giriş:

  • Matrisin her zaman tek bir uzunluğu olacaktır
  • Matris her zaman mükemmel kare olacaktır
  • Matris değerleri, dilinizde herhangi bir tamsayı olabilir (pozitif veya negatif)

Misal:

1  2  3  4  5  6  7
2  3  4  5  6  7  8
3  4  50 6  7  8  9
4  5  6 100 8  9  10
5  6  7  8 -9  10 11
6  7  8  9  10 11 12
7  8 900 10 11 12 0

Tanımlar:

  • "Merkezi sayı", sol, sağ, yukarı ve aşağı aynı sayıda sayıya sahip sayı olarak tanımlanır

Bu durumda en orta 100

  • "Dış kabuk", x ve y dizinlerinin veya 0 veya matris boyutunun olduğu sayıların toplamıdır

1  2  3  4  5  6  7
2                 8
3                 9
4                 10
5                 11
6                 12
7  8 900 10 11 12 0

Senin görevin:

Merkezi sayıya, her birindeki değerleri 1 tabanlı dizinleriyle çarptıktan sonra her satır ve sütunun toplamını ekleyin

Örneğin tek bir satır

4  5  6  7  8

her numara için

number * index + number * index.....

4*1 + 5*2 + 6*3 + 7*4 + 8*5 => 100

misal:

 2 -3 -9  4  7  1  5  => 61
-2  0 -2 -7 -7 -7 -4  => -141
 6 -3 -2 -2 -3  2  1  => -10
 8 -8  4  1 -8  2  0  => -20
-5  6  7 -1  8  4  8  => 144
 1  5  7  8  7 -9 -5  => 10
 7  7 -2  2 -7 -8  0  => -60
                         |
78 65 60 45 -15 -89 10   => 154
                     |
                     => -16
  • Tüm satırlar ve sütunlar için bu değerleri birleştirirsiniz.
  • Şimdi bunları da toplamıyorsunuz => 154-16 = 138
  • Bu sayıyı "merkezi sayıya" ekler ve matrisin "dış kabuğunu" kaldırırsınız

 0 -2 -7 -7 -7     => -88
-3 -2 -2 -3  2     => -15
-8  4 1+138 -8  2  => 395
 6  7 -1  8  4     => 69
 5  7  8  7 -9     => 26

19 69 442 30 -26

tek bir sayı elde edene kadar bunu yap

-2 -2 -3     => -15
 4  1060 -8  => 2100
 7 -1  8     => 29

27 2115 5
  • 2114 + 2147'den 1060'a ekle
  • "Dış kabuğu" çıkarın ve 5321 olsun
  • Şimdi tek bir sayımız kaldı

bu çıktı!

test senaryoları:

-6

-6

-7 -1  8
-4 -6  7
-3 -6  6

2

 6  7 -2  5  1
-2  6 -4 -2  3
-1 -4  0 -2 -7
 0  1  4 -4  8
-8 -6 -5  0  2

-365

 8  3  5  6  6 -7  5
 6  2  4 -2 -1  8  3
 2  1 -5  3  8  2 -3
 3 -1  0  7 -6  7 -5
 0 -8 -4 -9 -4  2 -8
 8 -9 -3  5  7  8  5
 8 -1  4  5  1 -4  8

17611

-9 -7  2  1  1 -2  3 -7 -3  6  7  1  0
-7 -8 -9 -2  7 -2  5  4  7 -7  8 -9  8
-4  4 -1  0  1  5 -3  7  1 -2 -9  4  8
 4  8  1 -1  0  7  4  6 -9  3 -9  3 -9
-6 -8 -4 -8 -9  2  1  1 -8  8  2  6 -4
-8 -5  1  1  2 -9  3  7  2  5 -6 -1  2
-8 -5 -7 -4 -9 -2  5  0  2 -4  2  0 -2
-3 -6 -3  2 -9  8  1 -5  5  0 -4 -1 -9
-9 -9 -8  0 -5 -7  1 -2  1 -4 -1  5  7
-6 -9  4 -2  8  7 -9 -5  3 -1  1  8  4
-6  6 -3 -4  3  5  6  8 -2  5 -1 -7 -9
-1  7 -9  4  6  7  6 -8  5  1  0 -3  0
-3 -2  5 -4  0  0  0 -1  7  4 -9 -4  2

-28473770

Bu bir codegolf meydan okumasıdır, bu nedenle en düşük bayt sayısına sahip program kazanır



3
negatif sayılar neden bir sorun olur? Zorluğun esolangs için ayarlanması gerektiğini düşünmüyorum ama belki başka bir yol daha uygun
downrep_nation

@LuisMendo Bence bu bir problem değil, "Matris değerleri dilinizde herhangi bir tamsayı olabilir" kuralı benim için, eğer dilinizde negatif sayılar yoksa, bunları desteklememesi gerektiği anlamına gelir.
ölümcül olun

aslında bu doğru. ancak daha sonra test
senaryoları

2
"Ben meydan okuma esolangs için ayarlanması gerektiğini sanmıyorum ama belki başka bir yol daha uygun" taşa kazınmış olmalıdır
edc65

Yanıtlar:


4

MATL , 36 34 bayt

tnq?`t&+stn:*sytn2/)+ 7M(6Lt3$)tnq

Giriş, ;satır ayırıcı olarak bir 2D dizidir

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

tnq       % Take input. Duplicate, get number of elements, subtract 1
?         % If greater than 0
  `       %   Do...while
    t     %     Duplicate
    &+    %     Sum matrix with its transpose
    s     %     Sum each column. Gives a row vector
    tn:   %     Vector [1 2 ...] with the same size
    *     %     Multiply element-wise
    s     %     Sum of vector. This will be added to center entry of the matrix
    y     %     Duplicate matrix
    tn2/  %     Duplicate, get half its number of elements. Gives non-integer value
    )     %     Get center entry of the matrix, using linear index with implicit rounding
    +     %     Add center entry to sum of previous vector
    7M    %     Push index of center entry again
    (     %     Assgined new value to center of the matrix
    6Lt   %     Array [2 j1-1], twice. This will be used to remove shell
    3$)   %     Apply row and col indices to remove outer shell of the matrix
    tnq   %     Duplicate, number of elements, subtract 1. Falsy if matrix has 1 entry
          %   End do...while implicitly. The loop is exited when matrix has 1 entry
          % End if implicitly
          % Display stack implicitly

4

Python 2.7, 229 bayt

Bu benim böyle bir şeye ilk denemem, umarım bu boyun eğme ile tüm kurallara uydum. Bu sadece bir liste listesini parametresi olarak alan bir işlevdir. Toplamların ve liste kavrayışının biraz daha kısaltılabileceğini hissediyorum, ama benim için çok zordu. : D

def r(M):
  t=len(M)
  if t==1:return M[0][0]
  M[t/2][t/2]+=sum(a*b for k in [[l[x] for l in M]for x in range(0,t)]for a,b in enumerate(k,1))+sum([i*j for l in M for i,j in enumerate(l,1)])
  return r([p[+1:-1]for p in M[1:-1]])

Birkaç bayt tıraş etmeme yardım ettiği için Easterly Irk'a teşekkürler.


1
Operatörler ( ...) + sum([i*j...-> ...)+sum([i*j...) arasında birkaç boşluk kaldırabilirsiniz , ancak genel olarak, büyük ilk yazı !!!!
Rɪᴋᴇʀ

oooh bunu kaçırdı. Teşekkürler!
Jeremy

1
Ayrıca, ...]for ...çalışır. Bunun gibi en az 2 boşluk kaldırabilirsiniz. (listenin sonu for döngüsünü vurur)
Rɪᴋᴇʀ

3

C #, 257 bayt

İşte esolang olmayan bir cevap

void f(int[][]p){while(p.Length>1){int a=p.Length;int r=0;for(int i=0;i<a;i++)for(int j=0;j<a;j++)r+=(i+j+2)*p[i][j];p[a/2][a/2]+=r;p=p.Where((i,n)=>n>0&&n<p.Length-1).Select(k=>k.Where((i,n)=>n>0&&n<p.Length-1).ToArray()).ToArray();}Console.Write(p[0][0]);

ungolfed:

void f(int[][]p)
    {
        while (p.Length>1)
        {
            int a=p.Length;
            int r=0; //integer for number to add to middle
            for (int i = 0; i < a; i++)
                for (int j = 0; j < a; j++)
                    r +=(i+j+2)*p[i][j]; //add each element to counter according to their 1 based index
            p[a / 2][a / 2] += r; //add counter to middle
            p = p.Where((i, n) => n > 0 && n < p.Length - 1).Select(k => k.Where((i, n) => n > 0 && n < p.Length - 1).ToArray()).ToArray(); //strip outer shell from array
        }
        Console.Write(p[0][0]); //print last and only value in array
    }

2
Hey, J bir esolang değil.
mil

Eğer dahil etmezseniz bu derleme değil using System.Linqve using System. Yine de kurallar tarafından gerekli olup olmadığından emin değilim.
Yytsi

onun değil tam bir program, onun sadece bir işlev kadar bildiğim kadarıyla onun ok. yani, ben de App.config ve tüm bayt özellikleri ve makefile eklemek gerekir? no
downrep_nation

@downrep_nation Sadece garip, çünkü bazı insanlar sadece bir işlev olduğunda onları kaynağa dahil ettiler ve baytları skora dahil ettiler.
Yytsi

Şimdi düşündüğümde, en az ithal etmen gereken çizgideyim System.Linq. Belirli özellikleri kullanmak için içe aktarma gerektiren diğer diller aynı işlemden geçer, bu yüzden her modülün C # 'da belleğe yüklendiğini varsaymak haksızlık olur.
Yytsi

2

J, 66 bayt

([:}:@}."1@}:@}.]+(i.@,~=](]+*)<.@-:)@#*[:+/^:2#\*]+|:)^:(<.@-:@#)

Meydan okumada açıklanan sürece dayalı, doğrudan ileri yaklaşım.

[:+/^:2#\*]+|:toplamı alır. ]+(i.@,~=](]+*)<.@-:)@#*merkezi toplamı arttırmanın özellikle çirkin bir yoludur. [:}:@}."1@}:@}.dış kabuğu çıkarır. Muhtemelen bunu yapmanın daha iyi bir yolu var.

kullanım

   f =: ([:}:@}."1@}:@}.]+(i.@,~=](]+*)<.@-:)@#*[:+/^:2#\*]+|:)^:(<.@-:@#)
   f _6
_6
   f _7 _1 8 , _4 _6 7 ,: _3 _6 6
2
   f 6 7 _2 5 1 , _2 6 _4 _2 3 , _1 _4 0 _2 _7 , 0 1 4 _4 8 ,: _8 _6 _5 0 2 
_365
   f 8 3 5 6 6 _7 5 , 6 2 4 _2 _1 8 3 , 2 1 _5 3 8 2 _3 , 3 _1 0 7 _6 7 _5 , 0 _8 _4 _9 _4 2 _8 ,8 _9 _3 5 7 8 5 ,: 8 _1 4 5 1 _4 8
17611
   f (13 13 $ _9 _7 2 1 1 _2 3 _7 _3 6 7 1 0 _7 _8 _9 _2 7 _2 5 4 7 _7 8 _9 8 _4 4 _1 0 1 5 _3 7 1 _2 _9 4 8 4 8 1 _1 0 7 4 6 _9 3 _9 3 _9 _6 _8 _4 _8 _9 2 1 1 _8 8 2 6 _4 _8 _5 1 1 2 _9 3 7 2 5 _6 _1 2 _8 _5 _7 _4 _9 _2 5 0 2 _4 2 0 _2 _3 _6 _3 2 _9 8 1 _5 5 0 _4 _1 _9 _9 _9 _8 0 _5 _7 1 _2 1 _4 _1 5 7 _6 _9 4 _2 8 7 _9 _5 3 _1 1 8 4 _6 6 _3 _4 3 5 6 8 _2 5 _1 _7 _9 _1 7 _9 4 6 7 6 _8 5 1 0 _3 0 _3 _2 5 _4 0 0 0 _1 7 4 _9 _4 2)
_28473770

2

Brachylog , 114 bayt

{l1,?hh.|:{:Im:I:?:{[L:I:M]h:JmN,Ll:2/D(IJ,M{$\:?c:{:{:ImN,I:1+:N*.}f+.}a+.}:N+.;'(DIJ),N.)}f.}f:7a$\:7a&.}.
brbr.

Dürüst olmak gerekirse bu iş bile şaşırdı. En azından ben Brachylog gerçekten bir yerleşik olarak "bu öğenin değişim değerine" ihtiyacı olduğunu fark ettim ...

Kullanım örneği:

?- run_from_file('code.brachylog', '[[0:_2:_7:_7:_7]:[_3:_2:_2:_3:2]:[_8:4:139:_8:2]:[6:7:_1:8:4]:[5:7:8:7:_9]]', Z).
Z = 5321 .

açıklama

Daha okunabilir (ve daha uzun) sürüm:

{l1,?hh.|:2f:7a$\:7a&.}.
:Im:I:?:3f.
[L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.)
$\:?c:5a+.
:6f+.
:ImN,I:1+:N*.
brbr.

Kabaca her yüklemin (yani Ana Tahmin + yüklem 1 olan ilk satır hariç her satır) ne yaptığını kabaca açıklayacağım:

  • Ana yüklem + yüklem 1 {l1,?hh.|:2f:7a$\:7a&.}.: Girişin yalnızca bir satırı varsa, algoritmayı sonlandırın ve tek değeri döndürün. Aksi takdirde yüklem 2'yi tatmin eden tüm satırları bulun, sonra ortaya çıkan matrise yüklem 7'yi uygulayın, sonra transpozisyonda 7 yüklemini yapın, sonra tekrar tekrar çağırın.

  • Tahmin 2 :Im:I:?:3f.: IMatrisin th satırını alın, o satırın yüklem 3'ü tatmin eden tüm değerleri Ive matrisi ek girişler olarak bulun .

  • Tahmin 3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.): Lsatırdır, satırın Idizinidir M, matristir. N'nin Jth elementidir L. L2'ye bölünen uzunluk her ikisine eşitse Ive Jçıktı, Nmatristeki yüklem 4'ün sonucunun toplamıdır . Aksi takdirde çıktı sadece N. Bu yüklem esas olarak, merkez elemanın toplama eklenmesi dışında matrisi yeniden oluşturur.

  • Tahmin 4 $\:?c:5a+.: Matrisin her satırına ve sütununa yüklem 5'i uygulayın, çıktıyı sonuçların toplamıyla birleştirin.

  • Tahmin 5 :6f+.: Satırdaki yüklem 6'nın tüm geçerli çıktılarını bulun, çıktıyı sonuç listesinin toplamıyla birleştirin.

  • Dayanak 6 :ImN,I:1+:N*.Nolduğu Iile çıkış birleştirin sıranın inci değeri N * (I+1).

  • Tahmin 7 brbr.: Matrisin ilk ve son satırını kaldırın.


2

APL, 56 karakter

{{1 1↓¯1 ¯1↓⍵+(-⍴⍵)↑(⌈.5×⍴⍵)↑+/(⍵⍪⍉⍵)+.×⍳≢⍵}⍣(⌊.5×≢⍵)⊣⍵}

İngilizcede:

  • ⍣(⌊.5×≢⍵) "yuvarlatılmış boyutun yarısı boyutunda" tekrarlayın
  • (⍵⍪⍉⍵)+.×⍳≢⍵ matrisin iç çarpımı ve indeks vektörü ile transpozisyonu
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ 0 ile doldurulmuş matriste sonucu dönüştürme
  • 1 1↓¯1 ¯1↓ dış kabuğu kaldırır
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.