Indexsumme und Strip meine Matrix

9

Indexsumme und Strip meine Matrix

Gegeben ein Matrix / 2d-Array in Ihrer bevorzugten Sprache

Eingang:

  • Die Matrix hat immer eine ungerade Länge
  • Die Matrix ist immer perfekt quadratisch
  • Die Matrixwerte können eine beliebige Ganzzahl in Ihrer Sprache sein (positiv oder negativ).

Beispiel:

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

Definitionen:

  • Die "zentrale Nummer" ist definiert als die Nummer mit der gleichen Anzahl von Nummern links, rechts, oben und unten

In diesem Fall ist es die Mitte 100

  • Die "äußere Hülle" ist die Sammlung von Zahlen, deren x- und y-Index oder 0 oder die Matrixgröße ist

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

Deine Aufgabe:

Addieren Sie zur zentralen Zahl die Summe jeder Zeile und Spalte, nachdem Sie die Werte in jeder Zeile mit ihrem 1-basierten Index multipliziert haben

Eine einzelne Zeile zum Beispiel

4  5  6  7  8

für jede Nummer

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

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

Beispiel:

 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
  • Für alle Zeilen und Spalten kombinieren Sie diese Werte.
  • Nun summieren Sie auch diese => 154-16 = 138
  • Sie fügen diese Nummer zur "zentralen Nummer" hinzu und entfernen die "äußere Hülle" der Matrix

 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

Tun Sie dies, bis Sie eine einzige Zahl erhalten

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

27 2115 5
  • Addiere 2114 + 2147 zu 1060
  • Entfernen Sie die "äußere Hülle" und erhalten Sie 5321
  • Jetzt haben wir nur noch eine Nummer

das ist die Ausgabe!

Testfälle:

-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

Dies ist eine Codegolf-Herausforderung, sodass das Programm mit der niedrigsten Bytezahl gewinnt

downrep_nation
quelle
Sie sind richtig, das ist ein Tippfehler
downrep_nation
3
Warum sollten negative Zahlen ein Problem sein? Ich denke nicht, dass sich die Herausforderung für Esolangs anpassen sollte, aber vielleicht ist der umgekehrte Weg angemessener
downrep_nation
@LuisMendo Ich denke, es ist kein Problem. Die Regel "Die Matrixwerte können eine beliebige Ganzzahl in Ihrer Sprache sein" bedeutet für mich, dass Ihre Sprache, wenn sie keine negativen Zahlen hat, diese nicht unterstützen sollte.
Fatalize
eigentlich ist das richtig. Aber dann funktionieren die Testfälle nicht richtig
downrep_nation
2
"Ich denke nicht, dass sich die Herausforderung auf Esolangs einstellen sollte, aber vielleicht ist der umgekehrte Weg angemessener", der in Stein gemeißelt werden sollte
edc65

Antworten:

4

MATL , 36 34 Bytes

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

Die Eingabe ist ein 2D-Array mit einem ;Zeilentrennzeichen

Probieren Sie es online aus! Oder überprüfen Sie alle Testfälle .

Erläuterung

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
quelle
4

Python 2.7, 229 Bytes

Dies ist mein erster Versuch in so etwas, also habe ich hoffentlich alle Regeln mit dieser Einreichung befolgt. Dies ist nur eine Funktion, die eine Liste von Listen als Parameter verwendet. Ich habe das Gefühl, dass die Summen und das Listenverständnis wahrscheinlich etwas verkürzt werden könnten, aber es war zu schwer für mich. : 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]])

Vielen Dank an Easterly Irk, die mir geholfen haben, ein paar Bytes zu sparen.

Jeremy
quelle
1
Sie können ein paar Leerzeichen zwischen Operatoren entfernen ( ...) + sum([i*j...-> ...)+sum([i*j...), aber insgesamt ein großartiger erster Beitrag !!!!
Rɪᴋᴇʀ
oooh habe das verpasst. Vielen Dank!
Jeremy
1
Funktioniert auch ...]for .... Sie können mindestens 2 Leerzeichen so entfernen. (Ende der Liste trifft die for-Schleife)
Rɪᴋᴇʀ
3

C #, 257 Bytes

Hier ist eine Antwort ohne 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
quelle
2
Hey, J ist kein Esolang.
Meilen
Dies lässt sich nicht kompilieren , wenn Sie nicht enthalten using System.Linqund using System. Ich bin mir nicht sicher, ob es nach den Regeln erforderlich ist.
Yytsi
Es ist kein vollständiges Programm, es ist nur eine Funktion, also ist es soweit ich weiß in Ordnung. Ich meine, müsste ich auch die App.config und alle Bytes in die Eigenschaften und das Makefile aufnehmen? no
downrep_nation
@downrep_nation Es ist einfach komisch, da ich gesehen habe, dass einige Leute sie in die Quelle aufgenommen haben, wenn es nur eine Funktion war und sie die Bytes in die Partitur aufgenommen haben.
Yytsi
Wenn ich jetzt darüber nachdenke, bin ich auf der Linie, dass Sie mindestens importieren sollten System.Linq. Andere Sprachen, die importiert werden müssen, um bestimmte Funktionen nutzen zu können, durchlaufen denselben Prozess. Daher halte ich es für unfair anzunehmen, dass jedes Modul in C # in den Speicher geladen wird.
Yytsi
2

J, 66 Bytes

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

Einfacher Ansatz basierend auf dem in der Herausforderung beschriebenen Prozess.

[:+/^:2#\*]+|:bekommt die Summe. ]+(i.@,~=](]+*)<.@-:)@#*ist eine besonders hässliche Methode, um das Zentrum um die Summe zu erhöhen. [:}:@}."1@}:@}.entfernt die äußere Hülle. Es gibt wahrscheinlich einen besseren Weg, dies zu tun.

Verwendungszweck

   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
Meilen
quelle
2

Brachylog , 114 Bytes

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

Ich bin überrascht, dass dies sogar funktioniert, um ehrlich zu sein. Zumindest wurde mir klar, dass Brachylog wirklich einen "Änderungswert dieses Elements" als eingebautes Element benötigt ...

Anwendungsbeispiel:

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

Erläuterung

Lesbarere (und längere) Version:

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

Ich werde nur grob erklären, was jedes Prädikat (dh jede Zeile außer der ersten, die Hauptprädikat + Prädikat 1 ist) tut:

  • Hauptprädikat + Prädikat 1 {l1,?hh.|:2f:7a$\:7a&.}.: Wenn die Eingabe nur eine Zeile enthält, beenden Sie den Algorithmus und geben Sie den einzigen Wert zurück. Andernfalls finden Sie alle Zeilen, die das Prädikat 2 erfüllen, und wenden dann das Prädikat 7 auf die resultierende Matrix an, dann das Prädikat 7 auf die Transposition und rufen dann rekursiv auf.

  • Prädikat 2 :Im:I:?:3f.: Nehmen Sie die Idritte Zeile der Matrix und suchen Sie alle Werte dieser Zeile, die Prädikat 3 erfüllen, Iund die Matrix als zusätzliche Eingaben.

  • Prädikat 3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.): List die Zeile, Iist der Index der Zeile, Mist die Matrix. Nist das Jth Element von L. Wenn die Länge von Lgeteilt durch 2 gleich beiden Iund ist J, ist die Ausgabe die Summe von Nmit dem Ergebnis von Prädikat 4 in der Matrix. Ansonsten ist die Ausgabe gerade N. Dieses Prädikat erstellt die Matrix im Wesentlichen neu, mit der Ausnahme, dass das zentrale Element zur Summe hinzugefügt wird.

  • Prädikat 4 $\:?c:5a+.: Wenden Sie Prädikat 5 auf jede Zeile und Spalte der Matrix an und vereinheitlichen Sie die Ausgabe mit der Summe der Ergebnisse.

  • Prädikat 5 :6f+.: Finden Sie alle gültigen Ausgaben von Prädikat 6 in der Zeile und vereinheitlichen Sie die Ausgabe mit der Summe der resultierenden Liste.

  • Prädikat 6 :ImN,I:1+:N*.Nist der Ith-Wert der Zeile, vereinheitlichen Sie die Ausgabe mit N * (I+1).

  • Prädikat 7 brbr.: Entfernen Sie die erste und letzte Zeile der Matrix.

Fatalisieren
quelle
2

APL, 56 Zeichen

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

Auf Englisch:

  • ⍣(⌊.5×≢⍵) Wiederholen Sie den Vorgang "halb so groß wie eine abgerundete Dimension"
  • (⍵⍪⍉⍵)+.×⍳≢⍵ inneres Produkt der Matrix und ihre Transponierung mit dem Indexvektor
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ Transformationsergebnis in Matrix mit 0s aufgefüllt
  • 1 1↓¯1 ¯1↓ entfernt die äußere Hülle
lstefano
quelle