Diese Herausforderung steht im Zusammenhang mit einigen Funktionen der MATL-Sprache im Rahmen des Events Sprache des Monats im Mai 2018 .
Einführung
In MATL arbeiten viele Funktionen mit zwei Eingängen elementweise mit Broadcast . Dies bedeutet Folgendes:
Elementweise (oder vektorisiert ): Die Funktion nimmt zwei Arrays mit übereinstimmenden Größen als Eingaben. Die von der Funktion definierte Operation wird auf jedes Paar entsprechender Einträge angewendet. Verwenden Sie beispielsweise die Postfix-Notation:
[2 4 6] [10 20 30] +
gibt die Ausgabe
[12 24 36]
Dies funktioniert auch mit mehrdimensionalen Arrays. Die Notation
[1 2 3; 4 5 6]
repräsentiert das Array2
×3
(Matrix)1 2 3 4 5 6
die Größe
2
entlang der ersten Dimension (vertikal) und3
entlang der zweiten Dimension (horizontal) hat. Also zum Beispiel[2 4 6; 3 5 7] [10 20 30; 40 60 80] *
[20 80 180; 120 300 560]
Broadcasting oder ( Singleton-Erweiterung ): Die beiden Eingabearrays haben keine übereinstimmenden Größen, aber in jeder nicht übereinstimmenden Dimension hat eines der Arrays eine Größe
1
. Dieses Array wird implizit entlang der anderen Dimensionen repliziert, damit die Größen übereinstimmen. und dann wird die Operation elementweise wie oben angewendet. Betrachten Sie beispielsweise zwei Eingabearrays mit den Größen1
×2
und3
×1
:[10 20] [1; 2; 5] /
Dank des Rundfunks ist dies gleichbedeutend mit
[10 20; 10 20; 10 20] [1 1; 2 2; 5 5] /
und so gibt es
[10 20; 5 10; 2 4]
Ähnlich verhält es sich mit den Größen
3
×2
und3
×1
(der Rundfunk wirkt jetzt nur noch in der zweiten Dimension).[9 8; 7 6; 5 4] [10; 20; 30] +
[19 18; 27 26; 35 34]
Die Anzahl der Dimensionen kann sogar unterschiedlich sein. Beispielsweise sind Eingänge mit den Größen 3 × 2 und 3 × 1 × 5 kompatibel und ergeben ein 3 × 2 × 5-Ergebnis. Tatsächlich ist Größe 3 × 2 dasselbe wie 3 × 2 × 1 (es gibt beliebig viele implizite nachgestellte Singleton-Dimensionen).
Andererseits würde ein Paar von
2
x-2
und3
x-1
Arrays einen Fehler ergeben, da die Größen entlang der ersten Dimension2
und sind3
: Sie sind nicht gleich und keine von ihnen ist1
.
Definition des modularen Rundfunks
Modularer Rundfunk ist eine Verallgemeinerung des Rundfunks, die auch dann funktioniert, wenn keine der nicht übereinstimmenden Größen vorliegt 1
. Betrachten Sie zum Beispiel die folgenden 2
× 2
und 3
× 1
Arrays als Eingaben der Funktion +
:
[2 4; 6 8] [10; 20; 30] +
Die Regel lautet wie folgt: Für jede Dimension wird das Array, das entlang dieser Dimension kleiner ist, modular (zyklisch) repliziert , um der Größe des anderen Arrays zu entsprechen. Dies würde das obige Äquivalent zu machen
[2 4; 6 8; 2 4] [10 10; 20 20; 30 30] +
mit dem Ergebnis
[12 14; 26 28; 32 34]
Als zweites Beispiel
[5 10; 15 20] [0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0] +
würde produzieren
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
Im Allgemeinen ergeben Eingaben mit den Größen a
× b
und c
× d
ein Ergebnis der Größe max(a,b)
× max(c,d)
.
Die Herausforderung
Implementiere Addition für zweidimensionale Arrays mit modularem Broadcasting wie oben definiert.
Die Arrays sind rechteckig (nicht zackig), enthalten nur nicht negative ganze Zahlen und haben mindestens1
in jeder Dimension eine Größe .
Zusätzliche Regeln:
Eingabe und Ausgabe können mit jedem vernünftigen Mittel erfolgen . Ihr Format ist wie gewohnt flexibel.
Programme oder Funktionen sind in jeder Programmiersprache zulässig . Standardlücken sind verboten .
Kürzester Code in Bytes gewinnt.
Testfälle
Das Folgende wird ;
als Zeilentrennzeichen verwendet (wie in den obigen Beispielen). Jeder Testfall zeigt die beiden Eingänge und dann den Ausgang.
[2 4; 6 8]
[10; 20; 30]
[12 14; 26 28; 32 34]
[5 10; 15 20]
[0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0]
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
[1]
[2]
[3]
[1; 2]
[10]
[11; 12]
[1 2 3 4 5]
[10 20 30]
[11 22 33 14 25]
[9 12 5; 5 4 2]
[4 2; 7 3; 15 6; 4 0; 3 3]
[13 14 9;12 7 9;24 18 20;9 4 6;12 15 8]
[9 12 5; 5 4 2]
[4 2 6 7; 7 3 7 3; 15 6 0 1; 4 0 1 16; 3 3 3 8]
[13 14 11 16; 12 7 9 8; 24 18 5 10; 9 4 3 21; 12 15 8 17]
[6 7 9]
[4 2 5]
[10 9 14]
quelle
1
×n
(wie[1 2 3]
) odern
×1
(wie[1; 2; 3]
) betrachtet werdenAntworten:
Gelee , 10 Bytes
Nimmt ein Matrixpaar (zwei Zeilenarrays) als Eingabe und gibt eine Matrix zurück.
Probieren Sie es online!
Wie es funktioniert
quelle
Kohle ,
2523 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Nimmt Eingaben als dreidimensionales Array an. Erläuterung:
Gib alles ein.quelle
MATL ,
2524 BytesProbieren Sie es online!
Endlich! Es dauerte nur eine Woche, bis die von der Sprache des Monats inspirierte Herausforderung von der Sprache des Monats beantwortet wurde !
Ich vermute, dass es nicht ganz so kurz wie möglich ist, aber ich bin glücklich genug, weil meine ursprüngliche Version über 40 Bytes betrug. edit: Ich hatte recht, Luis hat ein weiteres Byte gefunden, um es herauszudrücken!
quelle
:
mit VektoreingabePython 3 ,
127126125 Byteshat ein Byte golfen, indem er
sum(m)
zu geändert hatm+n
Noch ein Byte danke an Jonathan Frech
Übernimmt die Eingabe als Liste von zwei zweidimensionalen Arrays.
Z
Lambda nimmt zwei Arrays als Eingabe und gibt einen Iterator zurück, der einen Index und zusammengeführte Werte aus beiden Arrays ergibt, bis der Index die Länge des größten Arrays erreicht. Die Indexvariable ist mir nicht sinnvoll und kostet ich Bytes, aber ich weiß nicht , wie ohne es zu tun ... ( bezogen )Z
die äußeren und inneren Arrays auf. Die innersten Werte werden addiert.Probieren Sie es online!
Verwenden
itertools.cycle
fühlt sich ein bisschen wie Schummeln an, aber ich denke, ich bin genug mit der bloßen Länge der Import-Anweisung bestraft worden :)Ich bin mir sicher, dass dies noch weiter verbessert werden könnte, insbesondere durch die Iterationsmethode, die diese nutzlosen
i
undj
variablen Elemente überlässt . Für Tipps zum Golfen wäre ich dankbar, mir fehlt wahrscheinlich etwas Offensichtliches.quelle
zip
Argumente austauschenf
, die Zuordnung des Verständnisses umkehren und so ein Leerzeichen entfernen (for i,*l
->for*l,i
)? ( 125 Bytes )?JavaScript (ES6), 131 Byte
Nicht das richtige Werkzeug für den Job und wahrscheinlich auch nicht der richtige Ansatz. Na ja ... ¯ \ _ (ツ) _ / ¯
Probieren Sie es online!
Wie?
Die Hilfsfunktion g () erzeugt ein Array, das so groß ist wie das größte Eingabearray ( a oder b ) und ruft darüber die Rückruffunktion c auf:
Die Hilfsfunktion h () liest das 2D-Array a bei (x, y) mit modularem Broadcasting:
Der Hauptcode lautet jetzt einfach:
Rekursive Version, 134 Bytes
Probieren Sie es online!
quelle
05AB1E , 15 Bytes
Probieren Sie es online!
Alte Version, 25 Bytes
Probieren Sie es online!
Erläuterung
15 Byte:
25 Byte:
quelle
R ,
136 104 103 9593 BytesGolfed nach unten einem satten
3335 Bytes im Anschluss an Giuseppe Rat ab . Verwaltet, um unter 100 Bytes zu erhalten, indem ein Operator als Funktionsname verwendet wird. Weitere Informationen zu lesbarem Code finden Sie im Verlauf.Probieren Sie es online!
quelle
apply
undrep.len
es zu verwenden, obwohl ich nicht dazu gekommen war, es selbst zu codieren.dim
, viel sauberer und öffnet die Tür zu einer mehrdimensionalen Verallgemeinerung mit rekursiven Aufrufen zur
outer(x,y,"+")
die alle richtigen Summen enthält, und in einem klaren Muster. Ich kann nicht herausfinden, wie ich sie effizient extrahieren kann.K (ngn / k) , 23 Bytes
Probieren Sie es online!
quelle
05AB1E , 18 Bytes
Probieren Sie es online!
Erläuterung
quelle
Pyth, 24 Bytes
Probieren Sie es hier aus
Erläuterung
quelle
Java 8, 172 Bytes
Probieren Sie es online aus.
Erläuterung:
quelle
APL (Dyalog Classic) ,
2321 BytesProbieren Sie es online!
Dies könnte das einzige Mal sein, dass ich die Chance bekomme, es zu nutzen
|[0]
quelle
Python 2 ,
124116 BytesProbieren Sie es online!
Erläuterung:
Nimmt die Liste von zwei 2D-Listen als Eingabe.
quelle
Python 2 ,
10197105 BytesEdit: Nochmals vielen Dank an Dead Possum für das Speichern von 4 Bytes
Edit 2: 8 Bytes verloren, einige Testfälle wurden nicht bestanden
Eine Mischung aus Dead Possums früherer Lösung (dank ihm!) Und meiner eigenen Python 3-Lösung .
Probieren Sie es online!
Gleiche Eingabe wie meine Python 3-Lösung (ein Paar zweidimensionaler Listen).
Kommentierter Code:
quelle
Julia 0,6 ,
8583 BytesProbieren Sie es online!
(Ersetzen
⧻
mit\
Dank an Jo King )Wiederholen Sie jede Matrix horizontal und vertikal, sodass beide dieselbe Größe haben (Produkt der Zeilengrößen x Produkt der Spaltengrößen), addieren Sie diese und extrahieren Sie den richtigen Bereich daraus. (Zeilenvektoreingaben oder Spaltenvektoreingaben erfordern einen
reshape
Aufruf, der als zweidimensionale Arrays umgewandelt werden soll. Ich gehe davon aus, dass dies in Ordnung ist, da die Frage "Addition für zweidimensionale Arrays implementieren" und "Eingabe und Ausgabe können von jedem übernommen werden." Angibt vernünftige Mittel. Ihr Format ist wie gewohnt flexibel. ")quelle