Transpozycje i przekątne

21

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
Martin Ender
źródło
Związane z.
Martin Ender
Kiedy zdałem sobie sprawę, że post w piaskownicy był przed tobą w połowie, zanim dostałem się na SE dziś rano, zdałem sobie sprawę, że już to opublikowałeś ... w tym momencie zaczynam myśleć, że muszę być psychiczny: P
ETHprodukcje

Odpowiedzi:

19

JavaScript, wynik 20 14, ( 258 176 znaków nieliniowych)

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

i

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

Przykładowy fragment kodu:

f=

///mmm()mu[=+r
///=.av=a,pr"=
///> p,>px=[ [
m=>//(yv()xp"]
m. ////.(=+]+)
map((////>y?u&
v,y)=>v//r]r:&
.map((u,x//[ur
)=>r[p=m.//p)
length-1-//],
x+y]=r[p]////
?r[p]+" "+u//
:u),r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))

i

f=

///mmmv.)lx?:
///=.a,m=e+ru
///> pya>ny[)
m=>//()prg]p,
m. //(=([t=]r
map(//>(phr+=
(v,y//vu=-["[
)=>v.//,m1p ]
map((//x.-]")
u,x)=>r////+&
[p=x+y]////u&
=r[p]?r[p]//r
+" "+u:u),//
r=[])&&r

console.log(f([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]))

Herman L.
źródło
Czy możesz włączyć podświetlanie składni? Umieść <!-- language-all: lang-javascript -->przed pierwszym blokiem kodu.
CalculatorFeline
8

MATL , wynik 10 (100 znaków innych niż nowa linia)

%P!       
  Q&%     
  TXd!    
  %d      
     P!   
      "@% 
       Xz 
      %z  
         q
         !

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, Xdnie mogą być dzielone na an Xi dkolejne wiersze.

Oryginalny kod

Oryginalny kod, zlinearyzowany i bez komentowanej części, to

Q&TXd!P!"@Xzq!

który działa w następujący sposób:

Q      % Implicit input. Add 1 to each entry to make them positive
&      % This modifes default inputs/ouputs of next function, which is Xd
       % Specifically, it specifies 2 inputs and 1 ouput
T      % Push true
Xd     % Diagonals of matrix. With second input true, it gives all diagonals,
       % starting from below. The columns are arranged as columns of a matrix,
       % padding with zeros
!P!    % Flip horizontally. This is to produce the correct display order
"      % For each column
  @    %   Push current column
  Xz   %   Remove zeros
  q    %   Subtract 1
  !    %   Transpose into a row
       % Implicit end. Implicit display of stack contents

Transponowany kod

Transponowany kod zlinearyzowany to

P!QT&Xd!P!"@Xzq!

który ma następujące dwie różnice w porównaniu do oryginalnego kodu:

  • Ti &są zamieniani. Nie ma to żadnego efektu, ponieważ Tjest 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:

P      % Implicit input. Flip vertically
!      % Transpose
Luis Mendo
źródło
7

Galaretka , wynik 7, 49 bajtów nie nowej linii

Program do drukowania po przekątnej

......U
......Œ
......D
......ṙ
......L
......Ṛ
ŒDṙLṚUU

Wypróbuj online!

Program zapobiegający przekątnej

......Œ
......D
......ṙ
......L
......Ṛ
......U  
UŒDṙLṚU

Wypróbuj online!

Starsza odpowiedź (wyjście nieuporządkowane), wynik 3, 6 bajtów innych niż nowa linia

Program do drukowania po przekątnej

UU
UŒ
ŒD

Wypróbuj online!

Program do drukowania po przekątnej

UUŒ
UŒD

Wypróbuj online!

Officialaimm
źródło
6

Galaretka , zdobądź 4 (12 znaków)

poprzednie wyniki: 5 (16 znaków), 4 (16 znaków)

Oryginalny

ŒDṙṚ
D  ñ
ṙLñL

Wypróbuj online!

Transponować

ŒDṙ
D L
ṙ ñ
ṚñL

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.

ŒDṙLṚ

Na matrycy wejściowych M , ŒDLISTĘ M przekątne „s, zaczynając od głównej przekątnej i przemieszczania się do góry.

Dla danych wejściowych

1 2 3
4 5 6
7 8 9

to daje

1 5 9
2 6
3
7
4 8

ṙLnastępnie oblicza długość M za pomocą Li obraca jednostki długości wyniku (M) w lewo.

W naszym przykładzie długość wynosi 3 i otrzymujemy

7
4 8
1 5 9
2 6
3

Wreszcie odwraca kolejność przekątnych, powracając

3
2 6
1 5 9
4 8
7

dla 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.

ṚŒDṙL

Dla wejściowego matrycy M , najpierw cofa kolejności wierszy.

Dla danych wejściowych

1 2 3
4 5 6
7 8 9

to daje

7 8 9
4 5 6
1 2 3

Tak jak poprzednio, ŒDṙLgeneruje przekątne (od najniższej do najwyższej) wyniku.

W naszym przykładzie zwraca to

1
4 2
7 5 3
8 6
9

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

ṙLñL

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

ŒDṙṚ

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

 ṚñL

pobiera macierz wejściową M i oblicza jej odwrotność . Następnie oblicza długość M za pomocą Li wywołuje pierwsze łącze z argumentami reverse (M) i length (M) .

Pierwszy link

ŒDṙ

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.

Dennis
źródło
5

R, wynik 14 13 11 ( 99 95 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!

######`,scr
`::`(#:fpoo
pryr,#:)llw
f)(###`(i((
split (#tmm
p,col(p#())
)+row#r#m-)
(p)))#y#,#)
######r

I transponowano:

#`pfsp)(#
#:r)p,+p#
#:y(lcr)#
#`r#ioo)#
#(,#tlw)#
#### (###
`::`(pryr
,f)(####
split(m,
col(m)-#
row(m)))

Wypróbuj online!

rturnbull
źródło
1
row(m)+col(m)jest krótszy dla anty-przekątnych.
Giuseppe,
@Giuseppe Oczywiście, dziękuję! Edytowane teraz.
rturnbull