Comment permuter des éléments dans un vecteur en utilisant une fonction anonyme dans Octave?

15

L'échange de deux éléments dans un vecteur / matrice est très simple dans Octave:

x='abcde';
x([4,1])=x([1,4])
x = 
   dbcae

Malheureusement, je n'ai pas encore trouvé de moyen de le faire dans une fonction anonyme. Bien que la fonction ci-dessous soit syntaxiquement correcte, elle ne renvoie que les deux éléments qui sont échangés, pas le xvecteur entier :

f=@(x)(x([4,1])=x([1,4]))
f(x)
ans = 
     ad

Existe-t-il un moyen d'atteindre le comportement souhaité en utilisant des fonctions anonymes de manière golfique? Plusieurs éléments peuvent-ils être échangés de cette façon à l'aide d'une fonction anonyme?

Je pourrais créer un vecteur d'indexation:, f=@(x)x([4,2,3,1,5])mais la création dynamique d'un tel vecteur prendra probablement beaucoup d'octets également.

Stewie Griffin
la source
Meta post pertinent .
Stewie Griffin

Réponses:

21

Liste d'arguments

f=@(x,y=x([4 1])=x([1 4]))x;

Essayez-le en ligne!

rahnema1
la source
5
Attends quoi ? Je n'ai jamais su que c'était possible dans Octave. Cela ouvre tellement de nouvelles techniques ....
Sanchises
4
Quoi dans le ...?
Stewie Griffin
1
Veuillez poster ceci dans la question Astuces pour Octave! Avec cette technique, vous pouvez pratiquement tout faire dans la liste d'arguments, vous n'avez donc plus jamais besoin de choisir entre une fonction «complète» et anonyme. Je suis choqué.
Sanchises
3
Incroyable. BTW, vous pouvez supprimer la finale ;aux fins du comptage d'octets
Luis Mendo
Merci à tous. @ Sanchises Il semble qu'Octave soit un langage choquant. Faites attention! Il est ajouté aux conseils.
rahnema1
11

Être eval

f=@(x)eval"x([4 1])=x([1 4])"

Essayez-le en ligne!


Dans Matlab, les parenthèses ne peuvent pas être omises:

f=@(x)eval('x([4 1])=x([1 4])')
Luis Mendo
la source
9
La réponse est uniquement sur PPCG eval:-)
Stewie Griffin
Voulez-vous ajouter ceci à la question des conseils Octave? forboucle à l'intérieur d'une fonction anonyme en utilisant evalbeaucoup d'économies là-bas, et peut probablement le faire sur de nombreux autres défis aussi ,,,
Stewie Griffin
Je ne sais pas s'il est jamais golfeur, mais je suppose que vous pouvez le faire même sans fonction anonyme: s='x([1 4])=x([4 1])';eval(s)- Je suppose que c'est surtout intéressant si vous avez déjà fait une fonction pour faire une évaluation avec un minimum de caractères.
Dennis Jaheruddin
1
Ajouté :)
Stewie Griffin
2
Je pense que cette réponse est la seule à ce jour qui soit à la fois valide Octave et Matlab.
Batman
8

Réseau de cellules

Une option consiste à utiliser un tableau de cellules, comme ceci:

f=@(x){x([1,4])=x([4,1]);x}{2}

Essayez-le en ligne!

Stewie Griffin
la source
Joli! Me rappelle cette astuce
Luis Mendo