J'ai commencé un défi de golf de code récemment et il semble que le gagnant soit GolfScript (surprise, surprise!). Ce qui est intéressant, c'est qu'il y avait un autre concurrent très fort qui avait toutes les chances de gagner sur GolfScript. Son nom est APL. Je vois beaucoup de réponses écrites en APL ici. Il semble que ce langage soit assez efficace pour le golf de code, donc je décide de demander des conseils de golf de code que vous connaissez pour les programmes APL. N'hésitez pas à publier quelques exemples de code. Il est généralement très intéressant de voir le langage en action.
Les trains
la source
Astuces pour gérer
/
et⌿
dans les trainsLorsque vous utilisez des trains, vous voudrez peut-être utiliser des réductions
f/
telles que la somme+/
ou même la réplication de réduction//
. Cependant, si votre train a plus de pièces à gauche de la réduction, vous avez besoin de parenthèses pour créer un sommet. Voici quelques astuces pour économiser des octets.Utilisez
1∊
au lieu de monadique∨/
ou∨⌿
sur des tableaux booléensTâche: étant donné deux chaînes de longueur égale A et B, retournez 2 si tous les caractères correspondants de A et B sont égaux, 0 sinon. Par exemple
A←'abc'
etB←'def'
donne0
etA←'abc'
etB←'dec'
donne2
.Une solution dfn peut être
A{2×∨/⍺=⍵}B
mais vous voulez la raccourcir en allant tacite.A(2×∨/=)B
ne va pas fonctionner parce que les règles de formation des trains analysent cela comme2 (× ∨/ =)
vous le souhaitez2 × (∨/=)
.Observez cela
∨/
ou∨⌿
sur un vecteur booléen (∨/,
ou∨⌿,
pour des tableaux de rang supérieur) demande s'il y a un 1 présent, c'est1∊
-à- dire , afin que nous puissions écrire notre train comme2×1∊=
.Notez que
∊
défile son argument de droite, vous ne pouvez donc pas l'utiliser pour réduire chaque ligne ou colonne séparément.Utilisez
1⊥
au lieu de monadique+/
ou+⌿
Tâche: étant donné une liste de listes L et un index N, retournez trois fois la somme de la Nième liste. Par exemple
L←(3 1 4)(2 7)
etN←1
donne24
.Une solution dfn peut être
N{3×+/⍺⊃⍵}L
mais vous voulez la raccourcir en allant tacite.N(3×+/⊃)L
ne va pas fonctionner parce que les règles de formation des trains analysent cela comme3(× +/ ⊃)
vous le souhaitez3 × (+/⊃)
.Observez que l'évaluation d'une liste de nombres en unaire (base-1) équivaut à sommer la liste car ∑ { a , b , c , d } = a + b + c + d = ( a × 1³) + ( b × 1² ) + ( c × 1¹) + ( d × 1⁰). Par conséquent,
+/a b c d
c'est la même chose que1⊥a b c d
, et nous pouvons écrire notre train comme3×1⊥⊃
.Notez que sur les arguments de rang supérieur,
1⊥
est équivalent à+⌿
.Utiliser
f.g
au lieu def/g
avec des arguments scalaires et / ou vectorielsTâche: étant donné une liste L et un nombre N, renvoyez la plage 1 jusqu'au nombre de divisions minimales restant lorsque les éléments de L sont divisés par NEg
L←31 41 59
etN←7
donne1 2 3
.Une solution dfn peut être
N{⍳⌊/⍺|⍵}L
mais vous voulez la raccourcir en allant tacite.N(⍳⌊/|)L
ne va pas fonctionner parce que les règles de formation des trains analysent cela comme⍳ (⌊/) |
vous le souhaitez⍳ (⌊/|)
.Le produit interne
A f.g B
de deux fonctions scalaires lorsque les arguments sont des scalaires et / ou des vecteurs est le même quef/ A g B
parce que les deux sont(A[1] g B[1]) f (A[2] g B[2]) f (A[3] g B[3])
etc., donc nous pouvons écrire notre train comme⍳⌊.|
.Notez que cela ne fonctionne pas pour les tableaux de rang supérieur.
Utiliser
∊⊆
au lieu de/
avec des arguments booléens gauche et simple vecteur droiteTâche: étant donné une liste L et un nombre N, filtrez la liste afin qu'il ne reste que des nombres supérieurs à N. Par exemple
L←3 1 4
etN←1
donne3 4
.Une solution dfn peut être
N{(⍺<⍵)/⍵}L
mais vous voulez la raccourcir en faisant tacite.N(</⊢)L
ne fonctionnera pas car les règles de liaison analyseront cela comme(</) ⊢
mais vous voulez/
être la fonction répliquée plutôt que l'opérateur réduire .Dyadique
⊆
avec un argument gauche booléen partitionne l'argument droit selon des séries de 1 dans l'argument gauche, supprimant les éléments indiqués par 0. C'est presque ce que nous voulons, sauf pour le partitionnement indésirable. Cependant, nous pouvons nous débarrasser du partitionnement en appliquant monadic∊
. Ainsi{(⍺<⍵)/⍵}
peut devenir{∊(⍺<⍵)⊆⍵}
et ainsi nous pouvons écrire notre train comme∊<⊆⊢
.Notez que cela ne fonctionne pas pour les tableaux de rang supérieur.
Utiliser à la
0⊥
place⊢/
ou⊢⌿
avec des arguments numériquesTâche: étant donné une liste L et un nombre N, multipliez le N par l'élément le plus à droite de LEg
L←3 1 4
etN←2
donne8
.Une solution dfn peut être
N{⍺×⊢/⍵}L
mais vous voulez la raccourcir en allant tacite.N(⊣×⊢/⊢)L
ne va pas fonctionner parce que les règles de formation des trains analysent cela comme⊣ (× ⊢/ ⊢)
vous le souhaitez⊣ × (⊢/⊢)
.Observez que
0⊥
sur un tableau numérique est le même que⊢⌿
, afin que nous puissions écrire notre train comme⊣×0⊥⊢
.Notez que cela sélectionne la dernière cellule principale des tableaux de rang supérieur.
la source
Utilisez
⊥
pour combiner la multiplication avec l'additionHypothèses:
a
etb
sont des termes qui ne nécessitent pas de parenthèses supplémentaires lorsqu'ils sont utilisés comme argument de gaucheC
est une expression qui peut nécessiter des parenthèses lorsqu'elle est utilisée comme argument de gauchea
b
C
évaluer en scalaires numériquesla source
Nombres complexes
Souvent négligés, ils offrent de merveilleuses opportunités pour raccourcir les expressions traitant des grilles, des labyrinthes, des fractales ou de la géométrie.
la source
Indexation de la longueur du vecteur modulo
⊃i⌽a
est souvent plus court que le naïf⊃a[(≢a)|i]
oua⊃⍨i|⍨≢a
(oùa
est un vecteur eti
est un entier, et⎕io
est 0)une variation utile à ce sujet (merci EriktheOutgolfer pour avoir souligné) est:
I↑Y⌽⍨I×X
oùY
est la concaténation de certainsI
vecteurs de longueur etX
est l'indice de celui que nous voulons choisir, par exemple:3↑'JanFeb...Dec'⌽⍨3×month
la source
Fonctions constantes
=⍨
et≠⍨
merci à ngn.Parfois, vous n'avez besoin que d'une seule valeur pour chaque élément d'une liste. Bien que vous puissiez être tenté d'utiliser
{value}¨
, il est plus court à utiliser,value⊣¨
mais pour certaines valeurs courantes, vous pouvez obtenir encore plus court (en utilisant⎕IO←0
):¯1
s avec⍬⍸list
0
s avec⍬⍳list
1
s avec⍬⍷list
Notez que ceux-ci ne fonctionnent que sur les listes (bien qu'ils puissent être imbriqués). Pour les tableaux de rang supérieur, vous pouvez utiliser ce qui suit pour obtenir tous les 0 et tous les 1:
1
s avec=⍨
0
s avec≠⍨
Si vous définissez
⎕ML←0
, tous les nombres peuvent être transformés en zéros (comme si0×
) avec:∊
Si vous n'avez besoin que d'un seul numéro, vous pourrez peut-être utiliser monadic
≡
pour obtenir 1 ou 0 au lieu d'utiliser1⊣
ou0⊣
.la source
⊣\
⊣
et⊢
avec/
et⌿
mérite un poste à part.Utilisation
⍨
Évitez les parenthèses
⍨
(Commute) peut vous faire économiser des octets en évitant les parenthèses. Chaque fois que vous avez une fonction où l'argument de gauche doit être mis entre parenthèses et pas celui de droite, vous pouvez enregistrer un octet, par exemple(A<B)÷C
→C÷⍨A<B
.Tableaux doubles
Pour ajouter une copie d'un tableau à sa fin, utilisez
,⍨A
ou⍪⍨A
.Numéros doubles
Au lieu d'utiliser
2∘×
pour doubler, vous pouvez utiliser+⍨
car il ajoute l'argument à lui-même:1+2∘×
→1++⍨
.Numéros carrés
Au lieu d'utiliser
2*⍨Y
carré, vous pouvez utiliser×⍨Y
car il multiplie l'argument par lui-même:2*⍨A+B
→×⍨A+B
.Permutation aléatoire
?⍨N
vous donnera une permutation aléatoire de la longueurN
.Auto-classification
Trouvez les indices de la première occurrence de chaque cellule principale avec
⍳⍨A
Compter les 1 de fin dans un vecteur booléen
Au lieu de
+/∧\⌽B
compter le nombre de 1 en fin,N
vous pouvez utiliser⊥⍨
.Composition inversée
A f∘g B
estA f g B
, mais si vous voulez(g A) f B
, utilisezf⍨∘g⍨
.Inverser réduire
f/ a1 a2 a3
esta1 f (a2 f a3)
. Si vous le souhaitez(a1 f a2) f a3
, utilisezf⍨/⌽
.Balayage inversé
f\ A B C
estA (A f B) (A f (B f C))
.f⍨/∘⌽¨,\ A B C
estA (A f B) ((A f B) f C)
.f⍨\⌽ A B C
est((A f B) f C) (B f C) C
.⌽f/∘⌽¨,\⌽ A B C
. est(A f (B f C)) (B f C) C
.la source
Énumérer les caractères d'une chaîne sans
⍳≢
Tâche: étant donné deux chaînes, S et T, listez les indices de leur concaténation. Par exemple
S←'abcd'
etT←'xyz'
donne1 2 3 4 5 6 7
.Une solution dfn peut être
S{⍳≢⍺,⍵}T
mais vous voulez la raccourcir en faisant tacite.⍳≢,
ne va pas fonctionner car les règles d'analyse du train analyseront ceci comme(⍳)≢(,)
vous le souhaitez(⍳≢),
.Dyadique
⍋
avec un argument gauche vide classe les tableaux de caractères simples selon leur ordre actuel, qui est le même que⍳≢
. Ainsi{⍳≢⍺,⍵}
peut devenir{⍬⍋⍺,⍵}
, afin que nous puissions écrire notre train comme⍬⍋,
.Notez que cela ne fonctionne pas pour les tableaux numériques ou mixtes.
la source