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.


Respostas:


21

Lista de argumentos

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

Experimente online!


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])')

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


2
Acho que essa resposta é a única que é válida tanto para o Octave quanto para o Matlab.
Batman

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.