Ik heb een array, de array zullen we voor het gemak even vergeleiken met een boom.
Het idee is dat ik de takken van de boom wil zagen op het punt waar ze anders zijn dan hun siblings.
Stel een tak heeft ronde (vorm) rode (kleur) blaadjes, en de tak er naast heeft ronde blouwe blaadjes dan wil ik ze van de parent tak zagen op het punt dat ze verschillende worden.
Een extra regeltje is dat ik zo hoog mogelijk richting de parent wil zagen.
Als laatste regeltje moeten alle blaadjes die op een tak boven een "botsing" zitten eraf gegooid worden.
Als een grote tak dus 2 child takken heeft welke andere kleuren of vormen hebben dan hijzelf moeten alle blaadjes er af gehaald worden.
Onderstaande input gaat in mijn functie:
children bevat de subtakken,
vorm is de vorm van de blaadjes,
kleur is de kleur van de blaadjes.
De output is;
Dat ziet er redelijk uit, behalve dat vorm6 niet hoog genoeg omhoog klimt, Daarnaast gaat het ook nog mis met parent takken welke niet de zelfde vorm of kleur hebben als de child takken.
Een niveau dieper gaat nog prima, die worden netjes gecleared, maar als de parent 2 of meer hoger zit als de botsing tussen 2 children gaat het mis.
Is er een naam voor dit algoritme? ik neem aan dat anno 2007 iemand al eens ieder hiermee gespeeld heeft?
Mijn code is als volgt, maar ondanks mijn 2 dagen klooien en debuggen kom ik niet op een stabielere oplossing:
Het idee is dat ik de takken van de boom wil zagen op het punt waar ze anders zijn dan hun siblings.
Stel een tak heeft ronde (vorm) rode (kleur) blaadjes, en de tak er naast heeft ronde blouwe blaadjes dan wil ik ze van de parent tak zagen op het punt dat ze verschillende worden.
Een extra regeltje is dat ik zo hoog mogelijk richting de parent wil zagen.
Als laatste regeltje moeten alle blaadjes die op een tak boven een "botsing" zitten eraf gegooid worden.
Als een grote tak dus 2 child takken heeft welke andere kleuren of vormen hebben dan hijzelf moeten alle blaadjes er af gehaald worden.
Onderstaande input gaat in mijn functie:
children bevat de subtakken,
vorm is de vorm van de blaadjes,
kleur is de kleur van de blaadjes.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <?php $input[0]['children'][1]['children'][0]['children'][0]['children'][0]['vorm']='rond'; $input[0]['children'][0]['children'][0]['children'][1]['children'][0]['children'][0]['kleur']='rood'; $input[0]['children'][0]['children'][0]['children'][1]['children'][0]['children'][0]['vorm']='vierkant'; $input[1]['children'][0]['children'][0]['vorm']='driehoek'; $input[1]['children'][0]['children'][0]['kleur']='rood'; $input[1]['children'][1]['children'][0]['vorm']='5kant'; $input[1]['children'][1]['children'][0]['kleur']='blauw'; $input[2]['children'][0]['children'][0]['vorm']='6kant'; $input[2]['children'][1]['children'][0]['vorm']='7kant'; $input[3]['children'][0]['children'][0]['vorm']='8kant'; $input[3]['children'][0]['children'][0]['kleur']='groen'; ?> |
De output is;
code:
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
| Parsing:
Array
(
[0] => Array
(
[children] => Array
(
[0] => Array
(
[children] => Array
(
[0] => Array
(
[children] => Array
(
[0] => Array
(
[children] => Array
(
[0] => Array
(
[children] => Array
(
[0] => Array
(
[vorm] => rond6
)
[1] => Array
(
[kleur] => geel
)
)
[vorm] => rond6
[kleur] => geel
)
)
[kleur] => geel
)
[1] => Array
(
[children] => Array
(
[0] => Array
(
[children] => Array
(
[0] => Array
(
[kleur] => rood
[vorm] => vierkant
)
)
[vorm] => vierkant
[kleur] => rood
)
)
[vorm] => vierkant
[kleur] => rood
)
)
)
)
)
[1] => Array
(
[children] => Array
(
[0] => Array
(
[children] => Array
(
[0] => Array
(
[children] => Array
(
[0] => Array
(
[vorm] => rond
)
)
[vorm] => rond
)
)
[vorm] => rond
)
)
[vorm] => rond
)
)
)
[1] => Array
(
[children] => Array
(
[0] => Array
(
[children] => Array
(
[0] => Array
(
[vorm] => driehoek
[kleur] => rood
)
)
[vorm] => driehoek
[kleur] => rood
)
[1] => Array
(
[children] => Array
(
[0] => Array
(
[vorm] => 5kant
[kleur] => blauw
)
)
[vorm] => 5kant
[kleur] => blauw
)
)
)
[2] => Array
(
[children] => Array
(
[0] => Array
(
[children] => Array
(
[0] => Array
(
[vorm] => 6kant
)
)
[vorm] => 6kant
)
[1] => Array
(
[children] => Array
(
[0] => Array
(
[vorm] => 7kant
)
)
[vorm] => 7kant
)
)
)
[3] => Array
(
[children] => Array
(
[0] => Array
(
[children] => Array
(
[0] => Array
(
[vorm] => 8kant
[kleur] => groen
)
)
[vorm] => 8kant
[kleur] => groen
)
)
[vorm] => 8kant
[kleur] => groen
)
) |
Dat ziet er redelijk uit, behalve dat vorm6 niet hoog genoeg omhoog klimt, Daarnaast gaat het ook nog mis met parent takken welke niet de zelfde vorm of kleur hebben als de child takken.
Een niveau dieper gaat nog prima, die worden netjes gecleared, maar als de parent 2 of meer hoger zit als de botsing tussen 2 children gaat het mis.
Is er een naam voor dit algoritme? ik neem aan dat anno 2007 iemand al eens ieder hiermee gespeeld heeft?
Mijn code is als volgt, maar ondanks mijn 2 dagen klooien en debuggen kom ik niet op een stabielere oplossing:
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
| function walkup(&$DOM,$fields){ $domcount=count($DOM); $i=0; $walkup=true; $objects=array(); $fieldcount=count($fields); for($j=0;$j<$fieldcount;$j++){ $subcount[$j]=0; $objects[$j]=array(); } while($i<$domcount){ if(is_array($DOM[$i])){ for($j=0;$j<$fieldcount;$j++){ if(trim($DOM[$i][$fields[$j]])!=''){ $subcount[$j]=$subcount[$j]+1; $objects[$j][]=$DOM[$i][$fields[$j]]; } } if(isset($DOM[$i]['children'])){ list($subsubcount,$subobjects)=walkup(&$DOM[$i]['children'],$fields); for($j=0;$j<$fieldcount;$j++){ if($subsubcount[$j]==1){ if(isset($subobjects[$j][0])){ $DOM[$i][$fields[$j]]=$subobjects[$j][0]; } } elseif($subsubcount!=0 or $walkup==false){ if(isset($subobjects[$j])){ if(count(array_unique($subobjects[$j]))==1 or $walkup==false){ $store=true; for($k=0;$k<$fieldcount;$k++){ if( isset($subobjects[$k][0]) && ( $subobjects[$k][0]==$subobjects[$k][1] or !isset($subobjects[$k][1]) ) ){ } else { $store=false; break; } } if($store==true){ $DOM[$i][$fields[$j]]=$subobjects[$j][0]; } $subsubcount[$j]=1; unset($subobjects[$j]); $subobjects[$j][]=$DOM[$i][$fields[$j]]; $walkup=false; } else { // just let this slide up the ladder } } } if(isset($subobjects[$j]) && $subsubcount[$j]>0){ $subcount[$j]=$subcount[$j]+$subsubcount[$j]; $objects[$j]=array_merge($subobjects[$j],$objects[$j]); } } } } $i++; } return array($subcount,$objects); } |
openkat.nl al gezien?