Weź wejściową macierz kwadratową zawierającą dodatnie liczby całkowite i oblicz „obróconą sumę” macierzy.
Obrócona suma:
Weź sumę oryginalnej matrycy i tej samej matrycy obróconej o 90, 180 i 270 stopni.
Załóżmy, że macierz jest:
2 5 8
3 12 8
6 6 10
wówczas obrócona suma będzie wynosić:
2 5 8 8 8 10 10 6 6 6 3 2
3 12 8 + 5 12 6 + 8 12 3 + 6 12 5 =
6 6 10 2 3 6 8 5 2 10 8 8
26 22 26
22 48 22
26 22 26
Przypadki testowe:
Wejście i wyjście oddzielone myślnikami, różne przypadki testowe oddzielone znakiem nowej linii. Przypadki testowe w wygodniejszych formatach można znaleźć tutaj .
1
-------------
4
1 3
2 4
-------------
10 10
10 10
14 6 7 14
6 12 13 13
6 2 3 10
5 1 12 12
-------------
45 37 24 45
24 30 30 37
37 30 30 24
45 24 37 45
14 2 5 10 2
18 9 12 1 9
3 1 5 11 14
13 20 7 19 12
2 1 9 5 6
-------------
24 29 31 41 24
41 49 31 49 29
31 31 20 31 31
29 49 31 49 41
24 41 31 29 24
f=lambda*l:l[3:]and[map(sum,zip(*d))for d in zip(*l)]or f(zip(*l[0][::-1]),*l)
zapisuje dwa bajty z „normalnym” wejściem. Wypróbuj online!lambda*l
jakiegoś powodu myślałem, że nie jest możliwe w Pythonie 2.x,*y=1,2,3
w Python 2.7 ani[*x]
w Python 3.4, ale wyrażenia oznaczone gwiazdką mogą być użyte jako argumenty funkcji nawet w Python 1.6. Wypróbuj online!Oktawa , 29 bajtów
Wypróbuj online!
Wyjaśnienie
Dodaje to macierz wejściową z obróconą o 90 stopni wersją samego siebie. Wynik jest następnie dodawany z obróconą o 180 stopni wersją samego siebie.
źródło
Czysty , 110 bajtów
Wypróbuj online!
Z matematyki:
X = transpose(reverse M)
: Obrót o 90 stopniY = reverse(map reverse M)
: Obrót o 180 stopniZ = reverse(transpose M)
: Obrót o 270 stopniTen zamki operatora dodawania nad
M
iX
, jakY
iZ
, po czym na podstawie wyników.źródło
Wolfram Language (Mathematica) , 28 bajtów
jest\[Transpose]
.Wypróbuj online!
źródło
ReplacePart[#,{a_,b_}:>Tr@Extract[#,{{a,b},{b,-a},{-a,-b},{-b,a}}]]&
takżePlus@@NestList[Reverse@#&,#,3]&
Julia 0.6 , 29 bajtów
Wypróbuj online!
Nie mogłem zejść poniżej rozwiązania LukeSa
Ale próbując wymyśliłem to, co moim zdaniem jest trochę urocze.
Najpierw redefiniujemy mnożenie jako operację obracania, w której po raz pierwszy jest liczba obrotów. Skoro Julia mnoży się przez zestawienie, to:
1x
staje sięrotr90(x,1)
i3x
staje sięrotr90(x,3)
itp.Następnie wypisujemy sumę.
źródło
Julia 0.6 ,
2824 bajtówWypróbuj online!
źródło
[1]
przykładu powinno~reshape([1], (1,1))
wystarczyć, ponieważ tak właśnie deklaruje się macierz 1x1 w Julii 0.6.Galaretka , 7 bajtów
Wypróbuj online!
źródło
MATL , 9 bajtów
Wypróbuj w MATL Online
Wyjaśnienie
źródło
Oktawa , 33 bajty
Wypróbuj online!
Wyjaśnienie:
(r=@rot90)
w sposób liniowy tworząc uchwyt funkcyjnyr
służący do obracania matrycy o 90 stopni. Jeśli drugi argumentk
daje sięr
wówczas obracać MATRIXk*90
stopni. Odpowiada to pseudo kodowi:źródło
Pyth , 13 bajtów
Wypróbuj online!
źródło
J ,
1615 bajtówWypróbuj online!
źródło
^:
. Sprytne rozwiązanie!MATL , 7 bajtów
Wypróbuj w MATL Online!
Wyjaśnienie
Port mojej odpowiedzi Octave.
źródło
R ,
6964 bajtówWypróbuj online!
Próba numer trzy w codegolf. Od 69 do 64 bajtów dzięki Giuseppe!
źródło
a
do argumentu funkcji pozwoli zaoszczędzić bajty, umożliwiając pozbycie się{}
całego ciała funkcji. Ponadto przeniesienie podejścia Octave Luisa Mendo może zaoszczędzić trochę bajtów? Wreszcie, nie jestem w 100% pewien, ale jest tot(apply(x,2,rev))
równoważne zapply(x,1,rev)
?n
, abya()
powtórzyć operację chociaż.APL (Dyalog Classic) , 8 bajtów
Wypróbuj online!
źródło
Pari / GP , 31 bajtów
Wypróbuj online!
źródło
JavaScript (ES6), 77 bajtów
źródło
Galaretka , 7 bajtów
Wypróbuj online!
Zaoszczędzono 1 bajt dzięki Erikowi Outgolfer (również dzięki sugestii naprawy błędu).
W jaki sposób?
źródło
Python 2 , 76 bajtów
Wypróbuj online!
źródło
APL (Dyalog Classic) , 17 bajtów
Wypróbuj online!
APL NARS
34bajtów2117 znaków-2 znaki dzięki ngn
-2 znaki, ponieważ operator złożony ∘ wydaje się mieć pierwszeństwo na +
wydaje się, że rota obróć o od 90 °, ⌽⊖a obróć od 180 °, ⌽⍉⌽⊖a obróć od 270 ° jak ⍉⌽
Jeśli istnieje operator p jako:
Operator p powyżej byłby taki, że jeśli g jest funkcją 1-argumentową (monadyczną?), Powinno być:
rozwiązaniem byłyby pherapy 15 znaków
Ale może być lepszy jeden operator „skomponowany n czas” d taki, że „3 df w” to f (f (f (w))).
Teraz coś napisałem, ale jest to zbyt kruche bez konieczności sprawdzania typu.
Ale bardziej podoba mi się operator q, który powtarza komponowanie fz argumentem m (nie jest kompletny, ponieważ przypadki błędów typów nie są zapisywane)
rozwiązaniem byłoby 17 znaków, ale wolę to
źródło
⍉⌽
i całość nadaje się do pociągu+/⌽∘⍉f 4⍴⊂⍵
? Aby otrzymać cztery kopie⍵
, najpierw należy dołączyć⊂
. Aby mieć⌽⍉
jako argument dof
należy komponować je w jednej funkcji takich jak to:⌽∘⍉
. Tajemniczef
może być skanowanie (ukośnik odwrotny), ale należy zająć się jeszcze jednym szczegółem -⌽∘⍉
otrzymamy lewy argument, więc musimy go zignorować:+/{⌽⍉⍵}\4⍴⊂⍵
lub+/⊢∘⌽∘⍉\4⍴⊂⍵
.⊢ + ⌽∘⍉ + ⌽∘⊖ + ⍉∘⌽
. Może to prowadzić do jeszcze krótszych rozwiązań, jeśli sprytnie przestawisz squiggles i dobrze wykorzystasz pociągi.K4 / K (oK) ,
238 bajtówRozwiązanie:
Wypróbuj online!
Przykład:
Wyjaśnienie:
Dzięki ngn za uproszczoną technikę transformacji.
Dodatkowy:
W Q można to zapisać jako
źródło
+/{|+x}\
Rubinowy ,
74 7266 bajtówWypróbuj online!
Działa to na zasadzie element po elemencie, znajdując powiązane elementy matematycznie, zamiast obracać tablicę. Kluczową częścią jest
i,j=j,~i
, która obraca się (i, j) zgodnie z ruchem wskazówek zegara o 90 stopni.-2 bajty dzięki Mr. Xcoder
-6 bajtów z powodu
sum
źródło
Python 3 ,
105102 bajtów3 bajty dzięki Mr. Xcoder.
Wypróbuj online!
źródło
Ruby
8979 bajtów-10 bajtów dzięki Unihedron
Wypróbuj online!
źródło
.map &:dup
z*1
odciąć dużo znaków.array*length
tworzy nową tablicę i jest przydatnym sposobem na płytki klon.n=*m
jest jeszcze krótszy.transpose
zajmuje się tym05AB1E , 12 bajtów
Wypróbuj online!
źródło
Haskell ,
84 8367 bajtówWypróbuj online!
Dzięki Laikoni i całkowicie człowiekowi za zaoszczędzenie wielu bajtów!
źródło
Łuska , 9 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
tinylisp , 132 bajty
Przyjrzyjmy się ostatnio dodanej funkcji biblioteki
transpose
!Ostatni wiersz to nienazwana funkcja lambda, która wykonuje sumowanie rotacji. Aby go faktycznie użyć, powinieneś użyć,
d
aby powiązać go z nazwą. Wypróbuj online!Bez golfa, z komentarzami
źródło
Attache , 20 bajtów
Wypróbuj online!
Wyjaśnienie
MatrixRotate&0:3
rozszerza się z wejściax
,MatrixRotate[x, 0:3]
, co z kolei exapnds do[MatrixRotate[x, 0], MatrixRotate[x, 1], MatrixRotate[x, 2], MatrixRotate[x, 3]]
. Innymi słowy, wektoryzuje on RHS. NastępnieSum
bierze sumę wszystkich tych macierzy o jeden poziom. Daje to pożądany rezultat.źródło
Java 8,
135133 bajtów-2 bajty dzięki @ceilingcat .
Wyjaśnienie:
Wypróbuj online.
źródło