Herhaling zoeken
Ik ben bezig met een programmatje die een herhaling kan zoeken. Dus zoiets als dit
0.237237237237237237237237
herhaling: 237
0.111111111111111111111111
herhaling: 1
enz.
Heeft iemand een idee hoe ik dit kan doen?
0.237237237237237237237237
herhaling: 237
0.111111111111111111111111
herhaling: 1
enz.
Heeft iemand een idee hoe ik dit kan doen?
Heeft er iemand een idee?
Het lukt me nog steeds niet! :(
Het lukt me nog steeds niet! :(
Gewijzigd op 24/11/2005 16:36:00 door Sander
Er zitten veel meer herhalingen in. Wil je die allemaal hebben? Dus b.v zo?
0.237237237237237237237237
Herhaling: 2, 3, 7, 23, 37, 237, 372, 723 en nog veel meer.
0.237237237237237237237237
Herhaling: 2, 3, 7, 23, 37, 237, 372, 723 en nog veel meer.
De herhaling die uit het grootste aantal tekens bestaat. Dus één van deze 237, 372, 723 (maakt niet uit welke)
Dan zou je een algoritme moeten maken dat iedere mogelijkheid geeft van letters die meerdere malen zouden kunnen voorkomen, en dezen tellen met substr_count().
Ik denk dat ik daar eens over na ga denken :)
Ik denk dat ik daar eens over na ga denken :)
Mijn eerste idee dat in mij op kwam:
Uitkomst was 'Array ( [substring] => cgf [hits] => 8 )'
Code (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
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
<?php
$string = 'cgfcgfcgfcgfcgfcgfcgfcgf';
function match_searchSubstring($string)
{
$string_length = strlen($string);
$results = array();
$k = 0;
for($i = 0; $i < $string_length; $i++)//voor ieder mogelijk begin
{
for($j = 2; $j < ($string_length-$j); $j++)
{
$results[$k]['substring'] = substr($string, $i, $j);
$results[$k]['hits'] = substr_count($string, $results[$k]['substring']);
$k++;
}
}
return $results;
}
function match_getResults($tests)
{
$tests_length = count($tests);
$best_test['hits'] = 0;
$best_test['substring'] = '';
for($i = 0; $i < $tests_length; $i++)
{
if($tests[$i]['hits'] > $best_test['hits'])
{
$best_test = $tests[$i];
}
elseif($tests[$i]['hits'] == $best_test['hits'] && strlen($tests[$i]['substring']) > strlen($best_test['substring']))
{
$best_test = $tests[$i];
}
}
return $best_test;
}
$results = match_searchSubstring($string);
print_r(match_getResults($results));
?>
$string = 'cgfcgfcgfcgfcgfcgfcgfcgf';
function match_searchSubstring($string)
{
$string_length = strlen($string);
$results = array();
$k = 0;
for($i = 0; $i < $string_length; $i++)//voor ieder mogelijk begin
{
for($j = 2; $j < ($string_length-$j); $j++)
{
$results[$k]['substring'] = substr($string, $i, $j);
$results[$k]['hits'] = substr_count($string, $results[$k]['substring']);
$k++;
}
}
return $results;
}
function match_getResults($tests)
{
$tests_length = count($tests);
$best_test['hits'] = 0;
$best_test['substring'] = '';
for($i = 0; $i < $tests_length; $i++)
{
if($tests[$i]['hits'] > $best_test['hits'])
{
$best_test = $tests[$i];
}
elseif($tests[$i]['hits'] == $best_test['hits'] && strlen($tests[$i]['substring']) > strlen($best_test['substring']))
{
$best_test = $tests[$i];
}
}
return $best_test;
}
$results = match_searchSubstring($string);
print_r(match_getResults($results));
?>
Uitkomst was 'Array ( [substring] => cgf [hits] => 8 )'
ik ga hem testen maar als die werk ben je GEWELDIG!!!!!
Mooi script zo jelmer, nu nog zorgen dat die ook van die logische wiskundige reeksen gaat herkennen en zegt wat het volgende getal is :P (zoals dat wel eens gaat bij IQ testen en dergelijke)
Hij werkt bijna foutloos, maar als ik bijvoorbeeld
905123451234512345123451234512345123451234512345
invoer, dan zegt hij dat de herhaling '5' is maar dat moet '12345'. Hij moet dus zoeken naar de langste herhaling. Ik ben zelf ook even aan het proberen, maar zou je ook nog even willen kijken?
Alvast bedankt.
905123451234512345123451234512345123451234512345
invoer, dan zegt hij dat de herhaling '5' is maar dat moet '12345'. Hij moet dus zoeken naar de langste herhaling. Ik ben zelf ook even aan het proberen, maar zou je ook nog even willen kijken?
Alvast bedankt.
Inderdaad een zeer mooi script, Jelmer!
Eén opmerking. Als je dit hebt:
$string = 'cgfcgfcgfcgfcgfcgfcgfcgf';
Dan is de langst voorkomende herhaling niet 'cgf'
De string 'cgfcgfcgfcgf' komt twee maal voor en is dus de langste herhaling.
Eén opmerking. Als je dit hebt:
$string = 'cgfcgfcgfcgfcgfcgfcgfcgf';
Dan is de langst voorkomende herhaling niet 'cgf'
De string 'cgfcgfcgfcgf' komt twee maal voor en is dus de langste herhaling.
Het kan ook nog de langste herhaling zijn waarbinnen géén herhalingen voorkomen. Dan moet ccgfccgf als uitkomst cgf geven. Pfff, dat is nog niet zo gemakkelijk, maar misschien wel een leuke uitdagin voor het weekend.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Edit: Testspul verwijderd
Gewijzigd op 24/11/2005 19:42:00 door - SanThe -
@Jan: Mijn idee was de langst mogelijke string die het vaakstg voorkomt, waar hoe vaker hij voorkomt belangrijker is dan de lengte.
Bij die van SanThe is dat zo te zien net andersom :)
Bij die van SanThe is dat zo te zien net andersom :)
Jelmer:
@Jan: Mijn idee was de langst mogelijke string die het vaakstg voorkomt, waar hoe vaker hij voorkomt belangrijker is dan de lengte.
Bij die van SanThe is dat zo te zien net andersom :)
Bij die van SanThe is dat zo te zien net andersom :)
Dat klopt ja.. je moet dit script niet gebruiken met een zin. Dan telt die de letter die het vaakst voorkomt!!!
Robert:
Dat klopt ja.. je moet dit script niet gebruiken met een zin. Dan telt die de letter die het vaakst voorkomt!!!
Jelmer:
(hier mijn lap tekst)
Dat klopt ja.. je moet dit script niet gebruiken met een zin. Dan telt die de letter die het vaakst voorkomt!!!
Daar had ik dat minimum van 2 voor bedacht. maar ik denk dat je dat wat moet opvoeren naar minimaal 3 in dat geval.
SanThe:
Edit: Testspul verwijderd
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Edit: Testspul verwijderd
Ook een mooi script SanThe! Ik snap de benadering ook, maar ik heb net even zitten testen ...
Stel ik vul als teststring in:
$test="abcabcdefgdefg";
dan lijkt mij dat er uit moet rollen 'defg', maar het script levert bij mij als resultaat 'abc'.
Jelmer:
Bij die van SanThe is dat zo te zien net andersom :)
Klopt, ben bezig het foutje er uit te halen.
Okee, wat minder mooi...
Code (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
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
<?php
$test="abcabcdefgdefg";
$hlen=strlen($test);
$len=$hlen-1;
$mx=1;
$ln=0;
$lnh=0;
$tel=0;
$res="";
$gn=0;
for($i=1;$i<=$hlen;$i++)
{
$gn=$gn+$i;
}
function x($x)
{
global $test,$hlen,$len,$mx,$ln,$lnh,$res,$tel,$gn;
for($i=$x; $i<$hlen; $i++)
{
for($j=$i+1; $j<=$hlen; $j++)
{
$tel++;
if($tel>$gn)
{
return;
}
$cnt=substr_count($test, substr($test, $i, $hlen-$j+1));
$lnh=strlen(substr($test, $i, $hlen-$j+1));
if((($cnt>$mx) and ($lnh==$ln)) or (($lnh>$ln) and ($cnt>1)))
{
$res=substr($test, $i, $hlen-$j+1);
$mx=$cnt;
$ln=$lnh;
}
}
if($tel<=$gn)
{
$k=$i+1;
x($k);
}
}
}
x(0);
echo "De grootste substring komt " . $mx . " keer voor: " . $res . "<br />";
?>
$test="abcabcdefgdefg";
$hlen=strlen($test);
$len=$hlen-1;
$mx=1;
$ln=0;
$lnh=0;
$tel=0;
$res="";
$gn=0;
for($i=1;$i<=$hlen;$i++)
{
$gn=$gn+$i;
}
function x($x)
{
global $test,$hlen,$len,$mx,$ln,$lnh,$res,$tel,$gn;
for($i=$x; $i<$hlen; $i++)
{
for($j=$i+1; $j<=$hlen; $j++)
{
$tel++;
if($tel>$gn)
{
return;
}
$cnt=substr_count($test, substr($test, $i, $hlen-$j+1));
$lnh=strlen(substr($test, $i, $hlen-$j+1));
if((($cnt>$mx) and ($lnh==$ln)) or (($lnh>$ln) and ($cnt>1)))
{
$res=substr($test, $i, $hlen-$j+1);
$mx=$cnt;
$ln=$lnh;
}
}
if($tel<=$gn)
{
$k=$i+1;
x($k);
}
}
}
x(0);
echo "De grootste substring komt " . $mx . " keer voor: " . $res . "<br />";
?>
@ SanThe: die levert inderdaad de goede uitkomst. Knap gedaan!
Ik heb hem net even getest met 'abcabcdefgdefgcdefgdefg' en dan geeft hij ook de goede uitkomst (cdefgdefg).
Wat ook goed is: als ik hem test met
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
geeft hij twee keer de helft van die string. En dat klopt, want als hij de hele string terug zou geven, was er geen sprake van een patroon. Petje af, SanThe :-)
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
geeft hij twee keer de helft van die string. En dat klopt, want als hij de hele string terug zou geven, was er geen sprake van een patroon. Petje af, SanThe :-)




