NAME

Sidef::Types::Array::Array

DESCRIPTION

This class implements ...

SYNOPSIS

var obj = Array(...)

INHERITS

Inherits methods from:

* Sidef::Object::Object

METHODS

&

a & b

Returns the intersection of two arrays.

<a a a b c> & <a x y a c>    #=> ["a", "a", "c"]

Aliases: and

*

a * n

Repeats the content of array a n times, returning a new array.

<a b> * 2   #=> ["a", "b", "a", "b"]

Aliases: mul

**

a ** n

Matrix exponentiation, excpecting array a to be a 2D array.

var A = [[1, 2, 0],
         [0, 3, 1],
         [1, 0, 0]]

say A**5     #=> [[37, 274, 84], [42, 311, 95], [11, 84, 26]]

Aliases: mpow, matrix_pow

+

a + b

Array concatenation, returning a new array.

<a b> + <c d>    #=> ["a", "b", "c", "d"]

Aliases: add, concat

-

a - b

Array difference: removes any element from array a that exists inside array b, returning a new array.

<a a a b c> - <a x y a c>       #=> ["a", "b"]

Aliases: sub, diff

...

a...

Converts array a into a list.

var (a,b,c) = <1 2 3>...

Aliases: to_list

/

a / n

Divides the array a into n segments.

If the division is not exact, the remaining incomplete segment is added to the end of the returned array.

<a b c d>   / 2     #=> [["a", "b"], ["c", "d"]]
<a b c d e> / 2     #=> [["a", "b"], ["c", "d"], ["e"]]

Aliases: ÷, div

<

a < b

Less-than array comparison, done term-by-term, returning true or false.

Aliases: lt

<=>

a <=> b

Array comparison, done term-by-term, returning:

 1 when a > b
 0 when a == b
-1 when a < b

Aliases: cmp

==

a == b

Returns true if a and b are equal to each other.

Aliases: eq

>

a > b

Greater-than array comparison, done term-by-term, returning true or false.

Aliases: gt

^

a ^ b

Returns the set difference of two arrays.

<a a a b c> ^ <a x y a c>   #=> ["a", "b", "x", "y"]

Aliases: xor

|

a | b

Returns the union of two arrays.

<a a a b c> | <a x y a c>   #=> ["a", "a", "a", "b", "c", "x", "y"]

Aliases: or

|>>

a |>> b

Returns the

Aliases: pipeline_map_op

|X>

a |X> (block1, block2, ...)

Pipeline cross-product operator, mapping each element to each given block.

say ([1,2,3] |X> ({ .cube }, { _+42 }))     #=> [1, 43, 8, 44, 27, 45]

Aliases: pipeline_cross_op

|Z>

self.|Z>(*callbacks)

Returns the

Aliases: pipeline_zip_op

«

a « b

Returns the

Aliases: <<, push, append

»

a » b

Returns the

Aliases: >>, pop, drop_last, drop_right

a ∋ b

Returns the

Aliases: has, contain, include, contains, includes

a ∌ b

Returns the

a ≠ b

Returns the

Aliases: !=, ne

a ≤ b

Returns the

Aliases: <=, le

a ≥ b

Returns the

Aliases: >=, ge

abbrev

arr.abbrev
arr.abbrev(/pattern/)

Returns an Hash with the unambiguous abbreviations for the given array of strings.

say ['loved', 'loving', 'lover', 'lost'].abbrev

Output:

Hash(
    "los"    => "lost",
    "lost"   => "lost",
    "loved"  => "loved",
    "lover"  => "lover",
    "lovi"   => "loving",
    "lovin"  => "loving",
    "loving" => "loving"
)

When an additionaly regular expression is given, it collects only the abbreviations that will match the regex.

Aliases: abbreviations

acc

self.acc(block)

Returns the

Aliases: accumulate

acc_by

self.acc_by(block)

Returns the

Aliases: accumulate_by

all

self.all(block)

Returns the

all_composite

self.all_composite

Returns the

all_prime

self.all_prime

Returns the

any

self.any(block)

Returns the

avg

arr.avg

Returns the average of a list of numbers.

say [1,2,3,4].avg   #=> 2.5

avg_by

arr.avg_by { ... }

Returns the average of a list of numbers, by mapping each value to a given block of code.

say [1,2,3,4].avg_by { _**2 }   #=> 7.5

bindex

arr.bindex(obj)

Returns the index of a given element inside a sorted array, using the Binary Search algorithm.

var a = ["Alice", "Jane", "Joe", "John", "Kate", "Zerg"]

say a.bindex('Alice')   #=> 0 (first index)
say a.bindex('Jane')    #=> 1 (second index)

Aliases: bsearch_index

bindex_by

arr.bindex_by { ... }

Returns the index of any element inside a sorted array, based on a given comparison block, using the Binary Search algorithm.

var a = ["Alice", "Jane", "Joe", "John", "Kate", "Zerg"]

say a.bindex { _ <=> 'Joe' }     #=> 2 (third index)
say a.bindex { _ <=> 'John' }    #=> 3 (fourth index)

Aliases: bsearch_index_by

bindex_ge

self.bindex_ge(obj)

Returns the

bindex_ge_by

self.bindex_ge_by(obj)

Returns the

bindex_le

self.bindex_le(obj)

Returns the

bindex_le_by

self.bindex_le_by(obj)

Returns the

bindex_max

self.bindex_max(obj)

Returns the

bindex_max_by

self.bindex_max_by(block)

Returns the

bindex_min

self.bindex_min(obj)

Returns the

bindex_min_by

self.bindex_min_by(block)

Returns the

binsert

arr.binsert(obj)

Inserts an element into a sorted array, such that the array will still be sorted.

var a = ['a', 'b', 'd']
a.binsert('c')                  # inserts 'c' before 'd'
say a                           # prints: ['a', 'b', 'c', 'd']

Modifies the array in-place.

binsplit

arr.binsplit {|a,b| ... }

Applies the binary splitting algorithm to the self-array, returning the result computed using the given block of code.

say [1,2,3,4,5].binsplit {|a,b| a*b }   #=> 120

bsearch

self.bsearch(obj)

Returns the

Aliases: bsearch_by

bsearch_ge

self.bsearch_ge(obj)

Returns the

Aliases: bsearch_ge_by

bsearch_le

self.bsearch_le(obj)

Returns the

Aliases: bsearch_le_by

bsearch_max

self.bsearch_max(obj)

Returns the

bsearch_min

self.bsearch_min(obj)

Returns the

bshuffle

arr.bshuffle

Shuffles an array in such a way that no element will be on the same position as in the original array (if possible).

Aliases: best_shuffle

cartesian

arr.cartesian
arr.cartesian {|*c| ... }

Returns the Cartesian product of a 2D array.

say [[1,2],[3,4]].cartesian    #=> [[1,3], [1,4], [2,3], [2,4]]

When a block is given, it gets called which each combination:

[[1,2],[3,4],[5,6]].cartesian {|*c| say c }

Output:

[1, 3, 5]
[1, 3, 6]
[1, 4, 5]
[1, 4, 6]
[2, 3, 5]
[2, 3, 6]
[2, 4, 5]
[2, 4, 6]

cfrac2num

arr.cfrac2num

Converts a given continued fraction expansion to a number.

var c = Num.pi.cfrac(10)    # [3, 7, 15, 1, 292, 1, 1, 1, 2, 1]
say c.cfrac2num.as_frac     #=> 4272943/1360120

change_to

self.change_to(arg)

Returns the

chrs

self.chrs(encoding)

Returns the

Aliases: decode, join_bytes

circular_permutations

self.circular_permutations

Returns the

clear

self.clear

Returns the

collapse

self.collapse(initial)

Returns the

combinations

self.combinations

Returns the

combinations_with_repetition

self.combinations_with_repetition

Returns the

combine

self.combine(block)

Returns the

compact

self.compact

Returns the

cons

arr.cons(n)

Returns a new array of arrays with n-consecutive elements from the self-array.

say [1,2,3,4].cons(2)      #=> [[1, 2], [2, 3], [3, 4]]

Aliases: map_cons

contains_all

self.contains_all(array)

Returns the

contains_any

self.contains_any(array)

Returns the

contains_type

self.contains_type(obj)

Returns the

count

self.count(obj)

Returns the

count_by

self.count_by(block)

Returns the

cross_op

self.cross_op(operator, arg)

Returns the

Aliases: cross_operator

defined

self.defined(index)

Returns the

delete

self.delete(obj)

Returns the

Aliases: remove

delete_by

self.delete_by(block)

Returns the

Aliases: delete_if, remove_by, remove_if

delete_first

self.delete_first(obj)

Returns the

Aliases: remove_first

delete_first_by

self.delete_first_by(block)

Returns the

Aliases: delete_first_if, remove_first_by, remove_first_if

delete_last

arr.delete_last(obj)

Removes the last obj element from the array, modifying the array in-place.

var arr = %w[a b c a]
arr.delete_last('a')
say arr                 #=> ["a", "b", "c"]

Returns true if such an element was removed.

Aliases: remove_last

delete_last_by

self.delete_last_by(block)

Returns the

Aliases: delete_last_if, remove_last_by, remove_last_if

derangements

self.derangements

Returns the

Aliases: complete_permutations

det

self.det

Returns the

Aliases: determinant

det_bareiss

self.det_bareiss

Returns the

diffs

arr.diffs(n=1)

Returns the n-th differences of the array (calling sub).

var a = [43, 97, 128, 999]

say a.diffs                     #=> [54, 31, 871]
say a.diffs(2)                  #=> [-23, 840]
say a.diffs(3)                  #=> [863]

Aliases: differences, nth_differences

dig

self.dig(key, *keys)

Returns the

digits2num

arr.digits2num(base=10)

Converts the list of values returned by Number digits(n, base) back to n.

say 1234.digits.digits2num              #=> 1234
say [73, 56, 0, 76, 22].digits2num(100) #=> 2276005673

Aliases: from_digits

each_2d

arr.each_2d {|a,b,c,...| ... }

Iterate over a 2D array.

[[1,2],[3,4]].each_2d {|a,b|
    say (a**2 + b**2)
}

each_cons

arr.each_cons(n, { ... })

Iterate over n consecutive values at a time.

[1,2,3,4,5,6,7].each_cons(3, {|*c| say c })

Outputs:

[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
[5, 6, 7]

each_k

self.each_k(block)

Returns the

Aliases: each_key, each_index

each_kv

self.each_kv(block)

Returns the

each_slice

self.each_slice(n, block)

Returns the

end

self.end

Returns the

Aliases: offset

exists

self.exists(index)

Returns the

Aliases: has_index

expand

arr.expand { ... }

Recursively expand an array, given a block of code.

say [1,[2,[3,4]],5].expand { _ }    #=> [1, 5, 2, 3, 4]

Aliases: expand_by

extract_by

self.extract_by(block)

Returns the

extract_first_by

self.extract_first_by(block)

Returns the

extract_last_by

self.extract_last_by(block)

Returns the

fetch

arr.fetch(index, default)

Fetches a value at the given index. When the index does not exist, it returns the default value.

var a = [3,9,27]
say a.fetch(2, 42)     # fetches index 2 and prints: 27
say a.fetch(3, 42)     # fails to fetch index 3, therefore prints: 42

find

self.find(block)

Returns the

Aliases: first_by

flat

self.flat

Returns the

Aliases: flatten

flat_map

arr.flat_map { ... }

Similar to .map{}, but it expects the returned block-value to be an array, which will be collected as a list.

say [1,2,3,4,5].flat_map { .factor }      #=> [2, 3, 2, 2, 5]

flip

self.flip

Returns the

Aliases: reverse

for

self.for(block)

Returns the

Aliases: each, foreach

freq

arr.freq

Returns a frequency Hash for the elements inside the array.

say ["a","b","a"].freq      #=> Hash(a => 2, b => 1)

freq_by

self.freq_by(block)

Returns the

ft

self.ft

Returns the

gauss_jordan_invert

self.gauss_jordan_invert

Returns the

gauss_jordan_solve

self.gauss_jordan_solve(vector)

Returns the

gcd

self.gcd(block)

Returns the

gcd_by

self.gcd_by(block)

Returns the

gcud

self.gcud(block)

Returns the

gcud_by

self.gcud_by(block)

Returns the

getopt

arr.getopt(...)

Parse an array containing (long) command-line arguments, automatically converting the argument-values based on the types of the default values.

var file = File('file.dat')
var length = 42
var verbose = false

var args = ['--file', 'foo.txt', '--length', '1234', '--verbose']

args.getopt(
    'length=i' => \length,
    'file=s'   => \file,
    'verbose!' => \verbose,
)

say file.dump           #=> File("foo.txt")
say length              #=> 1234
say verbose             #=> true

grep

self.grep(block)

Returns the

Aliases: select

grep_2d

arr.grep_2d {|a,b,c,...| ... }

Filtering of a 2D array, given a block of code.

say [[1,2],[3,4]].grep_2d {|a,b| a+b == 7 }    #=> [[3,4]]

grep_kv

self.grep_kv(block)

Returns the

Aliases: select_kv

group

self.group(block)

Returns the

Aliases: group_by

self.head(arg)

Returns the

Aliases: first

index

arr.index(obj)
arr.index { ... }

Returns the first index of a given item inside the array.

say %w(a b c).index("a")   #=> 0
say %w(a b c).index("c")   #=> 2

When a block is given, it returns the first index of the element for which the block returns a true value:

say %w(A B C).index { .lc == 'b' }   #=> 1

Aliases: index_by, first_index, first_index_by

inject

arr.inject {|a,b| ... }
arr.inject({|a,b| ... }, obj)

Reduce a given array to a single element, given a block of code that is called with a pair a,b, where a is the previous result returned by the block and b is the current element of the array.

The initial value of a is the first element of the array.

say [1,2,3,4].reduce {|a,b| a + b }        #=> 10

When an additional argument is given, it will be used as the initial value for a:

say [1,2,3,4].reduce({|a,b| a + b }, 5)    #=> 15

Aliases: reduce

insert

self.insert(i, *objects)

Returns the

inv

self.inv

Returns the

Aliases: invert, inverse

is_empty

self.is_empty

Returns the

isort

self.isort

Returns the

isort_by

self.isort_by(block)

Returns the

item

self.item(index)

Returns the

items

self.items(*indices)

Returns the

iter

self.iter

Returns the

jaro

jaro(arr1, arr2, winkler=false)

Calculates the Jaro similarity between two arrays. Jaro distance is a measure of similarity between two sequences of symbols, based on the number of matching symbols and transpositions.

say jaro("accommodate".chars, "accomodate".chars)         #=> 0.96969696969697

When the third argument is true, it returns the Jaro-Winkler similarity score.

say jaro("accommodate".chars, "accomodate".chars, true)   #=> 0.981818181818182

join

self.join(delim, block)

Returns the

join_insert

arr.join_insert(obj)

Inserts the given object between every element of the array. Returns a new array.

say [1,2,3,4].join_insert(0)    #=> [1, 0, 2, 0, 3, 0, 4]

keys

arr.keys

Returns an array with the indices of the self-array.

say ["x","y","z"].keys   #=> [0, 1, 2]

Aliases: indices

keys_by

arr.keys_by { ... }

Returns an array with the indices for which the given block returns a true value.

say [41, 42, 43].indices_by { .is_prime }     #=> [0, 2]

Aliases: indices_by

keys_of

arr.keys_of(obj)

Returns an array with the indices of obj inside the self-array.

say [1,2,3,1,4,1].indices_of(1)         #=> [0, 3, 5]

Aliases: indices_of

kv

self.kv

Returns the

Aliases: pairs, zip_indices

last

self.last(arg)

Returns the

Aliases: tail

last_by

self.last_by(block)

Returns the

last_uniq

self.last_uniq

Returns the

Aliases: last_unique

last_uniq_by

self.last_uniq_by(block)

Returns the

Aliases: last_unique_by

lcm

self.lcm(block)

Returns the

lcm_by

self.lcm_by(block)

Returns the

len

self.len

Returns the

Aliases: size, length

lev

self.lev(arg)

Returns the

Aliases: leven, levenshtein

madd

m1.madd(m2)

Returns the

Aliases: matrix_add

make

self.make(size, obj)

Returns the

make_by

self.make_by(size, block)

Returns the

map

self.map(block)

Returns the

Aliases: collect

map_2d

arr.map_2d {|a,b,c,...| ... }

Mapping of a 2D array, given a block of code.

say [[1,2],[3,4]].map_2d {|a,b| [a**2, b**2] }   #=> [[1, 4], [9, 16]]

map_kv

self.map_kv(block)

Returns the

Aliases: collect_kv

map_op

self.map_op(operator, *args)

Returns the

Aliases: map_operator

map_reduce

arr.map_reduce {|a,b| ... }

Behaves almost like the reduce method, except that all the intermediary terms are returned as an array.

say [1,2,3,4,5].map_reduce {|a,b| a+b }         #=> [1, 3, 6, 10, 15]
say [1,2,3,4,5].map_reduce {|a,b| a*b }         #=> [1, 2, 6, 24, 120]

Aliases: reduce_map

match

arr.match(/regex/)

Recursively match an array against a regular expression.

say ['a', ['foo'], 'b'].match(/^foo/)

max

self.max

Returns the

max_by

self.max_by

Returns the

mdiv

m1.mdiv(m2)

Returns the

Aliases: matrix_div

min

self.min

Returns the

min_by

self.min_by

Returns the

minmax

self.minmax

Returns the

mmul

a `mmul` b

Multiply two 2D-matrices, returing a Matrix object.

Example:

say ([[1, 2],
      [3, 4]] `mmul` [[-3, -8, 3],
                      [-2,  1, 4]])

Output:

Matrix(
    [-7, -6, 11],
    [-17, -20, 25]
)

Aliases: matrix_mul

msolve

self.msolve(vector)

Returns the

Aliases: matrix_solve

msub

m1.msub(m2)

Returns the

Aliases: matrix_sub

new

self.new

Returns the

Aliases: call

next_permutation

arr.next_permutation

It modifies the self array in place to contain the next unique permutation and returns true if there are more permutations available, or false if the current permutation is the last one.

Example:

var arr = [1,1,2]
do { say arr } while arr.next_permutation

Output:

[1, 1, 2]
[1, 2, 1]
[2, 1, 1]

none

arr.none { ... }

Returns true if none of the elements satisfy the condition given in the block of code.

say [2, 4, 6].none { .is_odd }  #=> true

nth_perm

arr.nth_perm(n)

Efficiently returns the n-th permuation of the self array.

say nth_perm([0,1,2,3,4,5,6,7,8,9], 10**6)

Aliases: nth_permutation

ordered_partitions

arr.ordered_partitions
arr.ordered_partitions(k)
arr.ordered_partitions{|*a| ... }
arr.ordered_partitions(k, {|*a| ... })

Iterates over the ordered partitions P of arr, such that P.flat == arr.

[1,2,3,4,5].ordered_partitions(2, {|*a| say a })

Outputs:

[[1], [2, 3, 4, 5]]
[[1, 2], [3, 4, 5]]
[[1, 2, 3], [4, 5]]
[[1, 2, 3, 4], [5]]

When no block is given, it returns an array containing the ordered partitions (there are binomial(n-1, k-1) ordered partitions, where n is the size of the array):

say [1,2,3,4].ordered_partitions(2)

Outputs:

[[[1], [2, 3, 4]], [[1, 2], [3, 4]], [[1, 2, 3], [4]]]

Additionally, when the value for k is ommited, it generates all the ordered partitions (there are 2^(n-1) ordered partitions, where n is the size of the array):

[1,2,3,4].ordered_partitions{|*a| say a }

Outputs:

[[1], [2], [3], [4]]
[[1, 2], [3], [4]]
[[1], [2, 3], [4]]
[[1, 2, 3], [4]]
[[1], [2], [3, 4]]
[[1, 2], [3, 4]]
[[1], [2, 3, 4]]
[[1, 2, 3, 4]]

Up to the ordering, the method is equivalent with (but more efficient):

arr.partitions(k).grep { .flat == arr }

pack

self.pack(format)

Returns the

pair_map

self.pair_map(block)

Returns the

Aliases: pairmap

pam_op

arr.pam_op(operator, obj)

Reversed-mapping of the array, given an operator.

say [1,2,3].pam_operator('/', 10)   # [10/1, 10/2, 10/3]

This method is used internally by the «OP« hyper-operator:

say ([1,2,3] «/« 10)

Aliases: pam_operator

part

arr.part(n)

Partition the array into two parts, given an index:

[1,2,3,4,5].part(3)     # returns: ([1, 2, 3], [4, 5])
[1,2,3,4,5].part(2)     # returns: ([1, 2], [3, 4, 5])

Negative indices are supported as well:

[1,2,3,4,5].part(-1)    # returns: ([1, 2, 3, 4], [5])

Aliases: partition

partitions

self.partitions(k, block)

Returns the

perm2num

self.perm2num

Returns the

permutations

self.permutations

Returns the

pick

self.pick(amount)

Returns the

pop_at

self.pop_at(offset)

Returns the

Aliases: delete_at, delete_index

pop_rand

self.pop_rand

Returns the

pop_while

self.pop_while(block)

Returns the

prepend

self.prepend(*args)

Returns the

Aliases: unshift

prod

self.prod(arg)

Returns the

prod_2d

arr.prod_2d {|a,b,c,...| ... }

Product of a 2D array, by mapping each row to the given block.

say [[2,4],[3,2],[5,1],[7,1]].prod_2d {|p,k| p**k }    #=> 5040

prod_by

arr.prod_by { ... }

Product of an array, by mapping each element to the given block.

say [1,2,3,4].prod_by {|n| n**3 }    # product of each element cubed

prod_kv

self.prod_kv(block)

Returns the

prodmod

self.prodmod(mod)

Returns the

rand

self.rand(amount)

Returns the

Aliases: sample

rand_perm

arr.rand_perm

Returns a random permutation of the self array.

Example:

var arr = %w(a b c d e f g)
say arr.random_permutation

Additionally, by setting a seed value for irand with Number iseed(), the results returned by random_permutation can be reproduced.

Example with iseed():

iseed(42)
var arr = %w(a b c d e f g)
say arr.random_permutation      #=> ["d", "f", "g", "b", "c", "e", "a"]

Aliases: random_permutation

range

self.range

Returns the

recmap

arr.recmap { ... }

Recursively map the value of an array, given a block of code.

# Generate all the 5-smooth numbers <= 20
var (a, k, L) = ([1], 5, 20)
k.primes.each {|p| a.recmap! {|n| n*p <= L ? [n*p] : () } }
say a.sort    #=> [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20]

reduce_op

self.reduce_op(operator, initial)

Returns the

Aliases: reduce_operator

resize

arr.resize(index)

Efficienlty resize the array to a given index, modifying the array in-place.

var arr = %w[a b c d e]
arr.resize(2)            # removes indices > 2
say arr                  # ['a', 'b', 'c']

Use index -1 to empty the array.

Aliases: resize_to

rindex

self.rindex(obj)

Returns the

Aliases: rindex_by, last_index, last_index_by

rotate

self.rotate(num)

Returns the

rref

self.rref

Returns the

Aliases: reduced_row_echelon_form

rscalar_op

self.rscalar_op(operator, scalar)

Returns the

Aliases: rscalar_operator

run_length

arr.run_length
arr.run_length { ... }

The run-length algorithm, returning an array of pairs [a,n].

say [1,1,1,2,3,3].run_length            #=> [[1, 3], [2, 1], [3, 2]]
say %w(a a b C c c).run_length { .lc }  #=> [['a', 2], ['b', 1], ['C', 3]]

Aliases: run_length_by

sadd

self.sadd(scalar)

Returns the

Aliases: scalar_add

scalar_op

self.scalar_op(operator, scalar)

Returns the

Aliases: scalar_operator

sdiv

self.sdiv(scalar)

Returns the

Aliases: scalar_div

segment

arr.segment(indices...)

Segment an array at the given indices.

var arr = [1,2,3,4]
say arr.segment(1)         #=> [[1, 2], [3, 4]]
say arr.segment(2)         #=> [[1, 2, 3], [4]]
say arr.segment(0, 1, 2)   #=> [[1], [2], [3], [4]]
say arr.segment(0, 2)      #=> [[1], [2, 3], [4]]

Negative indices can be used for couting from the end of the array (e.g.: -1 means the end of the array).

segment_by

arr.segment_by { ... }

Segment the array into multiple sub-arrays, whenever the block returns a true value.

Example:

# Segment the array after each prime number
say @(1..prime(5)).segment_by { .is_prime }

Output:

[[1, 2], [3], [4, 5], [6, 7], [8, 9, 10, 11]]

shift

self.shift(num)

Returns the

Aliases: drop_left, drop_first

shift_while

self.shift_while(block)

Returns the

shuffle

self.shuffle

Returns the

skip

self.skip(n)

Returns the

Aliases: skip_first

skip_by

self.skip_by(block)

Returns the

skip_last

self.skip_last(n)

Returns the

slice

arr.slice(offset)
arr.slice(offset, length)

Extracts a slice out of the self-array and returns it. First entry is at offset zero.

If offset is negative, starts that far back from the end of the array.

If length is omitted, returns everything through the end of the array.

If length is negative, leaves that many entries off the end of the array.

slice_after

self.slice_after(block)

Returns the

slice_before

self.slice_before(block)

Returns the

slices

array.slices(n)

Slices the self-array into multiple sub-arrays, each sub-array having at most n elements.

say [1,2,3,4].slices(2)         #=> [[1, 2], [3, 4]]
say [1,2,3,4,5].slices(2)       #=> [[1, 2], [3, 4], [5]]

Aliases: map_slice

smul

self.smul(scalar)

Returns the

Aliases: scalar_mul

solve_rec_seq

arr.solve_rec_seq

Attempts to find a minimal linear recurrence that generates the given array of numbers:

say 30.of { .fibonacci }.solve_rec_seq      #=> [1, 1]
say 30.of { .square }.solve_rec_seq         #=> [3, -3, 1]
say 30.of { .faulhaber(2) }.solve_rec_seq   #=> [4, -6, 4, -1]

Aliases: find_linear_recurrence

solve_seq

arr.solve_seq(offset=0)

Returns a Polynomial object that generates the terms of the given sequence.

Example:

say 20.of { .square }.solve_seq         #=> x^2
say 20.of { .faulhaber(2) }.solve_seq   #=> 1/3*x^3 + 1/2*x^2 + 1/6*x

Example with offset:

say 20.of { (_+10)**3 }.solve_seq       #=> x^3 + 30*x^2 + 300*x + 1000
say 20.of { (_+10)**3 }.solve_seq(10)   #=> x^3

sort

arr.sort
arr.sort {|a,b| ... }

Returns a new sorted array:

say [3,2,1,4].sort        #=> [1,2,3,4]
say ['c','a','b'].sort    #=> ['a','b','c']

An optional comparison block can be given, which is called with two elements a and b and must return -1, 0 or 1, corresponding to how a and b must be ordered in the returned array:

say [3,2,1,4].sort {|a,b| a <=> b }     #=> [1,2,3,4]
say [3,2,1,4].sort {|a,b| b <=> a }     #=> [4,3,2,1]

sort_by

arr.sort_by { ... }

Sort an array by mapping each value to the given block.

[4,3,1,2].sort_by { _ }            # same as .sort()
[4,3,1,2].sort_by {|n| -n }        # reversed numerical sorting
%w(foo fo f).sort_by { .len }      # sort array by length

splice

self.splice(offset, length, *objects)

Returns the

split

self.split(obj)

Returns the

split_by

arr.split_by { ... }

Splits the given array by the objects at which the given block returns a true value.

say [1,2,0,3,0,4].split_by { _ == 0 }   #=> [[1, 2], [3], [4]]

ssub

self.ssub(scalar)

Returns the

Aliases: scalar_sub

stack

arr.stack
arr.stack { ... }

Groups runs of identical elements.

say <a a a b b c>.stack     #=> [["a", "a", "a"], ["b", "b"], ["c"]

When a block of code is given, the stocking is done based on the mapping of each element to the given block:

say <A B b A b B A>.stack_by { .uc }

Output:

[["A"], ["B", "b"], ["A"], ["b", "B"], ["A"]]

Aliases: stack_by

subsets

self.subsets

Returns the

sum

self.sum(arg)

Returns the

sum_2d

arr.sum_2d {|a,b,c,...| ... }

Sum of a 2D array, by mapping each row to the given block.

say [[2,4],[3,2],[5,1],[7,1]].sum_2d {|p,k| p**k }     #=> 37

sum_by

arr.sum_by { ... }

Sum of an array, by mapping each element to the given block.

say [1,2,3,4].sum_by {|n| n**2 }    # sum of each element squared

sum_kv

self.sum_kv(block)

Returns the

summod

self.summod(mod)

Returns the

swap

self.swap(i, j)

Returns the

take_left

self.take_left(amount)

Returns the

take_right

self.take_right(amount)

Returns the

to_a

self.to_a

Returns the

Aliases: to_array

to_bag

self.to_bag

Returns the

to_h

self.to_h

Returns the

Aliases: to_hash

to_m

self.to_m

Returns the

Aliases: to_matrix

to_s

self.to_s

Returns the

Aliases: dump, to_str

to_set

self.to_set

Returns the

to_v

self.to_v

Returns the

Aliases: to_vector

tuples

self.tuples

Returns the

Aliases: variations

tuples_with_repetition

self.tuples_with_repetition

Returns the

Aliases: variations_with_repetition

uniq

self.uniq

Returns the

Aliases: unique, distinct

uniq_by

self.uniq_by(block)

Returns the

Aliases: unique_by

uniq_permutations

arr.uniq_permutations
arr.uniq_permutations { ... }

It uses the next_permutation method to create all the unique permutations of the self-array.

say [1,1,2].unique_permutations         #=> [[1, 1, 2], [1, 2, 1], [2, 1, 1]

Equivalent with arr.permutations.uniq, but more efficient, as it creates the permutations without duplicates.

The method also accepts a callback block as an optional argument:

[1,1,2].unique_permutations {|*perm|
    say perm
}

Output:

[1, 1, 2]
[1, 2, 1]
[2, 1, 1]

Aliases: unique_permutations

uniq_prefs

self.uniq_prefs(block)

Returns the

Aliases: unique_prefixes

unroll_op

self.unroll_op(operator, arg)

Returns the

Aliases: unroll_operator

unzip_by

self.unzip_by(block)

Returns the

weighted_shuffle_by

self.weighted_shuffle_by(block)

Returns the

wise_op

m1.wise_op(operator, m2)

Returns the

Aliases: wise_operator

zip

self.zip(block)

Returns the

Aliases: transpose

zip_by

self.zip_by(block)

Returns the

zip_op

self.zip_op(operator, arg)

Returns the

Aliases: zip_operator