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

ReduceradKod   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
eloc 30
dl 0
loc 75
ccs 0
cts 31
cp 0
rs 10
c 0
b 0
f 0
wmc 13

2 Methods

Rating   Name   Duplication   Size   Complexity  
A halvgarderingar() 0 20 6
B beräkna_reducerad_kod() 0 43 7
1
<?php
2
3
/**
4
 * Klass ReduceradKod.
5
 * @author Niklas Dougherty
6
 */
7
8
declare(strict_types=1);
9
10
namespace Tips\Moduler\System;
11
12
/**
13
 * Klass ReduceradKod.
14
 * Reducera kod enligt reduktionskod.
15
 * R-system definieras i Koder.
16
 */
17
class ReduceradKod extends Reduktion {
18
	/**
19
	 * Beräkna reducerad kod.
20
	 */
21
	protected function beräkna_reducerad_kod(): void {
22
		$this->beräkna_garderingar();
23
		$antal_hg = count($this->halvgarderingar);
24
25
		/**
26
		 * Kräv överensstämmelse i garderingar med system.
27
		 */
28
		if (
29
			count($this->helgarderingar) != $this->kod->helgarderingar() ||
30
			$antal_hg != $this->kod->halvgarderingar()
31
		) {
32
			return;
33
		}
34
35
		$kod_halvgarderingar = [];
36
		$kod_helgarderingar = [];
37
38
		/**
39
		 * Reducera.
40
		 */
41
		foreach ($this->beräkna_reduktion() as $projektion) {
42
			foreach ($projektion as $index => $kodord) {
43
				$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

43
				$kod = array_map('intval', /** @scrutinizer ignore-type */ str_split($kodord));
Loading history...
44
				$temp = NOLLRAD;
45
46
				/**
47
				 * Helgardering.
48
				 * $projektion håller helgarderingar i [0], halvgarderingar i [1]
49
				 */
50
				if ($index === 0) {
51
					foreach ($kod as $nyckel => $tecken) {
52
						$temp[$this->helgarderingar[$nyckel]] = $tecken;
53
					}
54
55
					$kod_helgarderingar[] = $temp;
56
					continue;
57
				}
58
59
				$this->halvgarderingar($antal_hg, $kod, $temp, $kod_halvgarderingar);
60
			}
61
		}
62
63
		$this->addera_kodord($antal_hg, $kod_helgarderingar, $kod_halvgarderingar);
64
	}
65
66
	/**
67
	 * Halvgarderingar.
68
	 * @param int[] $kod
69
	 * @param int[] $temp
70
	 * @param array<int, int[]> $kod_halvgarderingar
71
	 */
72
	private function halvgarderingar(int $antal_hg, array $kod, array &$temp, array &$kod_halvgarderingar): void {
73
		/**
74
		 * Halvgardering.
75
		 */
76
		if ($antal_hg) {
77
			foreach ($kod as $nyckel => $tecken) {
78
				/**
79
				 * Skifta tecken efter odds.
80
				 * Mallar förutsätter 1X för halvgarderingar.
81
				 */
82
				match (true) {
83
					$this->reduktion[$this->halvgarderingar[$nyckel]][0] === '' =>
84
						$temp[$this->halvgarderingar[$nyckel]] = ($tecken === 0) ? 1 : 2, // skifta 1X -> X2
85
					$this->reduktion[$this->halvgarderingar[$nyckel]][1] === '' =>
86
						$temp[$this->halvgarderingar[$nyckel]] = ($tecken === 0) ? 0 : 2, // skifta 1X -> 12
87
					default =>
88
						$temp[$this->halvgarderingar[$nyckel]] = ($tecken === 0) ? 0 : 1 // behåll 1X
89
				};
90
			}
91
			$kod_halvgarderingar[] = $temp;
92
		}
93
	}
94
}
95