Zainspirowany przez skopiowane z tego pytania w Stack Overflow.
Biorąc pod uwagę matrycę A
, utwórz matrycę w B
taki sposób, aby kolumny A
były ułożone blokowo po przekątnej. Na przykład dane
1 2 3
4 5 6
wynik byłby
1 0 0
4 0 0
0 2 0
0 5 0
0 0 3
0 0 6
Zasady
Dane wejściowe i wyjściowe mogą być w postaci tablic 2D, tablic zagnieżdżonych lub łańcuchów z różnymi separatorami dla wierszy i kolumn.
Liczby na wejściu (macierz A
) będą dodatnimi liczbami całkowitymi.
Dowolny format jest dozwolony, o ile zera są wyświetlane w jakiś rozsądny sposób. Na przykład powyższy wynik można wyświetlić za pomocą znaków cudzysłowu w celu dołączenia każdej liczby:
'1' '' ''
'1111' '' ''
'' '11' ''
'' '11111' ''
'' '' '111'
'' '' '111111'
Przypadki testowe
Wejście wyjście:
1 2 3
4 5 6
1 0 0
4 0 0
0 2 0
0 5 0
0 0 3
0 0 6
10 20
10 0
0 20
10
20
10
20
1 2 3
10 20 30
100 200 300
1 0 0
10 0 0
100 0 0
0 2 0
0 20 0
0 200 0
0 0 3
0 0 30
0 0 300
2 4
6 8
10 12
2 0
6 0
10 0
0 4
0 8
0 12
code-golf
number
array-manipulation
Luis Mendo
źródło
źródło
Odpowiedzi:
MATL , 6 bajtów
Pracuje w bieżącej wersji (13.0.0) języka / kompilatora.
Dane wejściowe mają następującą postać, z średnikiem jako separatorem wierszy, a przecinki lub spacje jako separatory kolumn w każdym wierszu:
Wypróbuj online!
Wyjaśnienie
Przykład działał
Rozważ dane wejściowe
[1 2 3; 4 5 6]
. Pętla for rozpoczynająca się od"
zajmuje każdą kolumnę danych wejściowych. W ramach każdej iteracji@
wypycha bieżącą kolumnę na stos. Więc w pierwszej iteracji popycha[1; 4]
.N$
określa, że cała zawartość stosu będzie używana jako dane wejściowe następującej funkcji,Yd
.Ta funkcja (odpowiadająca MATLAB-owi
blkdiag
) „łączy diagonalnie” swoje dane wejściowe, aby utworzyć blokową macierz diagonalną (macierz 2D). Tak więc w pierwszej iteracjiYd
pobiera jedno wejście i tworzy wynik równy temu wejściu,[1; 4]
, który pozostawia na stosie.W drugiej iteracji
[2; 5]
wypychana jest druga kolumna danych wejściowych . TerazYd
pobiera dwa wejścia 2 × 1, mianowicie[1; 4]
i[2; 5]
, i tworzy tablicę 4 × 2[1 0; 4 0; 0 2; 0 5]
.W trzeciej iteracji
Yd
bierze ostatnią tablicę 4 × 2 i trzecią kolumnę danych wejściowych[3; 6]
i daje wynik końcowy[1 0 0; 4 0 0; 0 2 0; 0 5 0; 0 0 3; 0 0 6]
.źródło
ES6, 65 bajtów
Pobiera jako dane wejściowe i zwraca jako dane wyjściowe tablicę tablic.
źródło
Mathematica,
4039 bajtówPodziękowania dla @Seeq za
Infix
ingFlatten
.Dane wejściowe to lista wektorów wierszy oddzielonych
{}
nawiasami. Tak więc początkowy przykład jest reprezentowany przezWygeneruj tablicę, w
DiagonalMatrix
której każdy ma elementy ukośne z rzędów wejściowych (tablica 3-W).Transpose
więcFlatten
operacja usuwa prawidłowe pary nawiasów, aby uzyskać żądaną macierz (teraz tablica 2-D).źródło
DiagonalMatrix/@#
działałoby? A przez rozszerzenieTranspose[DiagonalMatrix/@#]~Flatten~1&
Infix
Flatten
jednak o tym. +1.Pyth, 17 lat
Wypróbuj online lub uruchom pakiet testowy .
Możesz dodać wiodącą
j
pomoc w wizualizacji tablicy 2D.źródło
Galaretka, 13 bajtów
Wypróbuj online!
Jak to działa
źródło
Mathematica, 111 bajtów
źródło
Table
iPart
błędów przy użyciu standardowego zapisu matrycy MMA i powoduje szereg mieszanych wymiarach.Ruby,
81787662 bajtówwestchnienie Ręczne śledzenie indeksu jest krótsze niż
with_index
.źródło
R, 41 bajtów
Zakłada się
pryr
,Matrix
iplyr
są zainstalowane pakiety.Tworzy to funkcję, która pobiera tablicę 2D (a) i zwraca „sparseMatrix”, gdzie (gdzie 0 jest reprezentowane jako
.
)Wyjaśnienie:
plyr::alply(a,2)
każda kolumnaa
i zwraca łączy wyniki na liścieMatrix::.bdiag(lst)
tworzy blokową macierz diagonalną z listy macierzypryr::f
to skrótowy sposób tworzenia funkcji.W pełni podstawowe
R
rozwiązanie w 59 bajtach (przy użyciu logiki odpowiedzi Matlab @ PieCot):źródło
MATLAB,
6968 bajtówOgolono jeden bajt: dzięki Luisowi Mendo :)
źródło
APL (Dyalog Classic) , 11 bajtów
Wypróbuj online!
źródło