Somma l'indice e togli la mia matrice


9

Somma l'indice e togli la mia matrice

Dato un array matrix / 2d nella tua lingua preferibile

Ingresso:

  • La matrice avrà sempre una lunghezza dispari
  • La matrice sarà sempre perfettamente quadrata
  • I valori della matrice possono essere qualsiasi numero intero nella tua lingua (positivo o negativo)

Esempio:

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

definizioni:

  • Il "numero centrale" è definito come il numero che ha la stessa quantità di numeri a sinistra, a destra, su e giù

In questo caso i suoi 100 più medi

  • La "shell esterna" è la raccolta di numeri il cui indice xey è o 0 o la dimensione della matrice

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

Il tuo compito:

Aggiungi al numero centrale la somma di ogni riga e colonna dopo aver moltiplicato i valori in ciascuno per il loro indice basato su 1

Una singola riga per esempio

4  5  6  7  8

per ogni numero

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

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

esempio:

 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
  • Per tutte le righe e colonne combini questi valori.
  • Ora sommate anche queste => 154-16 = 138
  • Aggiungete quel numero al "numero centrale" e rimuovete il "guscio esterno" della matrice

 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

fallo fino a quando non finisci con un solo numero

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

27 2115 5
  • Aggiungi 2114 + 2147 a 1060
  • Rimuovere il "guscio esterno" e ottenere 5321
  • Ora ci resta un solo numero

questo è l'output!

casi test:

-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

Questa è una sfida di codegolf, quindi vince il programma con il numero di byte più basso


hai ragione, questo è un refuso
downrep_nation

3
perché i numeri negativi sarebbero un problema? Non credo che la sfida dovrebbe adattarsi agli esolang, ma forse il contrario è più appropriato
downrep_nation

@LuisMendo Penso che non sia un problema, la regola "I valori della matrice possono essere qualsiasi numero intero nella tua lingua" significa per me che se la tua lingua non ha numeri negativi, non dovrebbe supportarli.
Fatalizza il

in realtà è corretto. ma poi i casi di test non funzioneranno correttamente
downrep_nation

2
"Non credo che la sfida dovrebbe adattarsi agli esolang, ma forse il contrario è più appropriato" che dovrebbe essere inciso nella pietra
edc65

Risposte:


4

MATL , 36 34 byte

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

L'input è un array 2D con ;separatore di riga

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

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 byte

Questo è il mio primo tentativo in qualcosa del genere, quindi spero di aver seguito tutte le regole con questa presentazione. Questa è solo una funzione che accetta un elenco di elenchi come parametro. Sento che le somme e la comprensione dell'elenco potrebbero probabilmente essere ridotte un po ', ma è stato troppo difficile per me. : 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]])

Grazie a Easterly Irk per avermi aiutato a radere qualche byte.


1
Puoi rimuovere un paio di spazi tra operatori ( ...) + sum([i*j...-> ...)+sum([i*j...), ma nel complesso, ottimo primo post !!!!
Rɪᴋᴇʀ

oooh l'ho perso. Grazie!
Jeremy,

1
Inoltre, ...]for ...funziona. Puoi rimuovere almeno 2 spazi come quello. (la fine dell'elenco raggiunge il ciclo for)
Rɪᴋᴇʀ

3

C #, 257 byte

ecco una risposta 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
    }

2
Ehi ora, J non è un esolang.
miglia

Questo non viene compilato se non includi using System.Linqe using System. Non sono sicuro che sia richiesto dalle regole.
Yytsi,

non è un programma completo, è solo una funzione quindi è ok per quanto ne so. Voglio dire, dovrei anche includere App.config e tutti i byte nelle proprietà e nel makefile? no
downrep_nation

@downrep_nation È semplicemente strano, dato che ho visto alcune persone includerle nella fonte quando è stata solo una funzione e hanno incluso i byte nella partitura.
Yytsi,

Ora, quando ci penso, sono sulla linea che dovresti importare almeno System.Linq. Altre lingue che richiedono l'importazione per utilizzare determinate funzionalità passano attraverso lo stesso processo, quindi penso che sia ingiusto supporre che ogni modulo sia caricato in memoria in C #.
Yytsi,

2

J, 66 byte

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

Approccio diretto basato sul processo descritto nella sfida.

[:+/^:2#\*]+|:ottiene la somma. ]+(i.@,~=](]+*)<.@-:)@#*è un modo particolarmente brutto per aumentare il centro della somma. [:}:@}."1@}:@}.rimuove il guscio esterno. Probabilmente esiste un modo migliore per farlo.

uso

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

Sono sorpreso che questo funzioni anche per essere onesti. Almeno mi sono reso conto che Brachylog ha davvero bisogno di un "valore di cambiamento di quell'elemento" come integrato però ...

Esempio di utilizzo:

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

Spiegazione

Versione più leggibile (e più lunga):

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

Spiegherò più o meno cosa fa ogni predicato (cioè ogni riga tranne il primo che è Predicato principale + predicato 1):

  • Predicato principale + predicato 1 {l1,?hh.|:2f:7a$\:7a&.}.: se l'input ha solo una riga, termina l'algoritmo e restituisce l'unico valore. Altrimenti trova tutte le righe che soddisfano il predicato 2, quindi applica il predicato 7 sulla matrice risultante, quindi il predicato 7 sulla trasposizione, quindi chiama ricorsivamente.

  • Predicato 2 :Im:I:?:3f.: prendi la Iquarta riga della matrice, trova tutti i valori di quella riga che soddisfano il predicato 3 con Ie la matrice come input aggiuntivi.

  • Predicato 3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.): Lè la riga, Iè l'indice della riga, Mè la matrice. Nè l' Jelemento th di L. Se la lunghezza Ldivisa per 2 è uguale a entrambe Ie J, allora l'output è la somma di Ncon il risultato del predicato 4 sulla matrice. Altrimenti l'output è giusto N. Questo predicato ricrea essenzialmente la matrice con l'eccezione che l'elemento centrale viene aggiunto alla somma.

  • Predicato 4 $\:?c:5a+.: applica il predicato 5 su ogni riga e colonna della matrice, unifica l'output con la somma dei risultati.

  • Predicato 5 :6f+.: trova tutti gli output validi del predicato 6 nella riga, unifica l'output con la somma dell'elenco risultante.

  • Predicato 6 :ImN,I:1+:N*.Nè il Ivalore th della riga, unifica l'output con N * (I+1).

  • Predicato 7 brbr.: rimuovere la prima e l'ultima riga della matrice.


2

APL, 56 caratteri

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

In inglese:

  • ⍣(⌊.5×≢⍵) ripetere volte "metà della dimensione di una dimensione arrotondata"
  • (⍵⍪⍉⍵)+.×⍳≢⍵ prodotto interno della matrice e sua trasposizione con il vettore indice
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ trasforma il risultato in una matrice riempita con 0s
  • 1 1↓¯1 ¯1↓ rimuove il guscio esterno
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.