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


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

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.


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
    }

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

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.


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ą
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.