Puzzler for a Monday

Given a cell array of strings
A = {'MATLAB','HURRAY','SPARKLY','KITTENS','FUN'};
and a particular string value
B = 'KITTENS';
ensure that B is the last element of the cell array. If it isn't, move it to the end of A.
You cannot assume that B appears at all (in which case return A unchanged), but you can assume B does not appear more than once.
[I have a solution, but I post this as a puzzle because I bet someone can find a slicker one.]

回答 (6 件)

Azzi Abdelmalek
Azzi Abdelmalek 2013 年 7 月 22 日

2 投票

idx=strcmp(A,B)
out=[A(~idx) A(idx)]
the cyclist
the cyclist 2013 年 7 月 22 日

2 投票

Here's mine:
[~,idx] = sort(ismember(A,B));
A = A(idx)
Sean de Wolski
Sean de Wolski 2013 年 7 月 22 日

1 投票

idx = ismember(A,B);
C = cat(isrow(A)+1,A(~idx),A(idx))

1 件のコメント

Evan
Evan 2013 年 7 月 22 日
Awesome. I especially like the "isrow" trick. I'll be remembering that one.

サインインしてコメントする。

Evan
Evan 2013 年 7 月 22 日
編集済み: Evan 2013 年 7 月 22 日

0 投票

Here's my solution. It's ugly, but I think it's fairly general. :P
function A = cell_shuffle(A)
idx = cellfun(@(x)isequal(B,x),A);
A = [A(~idx) A(idx)];
end
This would make for a nice CODY problem, by the way.
Abdullah Caliskan
Abdullah Caliskan 2015 年 1 月 27 日

0 投票

k=ismember(A,B) A(k)='' if sum(k)==0 A=A; else A=[A B] end
David Young
David Young 2015 年 1 月 27 日

0 投票

[~, idx] = ismember(B, A);
C = circshift(A, [0 -idx]);

1 件のコメント

David Young
David Young 2015 年 1 月 27 日
Note: does not preserve the ordering of the other elements.

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeStartup and Shutdown についてさらに検索

製品

質問済み:

2013 年 7 月 22 日

コメント済み:

2015 年 1 月 27 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by