Come scambiare elementi in un vettore usando una funzione anonima in Octave?


15

Scambiare due elementi in un vettore / matrice è molto semplice in Octave:

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

Sfortunatamente, devo ancora trovare un modo per farlo all'interno di una funzione anonima. Mentre la funzione seguente è sintatticamente corretta, restituisce solo i due elementi che vengono scambiati, non l'intero xvettore:

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

Esiste un modo per ottenere il comportamento desiderato utilizzando funzioni anonime in modo da golf? È possibile scambiare diversi elementi in questo modo usando una funzione anonima?

Ho potuto creare un vettore di indicizzazione: f=@(x)x([4,2,3,1,5]), ma la creazione di un tale vettore dinamico probabilmente prenderà un sacco di byte troppo.


Risposte:


21

Elenco degli argomenti

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

Provalo online!


5
Aspetta cosa ? Non ho mai saputo che ciò fosse possibile in Octave. Questo apre tante nuove tecniche ....
Sanchises,

4
Cosa nel ...?
Stewie Griffin,

1
Si prega di pubblicare questo nella domanda Suggerimenti per l'ottava! Con questa tecnica, puoi praticamente fare tutto nella lista degli argomenti, quindi non dovrai mai più scegliere tra una funzione 'completa' e anonima. Sono scioccato.
Sanchises,

3
Sorprendente. A proposito, puoi rimuovere la finale ;ai fini del conteggio dei byte
Luis Mendo,

Grazie a tutti. @ Sanchises Sembra che Octave sia un linguaggio scioccante. Stai attento! È stato aggiunto ai suggerimenti.
rahnema1,

11

Essere eval

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

Provalo online!


In Matlab le parentesi non possono essere omesse:

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

9
Solo su PPCG è evalla risposta :-)
Stewie Griffin,

Vuoi aggiungere questo alla domanda dei suggerimenti di Octave? foresegui il ciclo all'interno di una funzione anonima usando evalmolti byte salvati lì, e probabilmente può farlo anche su molte altre sfide ,,,
Stewie Griffin,

Non sono sicuro che sia mai più golfista, ma suppongo che tu possa farlo anche senza una funzione anonima: s='x([1 4])=x([4 1])';eval(s)- Suppongo che questo sia interessante soprattutto se hai già fatto una funzione per fare eval con caratteri minimi.
Dennis Jaheruddin,


2
Penso che questa risposta sia l'unica finora valida sia Octave che Matlab.
Batman,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.