Como trocar elementos em um vetor usando uma função anônima no Octave?

15

Trocar dois elementos em um vetor / matriz é muito simples no Octave:

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

Infelizmente, ainda não encontrei uma maneira de fazer isso dentro de uma função anônima. Embora a função abaixo esteja sintaticamente correta, ela apenas devolve os dois elementos que são trocados, e não o xvetor inteiro :

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

Existe uma maneira de alcançar o comportamento desejado usando funções anônimas de um modo de golfe? Vários elementos podem ser trocados dessa maneira usando uma função anônima?

Eu poderia criar um vetor de indexação:, f=@(x)x([4,2,3,1,5])mas criar esse vetor dinamicamente provavelmente também levará muitos bytes.

Stewie Griffin
fonte
Meta post relevante .
Stewie Griffin

Respostas:

21

Lista de argumentos

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

Experimente online!

rahnema1
fonte
5
Espera o que ? Eu nunca soube que isso era possível na oitava. Isso abre tantas novas técnicas ....
Sanchises
4
O que no ...?
Stewie Griffin
1
Poste isso na pergunta Dicas para oitavas! Com essa técnica, você pode basicamente fazer tudo na lista de argumentos, para nunca precisar escolher entre uma função 'completa' e anônima novamente. Estou chocado.
Sanchises
3
Surpreendente. BTW, você pode remover a final ;para fins de contagem de bytes
Luis Mendo
Obrigado a todos. @ Sanchises Parece que o Octave é uma linguagem chocante. Seja cuidadoso! É adicionado às dicas.
rahnema1
11

Estar eval

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

Experimente online!


No Matlab, os parênteses não podem ser omitidos:

f=@(x)eval('x([4 1])=x([1 4])')
Luis Mendo
fonte
9
Apenas em PPCG é evala resposta :-)
Stewie Griffin
Deseja adicionar isso à pergunta de dicas do Octave? forloop dentro de uma função anônima usando evalsalvou um monte de bytes lá, e provavelmente pode fazê-lo em muitos outros desafios também ,,,
Stewie Griffin
Não tenho certeza se é sempre mais golfista, mas suponho que você possa fazê-lo mesmo sem a função anônima: s='x([1 4])=x([4 1])';eval(s)- Suponho que isso seja interessante principalmente se você já criou uma função para avaliar com caracteres mínimos.
Dennis Jaheruddin
1
Adicionado :)
Stewie Griffin
2
Acho que essa resposta é a única que é válida tanto para o Octave quanto para o Matlab.
Batman
8

Matriz celular

Uma opção é usar uma matriz de células, assim:

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

Experimente online!

Stewie Griffin
fonte
Agradável! Lembra-me deste truque
Luis Mendo