Passed
Push — main ( 7b37bf...2735bf )
by N.
03:10
created

TTReduceradKod   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Test Coverage

Coverage 94.12%

Importance

Changes 0
Metric Value
eloc 32
dl 0
loc 86
ccs 32
cts 34
cp 0.9412
rs 10
c 0
b 0
f 0
wmc 14

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 2 1
A halvgarderingar() 0 20 6
B beräkna_reducerad_kod() 0 47 7
1
<?php
2
3
/**
4
 * Klass TTReduceradKod.
5
 * @author Niklas Dougherty
6
 */
7
8
declare(strict_types=1);
9
10
namespace Tips\Moduler\TT;
11
12
use Tips\Moduler\TT;
13
14
/**
15
 * Klass TTReduceradKod.
16
 * Reducera kod enligt reduktionskod.
17
 * R-system definieras i Koder.
18
 * Nyttjas av klasser Prova och Tackning.
19
 */
20
final class TTReduceradKod extends Reduktion {
21
	/**
22
	 * Initiera.
23
	 */
24 1
	public function __construct(protected TT $tt) {
25 1
		$this->beräkna_reducerad_kod();
26
	}
27
28
	/**
29
	 * Beräkna reducerad kod.
30
	 */
31 1
	private function beräkna_reducerad_kod(): void {
32 1
		$this->beräkna_garderingar();
33 1
		$antal_hg = count($this->halvgarderingar);
34
35
		/**
36
		 * Kräv överensstämmelse i garderingar med system.
37
		 */
38
		if (
39 1
			count($this->helgarderingar) !== $this->tt->rkod->helgarderingar() ||
40 1
			$antal_hg != $this->tt->rkod->halvgarderingar()
41
		) {
42
			return;
43
		}
44
45
		/**
46
		 * Nollställ.
47
		 */
48 1
		$kod_halvgarderingar = [];
49 1
		$kod_helgarderingar = [];
50 1
		$nollrad = array_fill(0, $this->tt::TT_MATCHANTAL, 0);
0 ignored issues
show
Bug introduced by
The constant Tips\Moduler\TT::TT_MATCHANTAL was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
51
52
		/**
53
		 * Reducera.
54
		 */
55 1
		foreach ($this->beräkna_reduktion() as $projektion) {
56 1
			foreach ($projektion as $index => $kodord) {
57 1
				$kod = array_map('intval', str_split($kodord));
0 ignored issues
show
Bug introduced by
It seems like str_split($kodord) can also be of type true; however, parameter $array of array_map() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

57
				$kod = array_map('intval', /** @scrutinizer ignore-type */ str_split($kodord));
Loading history...
58 1
				$temp = $nollrad;
59
60
				/**
61
				 * Helgardering.
62
				 * $projektion håller helgarderingar i [0], halvgarderingar i [1]
63
				 */
64 1
				if ($index === 0) {
65 1
					foreach ($kod as $nyckel => $tecken) {
66 1
						$temp[$this->helgarderingar[$nyckel]] = $tecken;
67
					}
68
69 1
					$kod_helgarderingar[] = $temp;
70 1
					continue;
71
				}
72
73 1
				$this->halvgarderingar($antal_hg, $kod, $temp, $kod_halvgarderingar);
74
			}
75
		}
76
77 1
		$this->addera_kodord($antal_hg, $kod_helgarderingar, $kod_halvgarderingar);
78
	}
79
80
	/**
81
	 * Halvgarderingar.
82
	 * @param int[] $kod
83
	 * @param int[] $temp
84
	 * @param array<int, int[]> $kod_halvgarderingar
85
	 */
86 1
	private function halvgarderingar(int $antal_hg, array $kod, array &$temp, array &$kod_halvgarderingar): void {
87
		/**
88
		 * Halvgardering.
89
		 */
90 1
		if ($antal_hg) {
91 1
			foreach ($kod as $nyckel => $tecken) {
92
				/**
93
				 * Skifta tecken efter odds.
94
				 * Mallar förutsätter 1X för halvgarderingar.
95
				 */
96 1
				match (true) {
97 1
					$this->tt->reduktion[$this->halvgarderingar[$nyckel]][0] === '' =>
98 1
						$temp[$this->halvgarderingar[$nyckel]] = $tecken === 0 ? 1 : 2, // skifta 1X -> X2
99 1
					$this->tt->reduktion[$this->halvgarderingar[$nyckel]][1] === '' =>
100
						$temp[$this->halvgarderingar[$nyckel]] = $tecken === 0 ? 0 : 2, // skifta 1X -> 12
101 1
					default =>
102 1
						$temp[$this->halvgarderingar[$nyckel]] = $tecken === 0 ? 0 : 1 // behåll 1X
103 1
				};
104
			}
105 1
			$kod_halvgarderingar[] = $temp;
106
		}
107
	}
108
}
109