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
.
Réponses:
APL,
1312 octets1 octet grâce à @ jimmy23013.
1 indexé.
Le tableau est stocké dans la variable
m
.Essayez-le en ligne!
Basé sur la réponse de J , qui est un langage basé sur APL.
Dans TryAPL, pour saisir:
+/m`em`c`1+/`1`i`rm
Avec le tableau:
+/m`em`c`1+/`1`i`rm `[ 2 4 `r 3 `21 3 3 3 `21 3 1
Explication
la source
`
signifie "clé APL".+/∊m∩¨+/¨⍳⍴m
.MATL ,
151410 octetsL'entrée a des lignes séparées par
;
. Par exemple:[1 5 2; 9 4 2; 5 9 6]
. L'indexation basée sur 1 est utilisée.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Je vais utiliser l'exemple avec entrée
[3 -1 3 3; 3 -1 3 1]
dans l'explication.la source
JavaScript,
4946 octetsEdit: enregistré 3 octets grâce à @MartinEnder soulignant que les extraits sont autorisés.
la source
Rétine , 46 octets
Le nombre d'octets suppose un codage ISO 8859-1.
L'entrée utilise des séparateurs d'espace et de saut de ligne pour représenter la matrice. Les indices sont basés sur 0.
Essayez-le en ligne!
Explication
Pas tout à fait le genre de défi pour Retina, mais il se débrouille étonnamment bien ... :)
Étape 1: substitution
Cela développe simplement tous les entiers de la chaîne sous forme de nombres unaires en utilisant
1
comme chiffre unaire. Les nombres négatifs comme-3
deviendront simplement des choses comme-111
.Étape 2: Match
En raison de l'
!
option, cela imprime toutes les correspondances de l'expression régulière donnée. Ladite expression régulière utilise des groupes d'équilibrage pour vérifier si le nombre actuel est le même que la somme de ses indices.Pour ce faire, nous déterminons d'abord la somme des indices avec le lookbehind
(?<=(\S* |.*¶)*)
. Cela ajoute une capture pour chaque numéro devant celui en cours sur la même ligne (via\S*
) ainsi qu'une capture pour chaque ligne devant celui en cours (via.*¶
) au groupe1
. Par conséquent, nous obtenons la somme des indices basée sur zéro.Ensuite, nous essayons de faire correspondre le nombre entier suivant tout en supprimant les captures de cette pile avec
(?<-1>1)+\b
. Et puis nous faisons échouer la correspondance s'il reste des captures sur le groupe1
avec(?(1)1)
pour assurer l'égalité.Notez que les nombres négatifs ne sont jamais appariés, car le lookbehind ne peut pas dépasser l'
-
avant de la liste des1
s et(?<-1>1)+
ne peut pas non plus correspondre.Cela nous donne une liste de tous les nombres unaires qui égalent la somme de leurs indices.
Étape 3: Match
Nous terminons avec une autre étape de correspondance, mais sans l'
!
option, cela compte simplement le nombre de correspondances, qui à la fois additionne tous les nombres unaires du résultat précédent et convertit également cette somme en décimale.la source
Gelée,
151410 octets4 octets grâce à Adnan.
1 indexé.
Essayez-le en ligne!
Vérifiez tous les tests en même temps. (Légèrement modifié.)
la source
J€
place deL€R€
?Python 2 -
6057 octetsC'est un extrait de code, donc ce serait quelques octets de plus si je retournais la valeur, je suppose.
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
Merci pour l'aide Leaky Num :-)
Explication rapide.
a
est un tableau contenant des nombres. Parcourez simplement les index et additionnez toutes les valeurs où la valeur est égale à la somme de l'index.la source
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
R, 24 octets
1 basé.
Cas de test:
la source
J, 15 octets
Les utilisations indexation de base zéro et assume la matrice est déjà stockée dans la variable M .
Explication
la source
CJam,
232120 octetsMerci à Peter Taylor d'avoir économisé 3 octets.
Attend que la matrice soit sur la pile et laisse la somme à la place. Les indices sont basés sur zéro dans les deux cas.
Testez-le ici.
la source
_,,
au lieu de l'intérieuree
et.
pour la boucle intérieure:ee{~_,,@f+1$.=.*~}%1b
ee{~_@f-_,,.=.*~}%1b
k4, 24 octets
Suppose que la matrice est stockée dans
m
.C'est l'une de ces énigmes où les simplifications impliquées dans la conception de k à partir d'APL (et J) font vraiment mal - les k
!
sont l'équivalent des APL⍳
mais ne fonctionnent que sur les vecteurs, donc je dois assembler moi-même la matrice des indices; le produit intérieur est un caractère en APL mais cinq en k; et je perds trois caractères pour gérer correctement la matrice vide parce que k n'a pas de matrices fortement typées.la source
Pyth, 14 octets
0 indexé.
Suite de tests.
la source
PowerShell v2 +, 43 octets
Comme extrait. L'usage est de diriger explicitement la matrice vers cela (voir les exemples ci-dessous). Suppose que
$i
, et$o
sont soit nuls soit nuls au début (je les ai explicitement définis comme tels dans les exemples ci-dessous), et utilise 0-index.Effectue une boucle foreach sur chaque ligne de la matrice. Nous nous mettons
$j
à0
, puis parcourons chaque élément de la ligne dans une autre boucle$_|%{...}
. Chaque boucle interne, nous incrémentons$o
par l'élément courant multiplié par un booléen($_-eq$i+$j++)
, ce qui signifie que si ce booléen est$TRUE
, ce sera le cas1
, sinon0
. Ensuite, nous quittons la boucle intérieure, incrémentons$i
et commençons la ligne suivante. Enfin, nous partons$o
sur le pipeline à la fin.Exemples
la source
Rubis, 63 octets
Avec z comme tableau bidimensionnel de nombres:
Pas terriblement excitant du tout.
Si z est un tableau aplati avec x et y ayant les tailles des tableaux, telles que:
Ensuite, nous avons cette monstruosité - peut-être plus rubis avec ses produits fantaisie et ses fermetures éclair, mais en fait plus gros:
la source
En fait, 21 octets
Essayez-le en ligne!
Merci à Leaky Nun de m'avoir fait cesser d'être paresseux et enfin d'écrire ceci.
Cela utilise des matrices indexées 0 et prend l'entrée comme une liste imbriquée.
Explication:
la source
Matlab / Octave, 48 octets
1 indexé.
Ne gérera pas le premier cas de test car
[1:0]
a une taille 1x0 pour une raison quelconqueTesté en Octave 3.
Programme complet:
la source
sum((M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0))(:))
. En outre, je pense que vous pouvez modifier==0
par et initialiser~
pour réduire davantage le nombre d'octets. Enfin, notez que vous devez gérer tous les cas de test, sinon la question devrait être suppriméeLua, 70 octets
1 indexé.
Bonus: cela fonctionne pour les tableaux en lambeaux!
Entrée stockée dans
a
, sortie stockée danss
.Programme complet:
la source
PHP, 59 octets
attend le tableau $ a défini; doit être vide ou bidimensionnel, indexé 0.
calcule la somme à $ s (auparavant 0 ou non défini - 0 est égal à NULL)
insérer
+2
avant la finale)
pour un comportement indexé 1Joyeux anniversaire APL!
fonctions et suite de tests
la source
Brachylog , 15 octets
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) , 42 octets
Essayez-le en ligne!
1 indexé.
la source