Biorąc pod uwagę macierz, zsumuj jej wartości w górę / w dół lub w lewo / w prawo, aby utworzyć X, złóż go i zwróć listę. Algorytm opisuję tutaj:
Algorytm
Twój wkład będzie nieparzystej kwadratowej macierzy liczb całkowitych w rozsądnej pojemności numerycznej twojego języka.
Jako przykład weźmy następującą macierz:
1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5
Najpierw dodaj każdą liczbę do najbliższej liczby znajdującej się na głównej przekątnej lub antydiagonalnej. Oznacza to, że podziel macierz na cztery sekcje wzdłuż głównej przekątnej i antydiagonalnej, a następnie zsumuj wszystkie liczby w każdej sekcji w kierunku środka, tak:
1 2 3 2 1
↓ ↓ ↓
0 → 3 2 3 ← 0
↓
4 → 2 → 5 ← 6 ← 3
↑
7 → 4 7 9 ← 4
↑ ↑ ↑
0 6 7 2 5
Ten krok daje następujący wynik:
1 1
5 5
39
17 15
0 5
Następnie składamy go, spłaszczając X i przeplatając elementy najpierw lewym górnym i lewym dolnym końcem. Daje to następujący wynik:
1, 0, 5, 17, 39, 5, 15, 1, 5
Można to sobie wyobrazić jako rozciąganie głównej przekątnej i obracanie jej przeciwnie do ruchu wskazówek zegara.
To jest wynik końcowy.
Wyzwanie
Zaimplementuj ten algorytm. Obowiązują standardowe luki. Dopuszczalne są wszystkie rozsądne formaty We / Wy.
Przypadki testowe
Input
Output
1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5
1, 0, 5, 17, 39, 5, 15, 1, 5
1 2 3 4 5
5 4 3 2 1
1 3 5 7 9
0 9 8 7 6
6 7 8 9 0
1, 6, 11, 16, 47, 7, 22, 5, 0
1 3 7 4 8 5 3
8 4 7 5 3 8 0
0 6 3 6 9 8 4
2 6 5 8 7 4 2
0 6 4 3 2 7 5
0 6 7 8 5 7 4
8 5 3 2 6 7 9
1, 8, 15, 11, 23, 20, 62, 32, 25, 13, 18, 3, 9
Odpowiedzi:
JavaScript, 113 bajtów
Pokaż fragment kodu
źródło
~~
? Neutralizują się nawzajem, więc nie ma takiej potrzeby.~~undefined==0
, więc jest to bardziej golfowe niż(a[q]||0)
.undefined
. Kiedy skopiowałem użyty przypadek testowy tsh , zauważyłem, że zadziałał bez~~
. A ponieważ~~x
podobnie-(-x)
wzajemnie się neutralizuję, doszedłem do wniosku, że w jakiś sposób został tam umieszczony przypadkowo. Dziękuję za poprawienie mnie.Galaretka ,
252321 bajtówWypróbuj online!
Alternatywna wersja, 19 bajtów
Nie działało to, ponieważ działało
Ġ
nieprawidłowo dla zagnieżdżonych tablic. Jedyna różnica polega na tym, że pary [q, p] wymienione w części Jak to działa są sortowane leksykograficznie zamiast mapowania ich na p + nq przed sortowaniem.Wypróbuj online!
tło
Zaczynamy od zastąpienia jego elementów współrzędnymi, zwiększenia w lewo i w dół oraz umieszczenia (0, 0) na środku matrycy.
Dla macierzy M 7x7 otrzymujemy następujące współrzędne.
Teraz obliczamy minimalną wartość bezwzględną każdej pary współrzędnych i mnożymy przez nią znaki obu współrzędnych, odwzorowując (i, j) na (znak (i) m, znak (j) m) , gdzie m = min (| i | , | j |) .
Elementy macierzy, które odpowiadają tej samej parze, muszą zostać zsumowane. Aby określić kolejność sumy, to mapa każdej pary (p, q) do p + nq , gdzie n jest liczbą / kolumny M .
Kolejność sum odpowiada kolejności liczb całkowitych i odpowiada jej sumom.
Jak to działa
źródło
Python,
159158 bajtówWypróbuj online!
źródło
y+1+(y>l-2)
może być(y>l-2)-~y
.Dyalog APL ,
10199646259 bajtów3 bajty zapisane przez @ Adám
Wypróbuj online!
Wykorzystując niesamowity algorytm Dennisa .
źródło
APL (Dyalog) , 60 bajtów *
We współpracy z moim kolegą Marshallem .
Anonimowy przedrostek lambda. Bierze macierz jako argument i zwraca wektor. Zakłada
⎕IO
( I ndex O rigin) na zero, co jest domyślne w wielu systemach.Wypróbuj online!
{
…}
Anonimowa lambda;⍵
ma słuszny argument (jak najdalsza litera alfabetu greckiego):⍴⍵
kształt argumentu (lista dwóch identycznych elementów)r←
zapisz jakor
(jak w r ho)⍳
Wszystkie ɩ ndices tablicy tej wielkości, to znaczy(0 0)
,(0 1)
...i←
przechowywać wi
(jak w i ota)=/¨
Boolean, w którym współrzędne są równe (tj. Przekątna)(
…)
Zastosuj tę anonimową funkcję ukrytego przedrostka:⌽
odwrócić argument⊢∨
LUB to z niemodyfikowanym argumentem,
ravel (wyprostuj do prostej listy)Mamy teraz logiczną maskę przekątnych.
(
…)/⍨
Użyj tego do filtrowania następujących elementów:⊢⍵
wydaj (aby oddzielićr
) argument{
… Wywołaj}⌺r
następującą anonimową infix lambda na każdym elemencie, zr
argumentem -neighbourhood (wypełnione zerami w razie potrzeby) jako prawym argumentem (⍵
) i dwuelementową listą wypełnionych liczbami wierszy, kolumn (ujemny dla dolnego / prawego, zero dla braku) jako left argument (⍺
):r÷2
podzielić nar
dwa⊃
wybierz pierwszy element (są identyczne)⌊
piętro tos←
magazyns
(na s HAPE)i∊⍨¨
dla każdego elementui
Boolean, jeślis
jest jego członkiem⍵×
pomnóż przez to okolicę(
…)↓
Upuść następującą liczbę wierszy i kolumn (ujemną dla dolnego / prawego):×⍺
podpis lewego argumentu (tj. kierunek wypełnień)-
negowaćs×
pomnożyćs
z tym,
ravel (wyprostuj na liście)+/
suma (plus zniżka)Teraz mamy pełną macierz sum, ale musimy przefiltrować wszystkie wartości odczytane w kolumnie.
⍉
transponować,
ravel (wyprostuj do prostej listy)* Licząc
⌺
jako⎕U233A
. Wypróbuj online!źródło