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]
1
× n
(wie [1 2 3]
) oder n
× 1
(wie [1; 2; 3]
) betrachtet werden