Do tego wyzwania powinieneś napisać program lub funkcję, która wyprowadza przekątne danej macierzy kwadratowej. Jednak jeśli transponujesz wiersze i kolumny kodu źródłowego rozwiązania, powinno ono stać się programem lub funkcją, która zwraca antydagonalne macierze. Czytaj dalej, aby poznać szczegóły ...
Zasady
- Kod źródłowy twojego rozwiązania jest traktowany jako dwuwymiarowa siatka znaków, oddzielona standardową nową linią do wyboru (wysuw linii, znak powrotu karetki lub kombinacja obu).
Żaden wiersz w kodzie źródłowym nie może być dłuższy niż poprzedni. Oto kilka przykładów prawidłowych układów:
### ### ###
######## ####### ### ### #
A oto przykład nieprawidłowego układu (ponieważ trzeci wiersz jest dłuższy niż drugi):
###### #### ##### ###
Wasze dwa rozwiązania powinny być wzajemnie transponowane, to znaczy powinieneś otrzymać jedno od drugiego poprzez zamianę wierszy i kolumn. Oto dwie prawidłowe pary:
abc def ghi
adg beh cfi
I
print 10 (~^_^)~ foo bar !
p(fb! r~oa i^or n_ t^ ) 1~ 0
Pamiętaj, że spacje są traktowane jak wszystkie inne znaki. W szczególności spacje końcowe są znaczące, ponieważ mogą nie być spacjami końcowymi w transpozycji.
Każde rozwiązanie powinno być programem lub funkcją, która przyjmuje na wejściu niepustą kwadratową macierz jednocyfrowych liczb całkowitych. Jedno rozwiązanie powinno wypisać listę wszystkich przekątnych macierzy, a drugie powinno wypisać listę wszystkich antydiagonaliów. Możesz użyć dowolnych rozsądnych, jednoznacznych formatów wejściowych i wyjściowych, ale muszą one być identyczne między dwoma rozwiązaniami (oznacza to również, że albo muszą to być obie funkcje, albo oba programy).
- Każda przekątna biegnie od lewego górnego rogu do prawego dolnego rogu i powinna być uporządkowana od góry do dołu.
- Każdy antydiagonalny biegnie od dołu z lewej do prawej u góry i należy je zamawiać od góry do dołu.
Punktacja
Aby zachęcić do rozwiązań, które są jak najbardziej „kwadratowe”, głównym wynikiem jest liczba wierszy lub liczba kolumn rozwiązania, w zależności od tego, która wartość jest większa . Mniej znaczy lepiej. Więzy są zerwane przez liczbę znaków w rozwiązaniu, nie licząc nowych linii. Ponownie, mniej znaczy lepiej. Przykład:
abcd
efg
h
To i jego transpozycja miałyby pierwotny wynik 4 (ponieważ są 4 kolumny) i wynik rozstrzygający 8 (ponieważ istnieje 8 znaków innych niż nowa linia). Proszę podać obie wartości w nagłówku odpowiedzi.
Przypadki testowe
Rzeczywiste zadanie wykonane przez dwa rozwiązania nie powinno być tutaj głównym wyzwaniem, ale oto dwa przykłady, które pomogą Ci przetestować swoje rozwiązania:
Input:
1 2 3
4 5 6
7 8 9
Diagonals:
3
2 6
1 5 9
4 8
7
Antidiagonals:
1
4 2
7 5 3
8 6
9
Input:
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1
Diagonals:
0
1 1
0 0 0
1 1 1 1
0 0 0
1 1
0
Antidiagonals:
1
0 0
1 1 1
0 0 0 0
1 1 1
0 0
1
źródło
Odpowiedzi:
JavaScript, wynik
2014, (258176 znaków nieliniowych)i
Przykładowy fragment kodu:
i
źródło
<!-- language-all: lang-javascript -->
przed pierwszym blokiem kodu.MATL , wynik 10 (100 znaków innych niż nowa linia)
Jest 10 linii po 10 znaków (zwróć uwagę na końcowe spacje).
Powyższy kod tworzy przekątne. Wypróbuj online!
Wersja transponowana wytwarza anty przekątne. Wypróbuj online!
Wyjaśnienie
Zauważ, że
%
to symbol komentarza, który powoduje ignorowanie reszty wiersza.Funkcje dwóch znaków, takie jak,
Xd
nie mogą być dzielone na anX
id
kolejne wiersze.Oryginalny kod
Oryginalny kod, zlinearyzowany i bez komentowanej części, to
który działa w następujący sposób:
Transponowany kod
Transponowany kod zlinearyzowany to
który ma następujące dwie różnice w porównaniu do oryginalnego kodu:
T
i&
są zamieniani. Nie ma to żadnego efektu, ponieważT
jest literałem, a nie funkcją, więc nie przechwytuje&
specyfikacji.P!
jest dodawany na początku.Dodany kod modyfikuje macierz wejściową, tak aby przekątne zmodyfikowanej macierzy były przeciw przekątnymi wejścia:
źródło
Galaretka , wynik 7, 49 bajtów nie nowej linii
Program do drukowania po przekątnej
Wypróbuj online!
Program zapobiegający przekątnej
Wypróbuj online!
Starsza odpowiedź (wyjście nieuporządkowane), wynik 3, 6 bajtów innych niż nowa linia
Program do drukowania po przekątnej
Wypróbuj online!
Program do drukowania po przekątnej
Wypróbuj online!
źródło
Galaretka , zdobądź 4 (12 znaków)
poprzednie wyniki: 5 (16 znaków), 4 (16 znaków)
Oryginalny
Wypróbuj online!
Transponować
Wypróbuj online!
tło
Przekątne
Prosty sposób uzyskania przekątnych (od najwyższej do najniższej) macierzy kwadratowej jest następujący.
Na matrycy wejściowych M ,
ŒD
LISTĘ M przekątne „s, zaczynając od głównej przekątnej i przemieszczania się do góry.Dla danych wejściowych
to daje
ṙL
następnie oblicza długość M za pomocąL
i obraca jednostki długości wyniku (M) w lewo.W naszym przykładzie długość wynosi 3 i otrzymujemy
Wreszcie
Ṛ
odwraca kolejność przekątnych, powracającdla naszego przykładowego wejścia.
Przeciw przekątnej
Te same bloki konstrukcyjne można wykorzystać do uzyskania anty-przekątnych (ponownie, od najwyższej do najniższej) matrycy kwadratowej.
Dla wejściowego matrycy M ,
Ṛ
najpierw cofa kolejności wierszy.Dla danych wejściowych
to daje
Tak jak poprzednio,
ŒDṙL
generuje przekątne (od najniższej do najwyższej) wyniku.W naszym przykładzie zwraca to
zgodnie z życzeniem.
Jak to działa
W Galaretce każda linia definiuje łącze (funkcję). W szczególności ostatnia linia definiuje główne łącze , które jest wykonywane podczas uruchamiania programu.
Inne linki muszą być wywoływane. W tej odpowiedzi użyto
ñ
, który wykonuje poniższy link dynadycznie.ñ
jest zawijany, więc gdy jest wywoływany z głównego łącza, wykonuje łącze w pierwszym wierszu.Oryginalny
Główny link
pobiera macierz wejściową M , oblicza jej długość
L
, następnie obraca jednostki długości wejściowej (M) w lewo za pomocąṙ
(zauważ, że to nie zmienia M ), i na koniec wywołuje pierwsze połączenie z wynikiem ( M ) i długością ( M) jako argumenty.Pierwszy link
oblicza przekątne M za pomocą
ŒD
(jak pokazano w poprzednim rozdziale), obraca jednostki długości wyniku (M) w lewo za pomocąṙ
, a następnie odwraca kolejność wyniku za pomocąṚ
.Drugi link nigdy nie jest wywoływany.
Transponować
Główny link
pobiera macierz wejściową M i oblicza jej odwrotność
Ṛ
. Następnie oblicza długość M za pomocąL
i wywołuje pierwsze łącze z argumentami reverse (M) i length (M) .Pierwszy link
następnie oblicza przekątne biegu wstecznego (M) za pomocą
ŒD
(jak pokazano w poprzednim rozdziale), a na koniec obraca jednostki długości wyniku (M) w lewo oṙ
.Pozostałe linki nigdy nie są wywoływane.
źródło
R, wynik
14 1311 (9995 znaków innych niż nowy wiersz)Dzięki @Giuseppe za poprawę wyniku o 1. Ogolono kilka postaci, wykorzystując nadmiarowość w transpozycjach. Obecnie najlepszy wynik dla języka nie golfowego!
I transponowano:
Wypróbuj online!
źródło
row(m)+col(m)
jest krótszy dla anty-przekątnych.Łuska ,
794 znaków, wynik43Wypróbuj online!
-4 znaki dzięki BMO .
źródło