Präsentiert zu Ehren von APL als interaktives Tool zum 50. Geburtstag in diesem Jahr
Hintergrund
Ken [Iverson] präsentierte seine Arbeit Formalism in Programming Languages im August 1963 auf einer Arbeitskonferenz über mechanische Sprachstrukturen in Princeton, New Jersey (Backus, Curry, Dijkstra, Floyd, Iverson, Newell, Perlis, Wilkes). Das Papier zeichnet auch die Diskussion auf, die nach der Präsentation stattfand, und endete mit einem Austausch zwischen Ken und [Edsger] Dijkstra , in dem Kens Antwort auf die Frage von Dijkstra ein Einzeiler war.
Herausforderung
Wie würden Sie eine komplexere Operation darstellen, zum Beispiel die Summe aller Elemente einer Matrix M, die gleich der Summe der entsprechenden Zeilen- und Spaltenindizes sind?
Schreiben Sie ein Snippet oder einen Ausdruck (es ist kein vollständiges Programm oder eine vollständige Funktion erforderlich), um die Summe jedes Elements in einer gegebenen Ganzzahlmatrix zu berechnen, die der Summe seiner Indizes entspricht. Oder, wie FryAmTheEggman es ausdrückt: Wenn eine Matrix M mit Elementen a ij gegeben ist , wird die Summe von jedem a ij mit a ij = i + j zurückgegeben.
Sie können davon ausgehen, dass sich die Matrix bereits in einer Variablen oder einem Speicherort befindet, oder Sie können sie als Argument oder Eingabe verwenden. Sie können Indizes mit 0 oder 1 verwenden.
Testfälle
0
für leere Matrix
2
0
für 0-basierte Indizes oder 2
für 1-basierte
1 5 2
9 4 2
5 9 6
2
für 0 basierend oder 10
für 1 basierend
0 3 0 4
0 4 1 4
4 3 1 2
-2 4 -2 -1
11
3 -1 3 3
3 -1 3 1
6
für 0 basierend oder 3
für 1 basierend
Anekdote
Iverson Antwort wurde ++ / ( M = ⍳ ¹ ⨢ ⍳ ¹) // M , das weder gültig in der ist Iverson Notation wie definiert in einer Programmiersprache , noch in dem, was APL wurde schließlich. In Iverson Notation, wäre es gewesen + / (haben M = ⍳ ¹ ( μ ( M )) ⨢ ⍳ ¹ ( ν ( M ))) / M . In den allerersten Versionen von APL war es +/(,M=(⍳1↑⍴M)∘.+⍳1↓⍴M)/,M
.
quelle
Antworten:
APL,
13-12Bytes1 Byte danke an @ jimmy23013.
1-indiziert.
Das Array wird in der Variablen gespeichert
m
.Probieren Sie es online!
Basierend auf der Antwort in J , einer Sprache, die auf APL basiert.
Geben Sie in TryAPL Folgendes ein:
+/m`em`c`1+/`1`i`rm
Mit dem Array:
+/m`em`c`1+/`1`i`rm `[ 2 4 `r 3 `21 3 3 3 `21 3 1
Erläuterung
quelle
`
dies "APL-Schlüssel" bedeutet.+/∊m∩¨+/¨⍳⍴m
.MATL ,
151410 BytesDie Eingabe enthält durch getrennte Zeilen
;
. Zum Beispiel:[1 5 2; 9 4 2; 5 9 6]
. 1-basierte Indizierung wird verwendet.Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Ich werde das Beispiel mit der Eingabe
[3 -1 3 3; 3 -1 3 1]
in der Erklärung verwenden.quelle
JavaScript,
4946 BytesBearbeiten: 3 Bytes dank @MartinEnder gespeichert, der darauf hinweist, dass Snippets zulässig sind.
quelle
Netzhaut , 46 Bytes
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Die Eingabe verwendet Leerzeichen und Zeilenumbrüche zur Darstellung der Matrix. Indizes sind 0-basiert.
Probieren Sie es online!
Erläuterung
Nicht ganz die Herausforderung, für die Retina gemacht wurde, aber sie macht sich überraschend gut ... :)
Stufe 1: Substitution
Dies erweitert einfach alle Ganzzahlen in der Zeichenfolge als unäre Zahlen, wobei
1
als unäre Ziffer verwendet wird. Negative Zahlen wie-3
werden einfach zu Dingen wie-111
.Stufe 2: Match
Aufgrund der
!
Option werden alle Übereinstimmungen der angegebenen Regex gedruckt. Said Regex prüft mit Hilfe von Bilanzkreisen , ob die aktuelle Zahl mit der Summe seiner Indizes übereinstimmt.Dazu ermitteln wir zunächst die Summe der Indizes mit dem Lookbehind
(?<=(\S* |.*¶)*)
. Dies fügt ein Capture für jede Nummer vor dem aktuellen Capture in derselben Zeile (Via\S*
) sowie ein Capture für jede Zeile vor dem aktuellen Capture (Via.*¶
) zur Gruppe hinzu1
. Daher erhalten wir als Ergebnis die auf Null basierende Summe der Indizes.Dann versuchen wir, die gesamte nächste Zahl abzugleichen, während wir Captures von diesem Stapel mit entfernen
(?<-1>1)+\b
. Und dann machen wir das Spiel nicht , wenn alle Aufnahmen auf Gruppe verbleibt1
mit(?(1)1)
Gleichheit zu gewährleisten.Beachten Sie, dass negative Zahlen niemals übereinstimmen, da der Lookbehind nicht über die
-
Liste vor1
s hinausgeht und(?<-1>1)+
auch nicht übereinstimmt.Dies gibt uns eine Liste aller unären Zahlen, die der Summe ihrer Indizes entsprechen.
Stufe 3: Spiel
Wir beenden mit einer weiteren Match-Phase, aber ohne die
!
Option zählt dies nur die Anzahl der Matches, die beide alle unären Zahlen des vorherigen Ergebnisses summieren und diese Summe ebenfalls in Dezimalzahlen umwandeln.quelle
Jelly,
151410 Bytes4 Bytes dank Adnan.
1-indiziert.
Probieren Sie es online!
Überprüfen Sie alle Testfälle auf einmal. (Leicht verändert.)
quelle
J€
stattdessen tunL€R€
?Python 2 -
6057 BytesEs ist ein Code-Snippet, also wären es ein paar Bytes mehr, wenn ich den Wert tatsächlich zurückgeben würde, denke ich.
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
Danke für die Hilfe Leaky Num :-)
Schnelle Erklärung.
a
ist ein Array, das Zahlen enthält. Durchlaufen Sie einfach die Indizes und addieren Sie alle Werte, bei denen der Wert der Summe des Index entspricht.quelle
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
R, 24 Bytes
1-basiert.
Testfälle:
quelle
J, 15 Bytes
Verwendet die nullbasierte Indexierung und geht davon aus, dass die Matrix bereits in der Variablen M gespeichert ist .
Erläuterung
quelle
CJam,
232120 BytesVielen Dank an Peter Taylor für das Speichern von 3 Bytes.
Erwartet, dass sich die Matrix auf dem Stapel befindet, und belässt stattdessen die Summe. In beiden Fällen basieren die Indizes auf Null.
Teste es hier.
quelle
_,,
anstelle der innerenee
und.
für die innere Schleife speichern :ee{~_,,@f+1$.=.*~}%1b
ee{~_@f-_,,.=.*~}%1b
k4, 24 Bytes
Angenommen, die Matrix ist in gespeichert
m
.Dies ist eines dieser Rätsel, bei denen die Vereinfachungen beim Entwerfen von k aus APL (und J) wirklich weh tun - k
!
ist das Äquivalent von APL⍳
, funktioniert jedoch nur mit Vektoren. inneres Produkt ist ein Zeichen in APL, aber fünf in k; und ich verliere drei Zeichen, wenn ich mit der leeren Matrix richtig umgehe, weil k keine stark typisierten Matrizen hat.quelle
Pyth, 14 Bytes
0-indiziert.
Testsuite.
quelle
PowerShell v2 +, 43 Byte
Als Ausschnitt. Die Matrix wird explizit dazu weitergeleitet (siehe Beispiele unten). Angenommen
$i
, und$o
am Anfang entweder null oder null sind (ich habe sie in den folgenden Beispielen explizit als solche festgelegt), und verwendet den 0-Index.Führt in jeder Zeile der Matrix eine foreach-Schleife aus. Wir setzen
$j
auf0
und durchlaufen dann jedes Element der Zeile in einer anderen Schleife$_|%{...}
. Jede innere Schleife wird$o
um das aktuelle Element multipliziert mit einem Booleschen Wert inkrementiert($_-eq$i+$j++)
, was bedeutet, dass, wenn$TRUE
es sich um einen Booleschen Wert handelt , dies auch der Fall1
ist0
. Dann verlassen wir die innere Schleife, inkrementieren$i
und beginnen die nächste Reihe. Endlich gehen wir$o
die Pipeline am Ende.Beispiele
quelle
Ruby, 63 Bytes
Mit z als zweidimensionales Array von Zahlen:
Gar nicht so aufregend.
Wenn z ein abgeflachtes Array ist, wobei x und y die Größe der Arrays haben, wie z.
Dann haben wir diese Ungeheuerlichkeit - vielleicht rubinroter mit ihren ausgefallenen Produkten und Reißverschlüssen, aber tatsächlich größer:
quelle
Eigentlich 21 Bytes
Probieren Sie es online!
Vielen Dank an Leaky Nun, dass ich aufgehört habe faul zu sein, und schreibe dies endlich.
Dies verwendet 0-indizierte Matrizen und nimmt Eingaben als verschachtelte Liste an.
Erläuterung:
quelle
Matlab / Octave, 48 Bytes
1-indiziert.
Wird den ersten Testfall nicht bearbeiten, weil er
[1:0]
aus irgendeinem Grund die Größe 1x0 hatGetestet in Oktave 3.
Volles Programm:
quelle
sum((M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0))(:))
. Ich denke auch, dass Sie==0
durch und initial ändern können, um die Byteanzahl~
weiter zu reduzieren. Schließlich beachten Sie, dass Sie alle Testfälle behandeln müssen, oder die Frage sollte gelöscht werdenLua, 70 Bytes
1-indiziert.
Bonus: Es funktioniert für zerlumpte Arrays!
Eingabe gespeichert in
a
, Ausgabe gespeichert ins
.Volles Programm:
quelle
PHP, 59 Bytes
erwartet, dass das Array $ a definiert ist; muss leer oder 2-dimensional, 0-indiziert sein.
berechnet Summe auf $ s (bisher 0 oder nicht definiert - 0 gleich NULL)
Einsatz
+2
vor dem endgültigen)
für 1-indiziertes VerhaltenAlles Gute zum Geburtstag APL!
Funktionen und Testsuite
quelle
Brachylog , 15 Bytes
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) , 42 Byte
Probieren Sie es online!
1-indiziert.
quelle