-
-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathCombinatorics.php
134 lines (118 loc) · 2.55 KB
/
Combinatorics.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
declare(strict_types=1);
namespace drupol\phpermutations;
use function count;
abstract class Combinatorics
{
/**
* The dataset.
*
* @var array<int, mixed>
*/
protected $dataset;
/**
* The number of values in the dataset.
*
* @var int
*/
protected $datasetCount;
/**
* The length.
*
* @var int
*/
protected $length;
/**
* Combinatorics constructor.
*
* @param array<int, mixed> $dataset
* The dataset
* @param int|null $length
* The length
*/
public function __construct(array $dataset = [], $length = null)
{
$this->setDataset($dataset);
$this->datasetCount = count($this->dataset);
$this->setLength($length);
}
/**
* Count elements of an object.
*
* @return int
* The number of element
*/
public function count(): int
{
return count($this->toArray());
}
/**
* Get the dataset.
*
* @return mixed[]
* The dataset
*/
public function getDataset(): array
{
return $this->dataset;
}
/**
* Get the length.
*
* @return int
* The length
*/
public function getLength(): int
{
return (int) $this->length;
}
/**
* Set the dataset.
*
* @param array<int, mixed> $dataset
* The dataset
*
* @return $this
*/
public function setDataset(array $dataset = []): Combinatorics
{
$this->dataset = $dataset;
return $this;
}
/**
* Set the length.
*
* @param int|null $length
* The length
*
* @return $this
*/
public function setLength($length = null): Combinatorics
{
$length = $length ?? $this->datasetCount;
$this->length = (abs($length) > $this->datasetCount) ? $this->datasetCount : $length;
return $this;
}
/**
* @return array<int, mixed>
*/
public function toArray(): array
{
return [];
}
/**
* Compute the factorial of an integer.
*
* @param int $n
* The number to get its factorial
* @param int $total
* The total
*
* @return int
* The factorial of $n
*/
protected function fact($n, $total = 1): int
{
return (2 > $n) ? $total : $this->fact($n - 1, $total * $n);
}
}