Ruby 如何用一种简洁的方法求出给定数组中相邻元素之差

alex_cheng · 2014年03月13日 · 最后由 bluexuemei 回复于 2014年04月21日 · 4501 次阅读

给定 包含整数的数组 A = [a_0, a_1, a_2, ..., a_n],求 [a_1 - a_0, a_2 - a_1, ..., a_n - a_n-1]

我尝试用 Array 的 rotate 方法,得到 A.rotate = [a_1, a_2, ..., a_n, a_0],但是我找不到一种方法对 A.rotate 和 A 做向量减运算。

向量计算就用 Vector 呗。

A.each_with_index.map{|x, i| A[i] - A[i-1] if i != 0}.compact

或者

B = A.rotate
A.zip(B).map { |x, y| y - x }[0..-2]
匿名 #4 2014年03月13日
A.rotate.zip(A).take(A.count - 1).map{ |pair| pair[0] - pair[1] }

这样?

其实下面这个也可以吧

A.take(A.count - 1).map.with_index{ |v, index| A[index + 1] - v }

#5 楼 @quakewang each_cons 好方便啊。。

#6 楼 @wcp1231 嗯,Enumerable 有很多方便的内置方法

ruby 手生,提供一个 js 版本供参考

var _ = require('underscore');

function map (datas, cal, init) {
    function iter (datas, prev, now) {
        if (datas === undefined || datas.length === 0) {
            return now;
        }

        var current = _.first(datas);   
        var item = cal(current, prev);

        return iter(_.rest(datas), current, now.concat(item) );
    }

    return _.rest(iter(datas, 0, []));
}

var ret = map([1,2,3,4,5], function(current, prev) {
    return current - prev;
}, 0);

console.log(ret);// => [ 1, 1, 1, 1 ]


function curry3 (func) {
    return function(last) {
        return function(middle) {
            return function(first) {
                return func(first, middle, last);
            };
        };
    };
}

var sub_each = curry3(map)(0)(function(c, p) { return c - p;});

console.log(sub_each([1,4,5,6,1,100])); // => [ 3, 1, 1, -5, 99 ]

#5 楼 @quakewang cool! 瞬间有一种被秒杀的感觉!

@lvjian700 哈哈我相信 js 应该会有更好得解决办法,当然达不到一行秒杀。

@lgn21st 此贴应加精!

#11 楼 @howiehu javascript 一行秒杀的方案。

[10,2,3,4,10].map(function(a, b) { return a - b }).slice(1); // => [ 1, 1, 1, 6 ] 

兄弟对不起了。哈哈!

#8 楼 方案,主要是自己不熟悉 js 中的 map, 自己实现了一个 map. 老版本的 js,估计没这么方便。

P.S:(错的,新版见 #21 楼

#13 楼 @lvjian700 你这明显没 Ruby 的短!

⌽1↓⌽-A-1⌽A

#1 楼 @chaixl

require 'matrix'
(Vector[*A[1..-1]] - Vector[*A[0..-2]]).to_a

#14 楼 @howiehu 是啊。javascript, function 太占地方了,return 也显得多余

学习了。。。

#13 楼 @lvjian700 2-10 不等于 1 啊大哥

#13 楼 @lvjian700

map 方法会给原数组中的每个元素 (必须有值) 都调用一次 callback 函数.callback 每次执行后的返回值组合起来形成一个新数组。callback 函数只会在有值的索引上被调用; 那些从来没被赋过值或者使用 delete 删除的索引则不会被调用。

callback 函数会被自动传入三个参数:数组元素,元素索引,原数组本身。

https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Array/map

#19 楼 @luikore #20 楼 @Alexander #14 楼 @howiehu

的确错了,面壁中... = =|||

[10,2,3,4,10].map(function(v, i, arr) { return v - ((i === 0) ? 0 : arr[i - 1]) }).slice(1); //=> [ -8, 1, 1, 6 ]

#21 楼 @lvjian700 算是比较简洁了,学习

需要 登录 后方可回复, 如果你还没有账号请 注册新账号