MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply Today
Asked by the cyclist on 3 Jul 2011

Inspired by an assignment in my son's Java programming class:

Write a *one-liner* that takes as input an array of numbers (e.g. x = [1 2 3]) and which outputs an array of integers that is "incremented" properly, (in this case, y = [1 2 4]).

Examples of proper input/output:

x = [1 9 1 9] ----> y = [1 9 2 0]

and

x = [9 9 9] ----> y = [1 0 0 0]

No semicolons allowed in your one line!

*No products are associated with this question.*

Answer by Fangjun Jiang on 3 Jul 2011

Accepted answer

I like this Golf challenge. Inspired by Paulo's entry.

num2str(str2num(sprintf('%d',x))+1)-'0'

is shorter.

Answer by proecsm on 3 Jul 2011

kind of a hybrid:

sprintf('%d',sum(x.*10.^(numel(x)-1:-1:0))+1)-'0'

Show 2 older comments

Answer by Andrei Bobrov on 3 Jul 2011

str2num(num2str(10.^(length(x)-1:-1:0)*x'+1)')'

**ADD**

z = 10.^(numel(x)-1:-1:0)*x'+1 y = round(rem(fix(z.*10.^-(fix(log10(z)):-1:0))*.1,1)*10)

Answer by Jan Simon on 3 Jul 2011

My submission is neither a one-liner nor free of semicolons. But the total number of lines and semicolons is less than in STR2NUM and NUM2STR, which have 86 and 217 lines and call INT2STR in addtion.

n = length(x); q = find(x ~= 9, 1, 'last'); if isempty(q) % [9, 9, 9, ...] x = 1; x(n + 1) = 0; % or x = [1, zeros(1, n)] else % Any non-9 is found x = [x(1:q - 1), x(q) + 1, zeros(1, n - q)]; end

Answer by David Young on 3 Jul 2011

One-liner, avoiding string operations:

diff([0 (floor((sum(x.*10.^(length(x)-1:-1:0))+1) ./ 10.^(floor(log10(sum(x.*10.^(length(x)-1:-1:0))+1)):-1:0))) .* 10.^(floor(log10(sum(x.*10.^(length(x)-1:-1:0))+1)):-1:0)]) ./ 10.^(floor(log10(sum(x.*10.^(length(x)-1:-1:0))+1)):-1:0)

**EDIT**: This is only one line of code, even though formatting on the Answers web page makes it look like 4 lines.

David Young on 4 Jul 2011

This fails if there are more than about 16 elements in the vector, because you only get about 16 significant figures in a double.

Jan Simon on 4 Jul 2011

+1: A one-liner without calls to other M-files and therefore even no hidden semicolons.

Answer by Paulo Silva on 3 Jul 2011

x=[1 2 3]; %example input xr=num2str(str2num(strrep(num2str(x),' ',''))+1)-'0' %xr =[1 2 3 4]

Answer by the cyclist on 3 Jul 2011

Here's one just a bit shorter than andrei bobrov's [using numel() to trim one character from length()]:

str2num(num2str(10.^(numel(x)-1:-1:0)*x'+1)')'

Anything shorter?!

Answer by David Young on 4 Jul 2011

Also one line of code (formatting for the web page will display it over more than one line of text):

double(regexprep(char(x), {['([' char(0:8) ']?)(' char(9) '*)$'] ['^(' char(0) '+)$']}, {'${char($1+1)}${regexprep($2,char(9),char(0))}' [char(1) '$1']}))

David Young on 4 Jul 2011

This one works for long vectors with thousdands of elements (my arithmetic-based solution doesn't).

Answer by David Young on 4 Jul 2011

I'm sorry about this one - it's somewhat over the top, and I promise I won't do any more. However, since I think it's a different approach to the others (arithmetic operations but no powers of 10!), here it is:

[ones(1, sum(x)==9*length(x)) x(1:length(x)-sum(cumsum(fliplr(x)) == 9*(1:length(x)))-1) repmat(x(max(1, length(x)-sum(cumsum(fliplr(x)) == 9*(1:length(x)))))+1, 1, sum(x)~=9*length(x)) zeros(1, sum(cumsum(fliplr(x)) == 9*(1:length(x))))]

## 7 Comments

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/10788#comment_23780

I need a little clarification. As if the output is 124=123+1, 1920=1919+1 and 1000=999+1? What if your input is [1 2 34], should the output be [1 2 35] or [1 2 3 5]?

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/10788#comment_23783

You can assume the elements in the input array are single digits, 0-9.

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/10788#comment_23826

How big can the array be? For example, should the answer work correctly for x=repmat(9, 1, 100)?

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/10788#comment_23828

Sorry, the example isn't stringent enough: I mean x=repmat(9,1,1000).

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/10788#comment_23850

I only intended it to be for "smallish" vectors of numbers, but feel free to create whatever conditions you want, for maximum enjoyment.

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/10788#comment_23922

+1 vote for the interesting puzzler, it's the first vote!

Please vote on it if you found it interesting and you want more of them.

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/10788#comment_23924

Sure. +1