Indexer la somme et dépouiller ma matrice


9

Indexer la somme et dépouiller ma matrice

Étant donné un tableau matriciel / 2D dans votre langue préférée

Contribution:

  • La matrice aura toujours une longueur impaire
  • La matrice sera toujours parfaitement carrée
  • Les valeurs de la matrice peuvent être n'importe quel entier dans votre langue (positif ou négatif)

Exemple:

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

Définitions:

  • Le "numéro central" est défini comme le numéro qui a le même nombre de chiffres à gauche, à droite, de haut en bas

Dans ce cas, son 100 moyen

  • La "coque extérieure" est la collection de nombres dont leur indice x et y est ou 0 ou la taille de la 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

Ta tâche:

Ajouter au nombre central la somme de chaque ligne et colonne après avoir multiplié les valeurs de chacune par leur index basé sur 1

Une seule ligne par exemple

4  5  6  7  8

pour chaque numéro

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

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

exemple:

 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
  • Pour toutes les lignes et colonnes, vous combinez ces valeurs.
  • Maintenant, vous les additionnez aussi => 154-16 = 138
  • Vous ajoutez ce numéro au "numéro central" et supprimez la "coque extérieure" de la 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

faites cela jusqu'à ce que vous vous retrouviez avec un seul numéro

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

27 2115 5
  • Ajouter 2114 + 2147 à 1060
  • Retirez la "coque extérieure" et obtenez 5321
  • Il ne nous reste plus qu'un seul numéro

c'est la sortie!

cas de 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

Ceci est un défi de codegolf, donc le programme avec le plus petit nombre de victoires


vous avez raison, c'est une faute de frappe
downrep_nation

3
pourquoi les nombres négatifs seraient-ils un problème? Je ne pense pas que le défi devrait s'adapter aux esolangs mais peut-être que l'inverse est plus approprié
downrep_nation

@LuisMendo Je pense que ce n'est pas un problème, la règle "Les valeurs de la matrice peuvent être n'importe quel entier dans votre langue" signifie pour moi que si votre langue n'a pas de nombres négatifs, elle ne devrait pas les supporter.
Fatalize

en fait c'est correct. mais alors les cas de test ne fonctionneront pas correctement
downrep_nation

2
"Je ne pense pas que le défi devrait s'adapter aux esolangs mais peut-être que l'inverse est plus approprié" qui devrait être gravé dans la pierre
edc65

Réponses:


4

MATL , 36 34 octets

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

L'entrée est un tableau 2D avec ;comme séparateur de ligne

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

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 octets

C'est ma première tentative de quelque chose comme ça, donc j'espère que j'ai suivi toutes les règles avec cette soumission. Ceci est juste une fonction qui prend une liste de listes comme paramètre. J'ai l'impression que les sommes et la compréhension de la liste pourraient probablement être un peu raccourcies, mais c'était trop difficile pour moi. :RÉ

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]])

Merci à Easterly Irk de m'avoir aidé à raser quelques octets.


1
Vous pouvez supprimer quelques espaces entre les opérateurs ( ...) + sum([i*j...-> ...)+sum([i*j...), mais dans l'ensemble, excellent premier post !!!!
Rɪᴋᴇʀ

oooh manqué ça. Merci!
Jeremy

1
Fonctionne également ...]for .... Vous pouvez supprimer au moins 2 espaces comme ça. (la fin de la liste frappe la boucle for)
Rɪᴋᴇʀ

3

C #, 257 octets

voici une réponse 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]);

non golfé:

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
Hé maintenant, J n'est pas un esolang.
miles

Cela ne se compile pas si vous n'incluez pas using System.Linqet using System. Je ne sais pas si c'est requis par les règles.
Yytsi

ce n'est pas un programme complet, ce n'est qu'une fonction, donc ça va pour autant que je sache. Je veux dire, aurais-je également besoin d'inclure App.config et tous les octets dans les propriétés et le makefile? no
downrep_nation

@downrep_nation C'est juste bizarre, car j'ai vu des gens les inclure dans la source alors que ce n'était qu'une fonction et ils ont inclus les octets sur la partition.
Yytsi

Maintenant, quand j'y pense, je suis sur la ligne que vous devez importer au moins System.Linq. D'autres langages qui nécessitent l'importation pour utiliser certaines fonctionnalités passent par le même processus, donc je pense qu'il est injuste de supposer que chaque module est chargé en mémoire en C #.
Yytsi

2

J, 66 octets

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

Approche directe basée sur le processus décrit dans le défi.

[:+/^:2#\*]+|:obtient la somme. ]+(i.@,~=](]+*)<.@-:)@#*est un moyen particulièrement laid pour incrémenter le centre de la somme. [:}:@}."1@}:@}.enlève la coque extérieure. Il existe probablement une meilleure façon de procéder.

Usage

   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 octets

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

Je suis surpris que cela fonctionne même pour être honnête. Au moins, je me suis rendu compte que Brachylog avait vraiment besoin d'une "valeur de changement de cet élément" en tant que intégré cependant ...

Exemple d'utilisation:

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

Explication

Version plus lisible (et plus longue):

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

Je vais juste expliquer en gros ce que fait chaque prédicat (c'est-à-dire chaque ligne sauf la première qui est le prédicat principal + prédicat 1):

  • Prédicat principal + prédicat 1 {l1,?hh.|:2f:7a$\:7a&.}.: si l'entrée n'a qu'une seule ligne, mettez fin à l'algorithme et renvoyez la seule valeur. Sinon, trouvez toutes les lignes qui satisfont le prédicat 2, puis appliquez le prédicat 7 sur la matrice résultante, puis le prédicat 7 sur la transposition, puis appelez récursivement.

  • Prédicat 2 :Im:I:?:3f.: Prenez la Ie ligne de la matrice, trouvez toutes les valeurs de cette ligne qui satisfont le prédicat 3 avec Iet la matrice comme entrées supplémentaires.

  • Prédicat 3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.): Lest la ligne, Iest l'indice de la ligne, Mest la matrice. Nest le Je élément de L. Si la longueur de Ldivisée par 2 est égale à la fois à Iet J, alors la sortie est la somme de Navec le résultat du prédicat 4 sur la matrice. Sinon, la sortie est juste N. Ce prédicat recrée essentiellement la matrice à l'exception que l'élément central est ajouté à la somme.

  • Prédicat 4 $\:?c:5a+.: appliquez le prédicat 5 sur chaque ligne et colonne de la matrice, unifiez la sortie avec la somme des résultats.

  • Prédicat 5 :6f+.: recherchez toutes les sorties valides du prédicat 6 sur la ligne, unifiez la sortie avec la somme de la liste résultante.

  • Prédicat 6 :ImN,I:1+:N*.Nest la Ivaleur e de la ligne, unifiez la sortie avec N * (I+1).

  • Prédicat 7 brbr.: supprimez la première et la dernière ligne de la matrice.


2

APL, 56 caractères

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

En anglais:

  • ⍣(⌊.5×≢⍵) répéter "la moitié de la taille d'une dimension arrondie"
  • (⍵⍪⍉⍵)+.×⍳≢⍵ produit interne de la matrice et sa transposition avec le vecteur d'index
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ transformer le résultat en matrice rembourrée avec 0s
  • 1 1↓¯1 ¯1↓ enlève la coque extérieure
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.