Mengindeks jumlah dan strip matriks saya

9

Mengindeks jumlah dan strip matriks saya

Diberikan matriks / array 2d dalam bahasa pilihan Anda

Memasukkan:

  • Matriks akan selalu memiliki panjang yang aneh
  • Matriks akan selalu berbentuk kuadrat sempurna
  • Nilai matriks dapat berupa bilangan bulat apa pun dalam bahasa Anda (positif atau negatif)

Contoh:

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

Definisi:

  • "Nomor sentral" didefinisikan sebagai angka yang memiliki jumlah angka yang sama di kiri, kanan, atas dan bawah

Dalam hal ini middlemost 100-nya

  • "Cangkang luar" adalah kumpulan angka-angka dengan indeks x dan y atau 0 atau ukuran matriks

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

Tugas Anda:

Tambahkan ke nomor pusat jumlah dari setiap baris dan kolom setelah mengalikan nilai di masing-masing dengan indeks berbasis 1 mereka

Satu baris misalnya

4  5  6  7  8

untuk setiap nomor

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

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

contoh:

 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
  • Untuk semua baris dan kolom Anda menggabungkan nilai-nilai ini ..
  • Sekarang Anda menjumlahkan ini juga => 154-16 = 138
  • Anda menambahkan nomor itu ke "nomor pusat" dan menghapus "kulit luar" dari matriks

 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

lakukan ini sampai Anda berakhir dengan satu nomor

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

27 2115 5
  • Tambahkan 2114 + 2147 hingga 1060
  • Hapus "kulit luar" dan dapatkan 5321
  • Sekarang kita memiliki satu nomor yang tersisa

ini hasilnya!

kasus uji:

-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

Ini adalah tantangan codegolf sehingga program dengan bytecount terendah menang

downrep_nation
sumber
Anda benar, itu kesalahan ketik
downrep_nation
3
mengapa angka negatif menjadi masalah? Saya tidak berpikir tantangannya harus menyesuaikan untuk esolang tapi mungkin sebaliknya lebih tepat
downrep_nation
@LuisMendo Saya pikir ini bukan masalah, aturan "Nilai matriks bisa berupa bilangan bulat apa pun dalam bahasa Anda" berarti bagi saya bahwa jika bahasa Anda tidak memiliki angka negatif, itu tidak seharusnya mendukungnya.
Fatalkan
sebenarnya itu benar. tapi kemudian kasus uji tidak akan berfungsi dengan baik
downrep_nation
2
"Saya tidak berpikir tantangannya harus menyesuaikan untuk esolang tapi mungkin sebaliknya lebih tepat" yang harus diukir di atas batu
edc65

Jawaban:

4

MATL , 36 34 byte

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

Input adalah array 2D dengan ;pemisah baris

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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
Luis Mendo
sumber
4

Python 2.7, 229 byte

Ini adalah upaya pertama saya pada sesuatu seperti ini, jadi semoga saya mengikuti semua aturan dengan pengiriman ini. Ini hanya fungsi yang mengambil dalam daftar daftar sebagai parameternya. Saya merasa jumlah dan pemahaman daftar mungkin bisa dipersingkat sedikit, tapi itu terlalu sulit bagi saya. : 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]])

Terima kasih kepada Easterly Irk karena membantu saya mencukur beberapa byte.

Jeremy
sumber
1
Anda dapat menghapus beberapa ruang antar operator ( ...) + sum([i*j...-> ...)+sum([i*j...), tetapi secara keseluruhan, pos pertama yang bagus !!!!
R
oooh merindukan itu. Terima kasih!
Jeremy
1
Juga ...]for ...bekerja. Anda dapat menghapus setidaknya 2 ruang seperti itu. (akhir daftar klik untuk loop)
Rɪᴋᴇʀ
3

C #, 257 byte

di sini adalah jawaban non esolang

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
    }
downrep_nation
sumber
2
Hei sekarang, J bukan esolang.
mil
Ini tidak dapat dikompilasi jika Anda tidak menyertakan using System.Linqdan using System. Saya tidak yakin apakah itu diwajibkan oleh aturan.
Yytsi
itu bukan program yang lengkap, itu hanya fungsi jadi ok sejauh yang saya tahu. maksud saya, apakah saya juga perlu memasukkan App.config dan semua byte dalam properti dan makefile? no
downrep_nation
@downrep_nation Hanya aneh, karena saya telah melihat beberapa orang memasukkannya ke dalam sumber ketika itu hanya sebuah fungsi dan mereka telah memasukkan byte pada skor.
Yytsi
Sekarang ketika saya berpikir tentang hal itu, saya pada jalur bahwa Anda harus mengimpor minimal System.Linq. Bahasa lain yang memerlukan impor untuk menggunakan fitur tertentu melalui proses yang sama, jadi saya pikir tidak adil untuk menganggap bahwa setiap modul dimuat ke memori dalam C #.
Yytsi
2

J, 66 byte

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

Pendekatan langsung berdasarkan proses yang dijelaskan dalam tantangan.

[:+/^:2#\*]+|:mendapat jumlah. ]+(i.@,~=](]+*)<.@-:)@#*adalah cara yang sangat jelek untuk meningkatkan jumlah pusat. [:}:@}."1@}:@}.menghapus kulit terluar. Mungkin ada cara yang lebih baik untuk melakukan ini.

Pemakaian

   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
mil
sumber
2

Brachylog , 114 byte

{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.

Saya kaget ini bahkan bekerja jujur. Setidaknya saya menyadari bahwa Brachylog benar-benar membutuhkan "nilai perubahan elemen itu" sebagai built-in ...

Contoh penggunaan:

?- 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 .

Penjelasan

Versi yang lebih mudah dibaca (dan lebih lama):

{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.

Saya hanya akan menjelaskan kira-kira apa yang masing-masing predikat (yaitu setiap baris kecuali yang pertama yang Predikat Utama + predikat 1) tidak:

  • Predikat utama + predikat 1 {l1,?hh.|:2f:7a$\:7a&.}.: Jika input hanya memiliki satu baris, akhiri algoritme dan kembalikan nilai satu-satunya. Lain menemukan semua baris yang memenuhi predikat 2, kemudian menerapkan predikat 7 pada matriks yang dihasilkan, kemudian predikat 7 pada transposisi, kemudian panggil secara rekursif.

  • Predikat 2 :Im:I:?:3f.: Ambil Ibaris th dari matriks, cari semua nilai baris yang memenuhi predikat 3 Idan matriks sebagai input tambahan.

  • Predikat 3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.): Ladalah baris, Iadalah indeks baris, Madalah matriks. Nadalah Jelemen ke - 10 dari L. Jika panjang Ldibagi 2 sama dengan keduanya Idan J, maka output adalah jumlah Ndengan hasil predikat 4 pada matriks. Kalau tidak, outputnya adil N. Dasar predikat ini menciptakan kembali matriks dengan pengecualian bahwa elemen tengah akan ditambahkan ke jumlah.

  • Predikat 4 $\:?c:5a+.: Terapkan predikat 5 pada setiap baris dan kolom matriks, satukan hasilnya dengan jumlah hasil.

  • Predikat 5 :6f+.: Temukan semua output yang valid dari predikat 6 pada baris, satukan output dengan jumlah dari daftar yang dihasilkan.

  • Predikat 6 :ImN,I:1+:N*.Nadalah nilai Ith dari baris tersebut, satukan hasilnya dengan N * (I+1).

  • Predikat 7 brbr.: Hapus baris pertama dan terakhir dari matriks.

Fatalisasi
sumber
2

APL, 56 karakter

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

Dalam Bahasa Inggris:

  • ⍣(⌊.5×≢⍵) ulangi "setengah ukuran dimensi bulat" -kali
  • (⍵⍪⍉⍵)+.×⍳≢⍵ produk dalam matriks dan transposinya dengan vektor indeks
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ mengubah hasil dalam matriks empuk dengan 0s
  • 1 1↓¯1 ¯1↓ menghilangkan kulit luar
lstefano
sumber