Transponierten und Diagonalen

21

Für diese Herausforderung sollten Sie ein Programm oder eine Funktion schreiben, die die Diagonalen einer gegebenen Quadratmatrix ausgibt. Wenn Sie jedoch die Zeilen und Spalten des Quellcodes Ihrer Lösung transponieren, sollte dies stattdessen ein Programm oder eine Funktion sein, die die Antidiagonalen der Matrix zurückgibt. Lesen Sie weiter für Details ...

Regeln

  • Der Quellcode Ihrer Lösung wird als 2D-Zeichenraster betrachtet, das durch einen Standard-Zeilenumbruch Ihrer Wahl (Zeilenvorschub, Wagenrücklauf oder eine Kombination aus beiden) getrennt ist.
  • Keine Zeile in Ihrem Quellcode darf länger als die vorherige sein. Hier einige Beispiele für gültige Layouts:

    ###
    ###
    ###
    

    ########
    #######
    ###
    ###
    #
    

    Und hier ist ein Beispiel für ein ungültiges Layout (da die dritte Zeile länger als die zweite ist):

    ######
    ####
    #####
    ###
    
  • Ihre beiden Lösungen sollten sich gegenseitig transponieren, dh Sie sollten sich durch Vertauschen von Zeilen und Spalten voneinander lösen. Hier sind zwei gültige Paare:

    abc
    def
    ghi
    

    adg
    beh
    cfi
    

    Und

    print 10
    (~^_^)~
    foo
    bar
    !
    

    p(fb!
    r~oa
    i^or
    n_
    t^
     )
    1~
    0
    

    Beachten Sie, dass Leerzeichen wie alle anderen Zeichen behandelt werden. Insbesondere sind nachgestellte Leerzeichen von Bedeutung, da sie möglicherweise keine nachgestellten Leerzeichen in der Transponierung sind.

  • Jede Lösung sollte ein Programm oder eine Funktion sein, die eine nicht leere quadratische Matrix aus einstelligen ganzen Zahlen als Eingabe verwendet. Eine Lösung sollte eine Liste aller Diagonalen der Matrix und die andere eine Liste aller Antidiagonalen ausgeben. Sie können alle sinnvollen, eindeutigen Eingabe- und Ausgabeformate verwenden, diese müssen jedoch für beide Lösungen identisch sein (dies bedeutet auch, dass es sich entweder um beide Funktionen oder um beide Programme handeln muss).

  • Jede Diagonale verläuft von links oben nach rechts unten und sollte von oben nach unten angeordnet werden.
  • Jede Antidiagonale verläuft von links unten nach rechts oben und sollte von oben nach unten angeordnet werden.

Wertung

Um Lösungen zu fördern, die so quadratisch wie möglich sind, ist die primäre Punktzahl die Anzahl der Zeilen oder Spalten Ihrer Lösung, je nachdem, welcher Wert größer ist . Weniger ist besser. Die Krawatten werden durch die Anzahl der Zeichen in der Lösung getrennt, wobei die Zeilenumbrüche nicht berücksichtigt werden. Auch hier ist weniger besser. Beispiel:

abcd
efg
h

Dies und seine Transponierung hätten eine primäre Punktzahl von 4 (da es 4 Spalten gibt) und eine bahnbrechende Punktzahl von 8 (da es 8 Zeichen ohne Zeilenumbruch gibt). Bitte geben Sie beide Werte in der Kopfzeile Ihrer Antwort an.

Testfälle

Die eigentliche Aufgabe, die von den beiden Lösungen ausgeführt wird, sollte hier nicht die primäre Herausforderung sein. Hier sind zwei Beispiele, die Ihnen beim Testen Ihrer Lösungen helfen:

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
quelle
Verbunden.
Martin Ender
Wie ich die Sandbox Post realisiert wurde von Ihnen vor der Mitte durch sie bekommen, bevor ich auf SE heute Morgen habe ich erkannt hatte man schon gepostet ... an dieser Stelle zu denke ich beginne ich psychische sein muss: P
ETHproductions

Antworten:

19

Javascript, Punktzahl 20 14, ( 258 176 Nicht-Newline-Zeichen)

///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

und

///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

Beispielcode-Snippet:

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]
]))

und

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
quelle
Können Sie die Syntaxhervorhebung aktivieren? Legen Sie <!-- language-all: lang-javascript -->vor dem ersten Codeblock.
CalculatorFeline
8

MATL , Punktzahl 10 (100 Nicht-Newline-Zeichen)

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

Es gibt 10 Zeilen mit 10 Zeichen (beachten Sie die nachstehenden Leerzeichen).

Der obige Code erzeugt die Diagonalen. Probieren Sie es online!

Die transponierte Fassung produziert die Antidiagonalen. Probieren Sie es online!

Erläuterung

Beachten Sie, dass

  • % ist ein Kommentarsymbol, das bewirkt, dass der Rest der Zeile ignoriert wird.

  • Zwei-Zeichen-Funktionen wie Xdkönnen nicht in eine Xund eine daufeinanderfolgende Zeile aufgeteilt werden.

Originalcode

Der ursprüngliche Code, linearisiert und ohne den kommentierten Teil, ist

Q&TXd!P!"@Xzq!

was wie folgt funktioniert:

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

Transponierter Code

Der transponierte Code ist linearisiert

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

Das hat die folgenden zwei Unterschiede zum Originalcode:

  • Tund &werden getauscht. Dies hat keine Auswirkung, da Tes sich um ein Literal handelt und nicht um eine Funktion, die die &Spezifikation nicht abfängt .
  • P! wird am Anfang hinzugefügt.

Der hinzugefügte Code ändert die Eingabematrix so, dass die Diagonalen der geänderten Matrix die Antidiagonalen der Eingabe sind:

P      % Implicit input. Flip vertically
!      % Transpose
Luis Mendo
quelle
6

Jelly , 4 Punkte (12 Zeichen)

Bisherige Bewertungen: 5 (16 Zeichen), 4 (16 Zeichen)

Original

ŒDṙṚ
D  ñ
ṙLñL

Probieren Sie es online!

Transponieren

ŒDṙ
D L
ṙ ñ
ṚñL

Probieren Sie es online!

Hintergrund

Diagonalen

Der einfache Weg, die Diagonalen (von oben nach unten) einer quadratischen Matrix zu erhalten, ist wie folgt.

ŒDṙLṚ

Bei einer Eingangsmatrix M , ŒDListen M ‚s Diagonalen, beginnend mit der Hauptdiagonale und nach oben bewegt.

Für die Eingabe

1 2 3
4 5 6
7 8 9

Dies ergibt

1 5 9
2 6
3
7
4 8

ṙLberechnet dann die Länge von M mit Lund dreht die Einheiten der Ergebnislänge (M) nach links.

In unserem Beispiel ist die Länge 3 und wir erhalten

7
4 8
1 5 9
2 6
3

Schließlich kehrt sich die Reihenfolge der Diagonalen um und kehrt zurück

3
2 6
1 5 9
4 8
7

für unsere Beispieleingabe.

Anti-Diagonalen

Dieselben Bausteine ​​können verwendet werden, um die Antidiagonalen (wiederum von oben nach unten) einer quadratischen Matrix zu erhalten.

ṚŒDṙL

Bei einer Eingabematrix M wird zunächst die Reihenfolge der Zeilen umgekehrt.

Für die Eingabe

1 2 3
4 5 6
7 8 9

Dies ergibt

7 8 9
4 5 6
1 2 3

Wie zuvor werden ŒDṙLdie Diagonalen (von ganz unten nach ganz oben) des Ergebnisses generiert.

In unserem Beispiel wird dies zurückgegeben

1
4 2
7 5 3
8 6
9

wie gewünscht.

Wie es funktioniert

In Jelly definiert jede Zeile eine Verknüpfung (Funktion). Insbesondere definiert die letzte Zeile den Hauptlink , der beim Programmstart ausgeführt wird.

Andere Links müssen aufgerufen werden. Diese Antwort verwendet ñ, was den unten stehenden Link dyadisch ausführt. ñwird umbrochen. Wenn es über den Hauptlink aufgerufen wird, wird der Link in der ersten Zeile ausgeführt.

Original

Der Hauptlink

ṙLñL

Nimmt eine Eingabematrix M , berechnet ihre Länge mit L, dreht dann die Einheiten der Eingabelänge (M) mit nach links (beachte, dass dies M nicht ändert ) und ruft schließlich den ersten Link mit dem Ergebnis ( M ) und der Länge auf ( M) als Argumente.

Der erste Link

ŒDṙṚ

berechnet die Diagonalen von M mit ŒD(wie im vorherigen Abschnitt gezeigt), dreht die Einheiten der Ergebnislänge (M) mit nach links und kehrt dann die Reihenfolge des Ergebnisses mit um .

Der zweite Link wird nie aufgerufen.

Transponieren

Der Hauptlink

 ṚñL

Nimmt eine Eingabematrix M und berechnet ihre Umkehrung mit . Es berechnet dann die Länge von M mit Lund ruft den ersten Link mit den Argumenten reverse (M) und length (M) auf .

Der erste Link

ŒDṙ

berechnet dann die Diagonalen der Umkehrung (M) mit ŒD(wie im vorherigen Abschnitt gezeigt) und dreht schließlich die Einheiten der Ergebnislänge (M) mit nach links .

Die restlichen Links werden nie aufgerufen.

Dennis
quelle
5

R, Punktzahl 14 13 11 ( 99 95 Nicht-Newline-Zeichen)

Vielen Dank an @Giuseppe für die Verbesserung der Punktzahl um 1. Einige Zeichen wurden durch das Ausnutzen von Redundanzen in den Transpositionen abgeschnitten. Derzeit die beste Punktzahl für eine nicht Golf spielende Sprache!

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

Und umgesetzt:

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

Probieren Sie es online!

rturnbull
quelle
1
row(m)+col(m)ist kürzer für die Antidiagonalen.
Giuseppe
@ Giuseppe Natürlich, danke! Jetzt bearbeitet
Rturnbull