Présenté en l'honneur d' APL comme un outil interactif qui aura 50 ans cette année
Contexte
Ken [Iverson] a présenté son article Formalisme dans les langages de programmation en août 1963 lors d'une conférence de travail sur les structures de langage mécanique, à Princeton, NJ. (Backus, Curry, Dijkstra, Floyd, Iverson, Newell, Perlis, Wilkes). Le document enregistre également la discussion qui a eu lieu après la présentation, se terminant par un échange entre Ken et [Edsger] Dijkstra , dans lequel la réponse de Ken à la question de Dijkstra était unilatérale.
Défi
Comment représenteriez-vous une opération plus complexe, par exemple, la somme de tous les éléments d'une matrice M qui sont égaux à la somme des indices de ligne et de colonne correspondants?
Écrivez un extrait ou une expression (pas besoin d'un programme ou d'une fonction complète) pour calculer la somme de chaque élément dans une matrice entière donnée qui est égale à la somme de ses indices. Ou, comme le dit FryAmTheEggman: étant donné une matrice M avec des éléments a ij renvoie la somme de chacun a ij où a ij = i + j.
Vous pouvez supposer que la matrice se trouve déjà dans un emplacement de variable ou de mémoire, ou vous pouvez la prendre comme argument ou entrée. Vous pouvez utiliser des indices basés sur 0 ou 1.
Cas de test
0
pour matrice vide
2
0
pour les indices basés sur 0 ou 2
pour les indices basés sur 1
1 5 2
9 4 2
5 9 6
2
pour 0 basé ou 10
pour 1 basé
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
pour 0 basé ou 3
pour 1 basé
Anecdote
La réponse d'Iverson était ++ / ( M = ⍳ ¹ ⨢ ⍳ ¹) // M , qui n'est ni valide dans la notation Iverson telle que définie dans A Programming Language , ni dans ce qui est finalement devenu APL. Dans la notation Iverson, il aurait été de + / ( M = ⍳ ¹ ( μ ( M )) ⨢ ⍳ ¹ ( ν ( M ))) / M . C'était dans les toutes premières versions d'APL +/(,M=(⍳1↑⍴M)∘.+⍳1↓⍴M)/,M
.