Zsumuj sumę i usuń moją macierz

9

Zsumuj sumę i usuń moją macierz

Biorąc pod uwagę macierz / tablicę 2d w preferowanym języku

Wejście:

  • Matryca zawsze będzie miała nieparzystą długość
  • Matryca zawsze będzie idealnie kwadratowa
  • Wartościami macierzy może być dowolna liczba całkowita w twoim języku (dodatnia lub ujemna)

Przykład:

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

Definicje:

  • „Numer centralny” jest zdefiniowany jako liczba, która ma taką samą liczbę liczb po lewej, prawej, w górę iw dół

W tym przypadku jego środkowa wartość to 100

  • „Zewnętrzna powłoka” to zbiór liczb, których indeks xiy wynosi 0 lub rozmiar matrycy

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

Twoje zadanie:

Dodaj do centralnej liczby sumę każdego wiersza i kolumny po pomnożeniu wartości w każdym przez ich indeks 1

Na przykład pojedynczy rząd

4  5  6  7  8

dla każdej liczby

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

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

przykład:

 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
  • Dla wszystkich wierszy i kolumn łączymy te wartości ..
  • Teraz sumujesz je też => 154-16 = 138
  • Dodajesz ten numer do „numeru centralnego” i usuwasz „zewnętrzną powłokę” matrycy

 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

róbcie to, dopóki nie otrzymacie jednego numeru

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

27 2115 5
  • Dodaj 2114 + 2147 do 1060
  • Usuń „zewnętrzną powłokę” i zdobądź 5321
  • Teraz mamy tylko jeden numer

to jest wynik!

przypadki testowe:

-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

To wyzwanie dla codegolfa, więc wygrywa program o najniższej liczbie bajtów

downrep_nation
źródło
masz rację, to jest literówka
downrep_nation
3
dlaczego liczby ujemne byłyby problemem? Nie sądzę, że wyzwanie powinno się dostosować do esolangów, ale może odwrotność jest bardziej odpowiednia
downrep_nation
@LuisMendo Myślę, że to nie problem, zasada „Wartości macierzy mogą być dowolnymi liczbami całkowitymi w twoim języku” oznacza dla mnie, że jeśli twój język nie ma liczb ujemnych, nie powinien ich obsługiwać.
Fatalize
właściwie to jest poprawne. ale wtedy przypadki testowe nie będą działały poprawnie
downrep_nation
2
„Nie sądzę, że wyzwanie powinno się dostosować do esolangów, ale może odwrotnie jest bardziej odpowiednie”, które powinny być wygrawerowane w kamieniu
edc65

Odpowiedzi:

4

MATL , 36 34 bajtów

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

Dane wejściowe to tablica 2D z ;separatorem wierszy

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

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
źródło
4

Python 2.7, 229 bajtów

To moja pierwsza próba zrobienia czegoś takiego, więc mam nadzieję, że przestrzegałem wszystkich zasad w tym przesłaniu. Jest to tylko funkcja, która przyjmuje listę list jako swój parametr. Wydaje mi się, że podsumowanie sum i list może być nieco skrócone, ale było to dla mnie zbyt trudne. :RE

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

Dziękuję Easterly Irk za pomoc w ogoleniu kilku bajtów.

Jeremy
źródło
1
Możesz usunąć kilka spacji między operatorami ( ...) + sum([i*j...-> ...)+sum([i*j...), ale ogólnie świetny pierwszy post !!!!
Rɪᴋᴇʀ
oooh tego przegapił. Dzięki!
Jeremy
1
Również ...]for ...działa. Możesz usunąć co najmniej 2 takie miejsca. (koniec listy trafia w pętlę for)
Rɪᴋᴇʀ
3

C #, 257 bajtów

oto odpowiedź nie 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]);

bez golfa:

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
źródło
2
Cześć, J nie jest esolangiem.
mile
Nie kompiluje się, jeśli nie podasz using System.Linqi using System. Nie jestem jednak pewien, czy wymagają tego przepisy.
Yytsi
nie jest to pełny program, jest to tylko funkcja, więc jest ok, o ile wiem. mam na myśli, czy powinienem również dołączyć App.config i wszystkie bajty we właściwościach i makefile? no
downrep_nation
@downrep_nation To jest po prostu dziwne, ponieważ widziałem, jak niektórzy ludzie włączają je do źródła, gdy była to tylko funkcja i dodali bajty do partytury.
Yytsi
Teraz, gdy o tym myślę, jestem na linii, którą powinieneś zaimportować przynajmniej System.Linq. Inne języki, które wymagają importowania w celu korzystania z niektórych funkcji, przechodzą ten sam proces, więc uważam, że niesprawiedliwe jest założenie, że każdy moduł jest ładowany do pamięci w języku C #.
Yytsi
2

J, 66 bajtów

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

Proste podejście oparte na procesie opisanym w wyzwaniu.

[:+/^:2#\*]+|:dostaje sumę. ]+(i.@,~=](]+*)<.@-:)@#*jest szczególnie brzydkim sposobem na zwiększenie środka o sumę. [:}:@}."1@}:@}.usuwa zewnętrzną powłokę. Prawdopodobnie jest na to lepszy sposób.

Stosowanie

   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
mile
źródło
2

Brachylog , 114 bajtów

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

Jestem zaskoczony, że to nawet działa szczerze. Przynajmniej zdałem sobie sprawę, że Brachylog naprawdę potrzebuje „zmiany wartości tego elementu” jako wbudowanego…

Przykład użycia:

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

Wyjaśnienie

Bardziej czytelna (i dłuższa) wersja:

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

Po prostu wyjaśnię z grubsza, co robi każdy predykat (tj. Każda linia oprócz pierwszej, która jest predykatem głównym + predykat 1):

  • Główny predykat + predykat 1 {l1,?hh.|:2f:7a$\:7a&.}.: Jeśli dane wejściowe mają tylko jeden wiersz, zakończ algorytm i zwróć jedyną wartość. W przeciwnym razie znajdź wszystkie wiersze spełniające predykat 2, następnie zastosuj predykat 7 na wynikowej macierzy, następnie predykat 7 na transpozycji, a następnie wywołaj rekurencyjnie.

  • Predykat 2 :Im:I:?:3f.: Weź Ith wiersz macierzy, znajdź wszystkie wartości tego wiersza, które spełniają predykat 3, Ii macierz jako dodatkowe dane wejściowe.

  • Predykat 3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.): Ljest rzędem, Ijest indeksem wiersza, Mjest macierzą. Njest Jth elementem L. Jeśli długość Lpodzielona przez 2 jest równa obu Ii J, wówczas wynik jest sumą Nz wynikiem predykatu 4 na macierzy. W przeciwnym razie wynik jest po prostu N. Ten predykat zasadniczo odtwarza macierz, z tym wyjątkiem, że element środkowy jest dodawany do sumy.

  • Predykat 4 $\:?c:5a+.: Zastosuj predykat 5 w każdym wierszu i kolumnie macierzy, ujednolic dane wyjściowe z sumą wyników.

  • Predykat 5 :6f+.: Znajdź wszystkie prawidłowe wyniki predykatu 6 w wierszu, ujednolic dane wyjściowe z sumą wynikowej listy.

  • Predykat 6 :ImN,I:1+:N*.Nto Ith wartość wiersza, zunifikuj wynik za pomocą N * (I+1).

  • Predykat 7 brbr.: Usuń pierwszy i ostatni wiersz macierzy.

Fatalizować
źródło
2

APL, 56 znaków

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

Po angielsku:

  • ⍣(⌊.5×≢⍵) powtórz razy „połowę wielkości zaokrąglonego wymiaru”
  • (⍵⍪⍉⍵)+.×⍳≢⍵ iloczyn wewnętrzny macierzy i jej transpozycja z wektorem indeksu
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ przekształcenie wyniku w macierzy wypełnionej zerami
  • 1 1↓¯1 ¯1↓ usuwa powłokę zewnętrzną
lstefano
źródło