Quick Ruby equivalent of "each_cons"

ruby

Ruby has each_cons which can be used as

class Pair def initialize(left, right) @left = left @right = right end end votes = ["a", "b", "c", "d"] pairs = votes.each_cons(2).map { |vote| Pair.new(*vote) } p pairs # [#<Pair @left="a", @right="b">, #<Pair @left="b", @right="c">, #<Pair @left="c", @right="d">] 

Swift

The same code in swift, but without each_cons function

 struct Pair { let left: String let right: String } let votes = ["a", "b", "c", "d"] var pairs = [Pair]() for i in 1..<votes.count { let left = votes[i-1] let right = votes[i] pairs.append(Pair(left: left, right: right)) } print(pairs) // [Pair(left: "a", right: "b"), Pair(left: "b", right: "c"), Pair(left: "c", right: "d")] 

How can this quick code be shorter or simpler?

+5
source share
2 answers
 zip(votes, votes.dropFirst()) 

This creates a sequence of tuples.

Example

 struct Pair { let left: String let right: String } let votes = ["a", "b", "c", "d"] let pairs = zip(votes, votes.dropFirst()).map { Pair(left: $0, right: $1) } print(pairs) // [Pair(left: "a", right: "b"), Pair(left: "b", right: "c"), Pair(left: "c", right: "d")] 
+6
source

This is a common solution that I came across, but it seems terribly inefficient. To implement each_cons(n) , set my clump to n :

  let arr = [1,2,3,4,5,6,7,8] let clump = 2 let cons : [[Int]] = arr.reduce([[Int]]()) { memo, cur in var memo = memo if memo.count == 0 { return [[cur]] } if memo.count < arr.count - clump + 1 { memo.append([]) } return memo.map { if $0.count == clump { return $0 } var arr = $0 arr.append(cur) return arr } } 
+2
source

Source: https://habr.com/ru/post/1257412/


All Articles