[php] Array oplopend cumultatief

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Wat is de bedoeling?
Er is een array met letters/symbolen/cijfers/whatever. Via een functie moet er op de een of andere manier gezorgd worden dat je dit resultaat krijgt:
- Array bevat a, b, c, d ... w, x, y, z.
- uitkomst:
a
b
c
d
.
.
.
w
x
y
z
aa
ab
ac
ad
a.
a.
a.
aw
ax
ay
az
ba
bb
bc
.
.
.
ccaab
ccaac
ccaad
etc

Wat heb ik zelf al geprobeerd
- 'k Heb een array aangemaakt met alle 'kleine' letters van a-z.
- Een functie geschreven die een voor een de volgende letter pakt. Letter 30 geeft letter 4, dus "e" (aangezien de array bij 0 begint).
- Gezocht naar een standaardfunctie maar deze niet kunnen vinden.

Wat lukt er wel/niet?
Het wil maar niet lukken om het vervolg te krijgen van zz. De lijst a t/m z en aa t/m zz krijg ik wel, maar daarna begint het weer vanaf aa.

Foute oplossing
'k Heb er wel een oplossing voor gevonden, maar die houdt in dat ik voor elke stap een nieuwe functie/oplossing schrijf. Dat is natuurlijk niet de bedoeling aangezien de aantal stappen onbekend zijn. Er kunnen 4 stappen zijn (aaaa) maar ook 12 (aaaaaaaaaaaa).

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

Verwijderd

Check de usort functie even.. daarmee kun je sorteren volgens een eigen opgegeven vergelijkingsmechanisme. In dit geval wil je vergelijken op lengte en op teken.

http://aspn.activestate.c...s/PHP/function.usort.html

deze delphi programmeur slaat er een slag naar:

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
<?php

function complength ($a, $b) 
  { 
     if (strLen($a) > strLen($b)) return -1;
     if (strLen($a) < strLen($b)) return 1;
     if (strLen($a) == strLen($b)) return 0;
  }


sort ($MyArray, SORT_STRING);

reset ($MyArray);

usort ($MyArray,"complength");

reset ($MyArray);

while (list ($key, $val) = each ($MyArray)) 
  {
    echo "MyArray[".$key."] = ".$val."\n";
  }

?>

[ Voor 64% gewijzigd door Verwijderd op 05-07-2004 15:55 ]


Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

  • Twilight Burn
  • Registratie: Juni 2000
  • Laatst online: 20-04 22:01
Volgens mij wil hij niet een bestaande array met die data sorteren, maar een bestaande array volgens dat schema vullen.
Je zou kunnen beginnen door het te zien als een getal in een 26-tallig stelsel, maar het lijstje voldoet daar niet helemaal aan.

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
post eens wat code zou ik zeggen, dan kunnen we je misschien wel vertellen waarom ie weer bij aa begint

Acties:
  • 0 Henk 'm!

Verwijderd

Twilight Burn schreef op 05 juli 2004 @ 16:13:
Volgens mij wil hij niet een bestaande array met die data sorteren, maar een bestaande array volgens dat schema vullen.
Je zou kunnen beginnen door het te zien als een getal in een 26-tallig stelsel, maar het lijstje voldoet daar niet helemaal aan.
Volgens mij niet hoor:
Wat is de bedoeling?
Er is een array met letters/symbolen/cijfers/whatever. Via een functie moet er op de een of andere manier gezorgd worden dat je dit resultaat krijgt:
Hij heeft dus al een array.. die wil hij sorteren..

Acties:
  • 0 Henk 'm!

  • Twilight Burn
  • Registratie: Juni 2000
  • Laatst online: 20-04 22:01
Als ik het nog eens lees, bedoeld hij het volgens mij nog eens anders. Hij heeft een array met "n" symbolen (in dit geval n=26, en de array bevat a t/m z) en wil die op de daaronderstaande manier uitvoeren.

Acties:
  • 0 Henk 'm!

Verwijderd

Twilight Burn schreef op 05 juli 2004 @ 16:46:
Als ik het nog eens lees, bedoeld hij het volgens mij nog eens anders. Hij heeft een array met "n" symbolen (in dit geval n=26, en de array bevat a t/m z) en wil die op de daaronderstaande manier uitvoeren.
Nofi, maar ik denk dat je nog maar eens contact op moet nemen met de docent die jou op de lagere school heeft leren lezen.

Hij heeft al een array, volgens eigen omschrijving met 'letters/symbolen/cijfers/whatever'. Die wil hij sorteren

In een poging dat te doen, heeft hij zelf een extra array gedef. met daarin 'a' .. 'z'.

Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Nogmaals :)

Ik heb een array van a-z. Die dient uiteindelijk dmv een functie steeds een opvolgende output te geven:
a, b, c ... x, y, z, aa, ab, ac ... ax, ay, az, ba, bb, bc ... bx, by, bz, ca, cb, cc... etc, etc, etc.

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • Twilight Burn
  • Registratie: Juni 2000
  • Laatst online: 20-04 22:01
Verwijderd schreef op 05 juli 2004 @ 16:48:
[...]


Nofi, maar ik denk dat je nog maar eens contact op moet nemen met de docent die jou op de lagere school heeft leren lezen.

Hij heeft al een array, volgens eigen omschrijving met 'letters/symbolen/cijfers/whatever'. Die wil hij sorteren

In een poging dat te doen, heeft hij zelf een extra array gedef. met daarin 'a' .. 'z'.
NOFI hier ook, maar de TS(^^) bedoeld wat ik de 2e keer zei, in de topicstart schrijft hij het misschien ietwat vreemd op, daarom dacht ik in de eerste instantie dat ie wat anders bedoelde.

Iig, ik heb in VB.Net een functie gemaakt (ik ben niet zo goed in PHP) die het gewenste lijstje kan produceren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    Function StrangeBase(ByVal getal As Integer, ByVal alfabet As Char()) As String
        StrangeBase = ""

        Dim num As Integer = alfabet.Length

        Dim d As Integer = 0 'INV: d = # verschillende strings dat je kunt maken met een max. lengte van (i-1)
        Dim i As Integer = 1

        While d + num ^ i <= getal
            d = d + num ^ i
            i += 1
        End While
        'POST: i is het aantal symbolen van getal

        getal = getal - d 'Corrigeer voor voorgaande lengtes, zodat getal "de index" van het gewenste symbool ter lengte i is

        For n As Integer = 1 To i
            StrangeBase = alfabet(getal Mod num) & StrangeBase
            getal = getal \ num
        Next
    End Function


Invoer: getal is "de index" van het gewenste symbool is, en alfabet is een array van het alfabet. Als je als alfabet "ons" alfabet in voert krijg je met invoer getal:

0 -> a
1 -> b

25 -> z
26 -> aa

1377 -> azz
1378 -> baa

18277 -> zzz
18278 -> aaaa

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Zoeken naar recursie in combinatie met teksten samenvoegen.

Gewoon beginnen met een lege string. Dan een loopje maken van 26 tekens. Alle tekens een voor een aan de lege string vastplakken, dan ipv lege string string met de eerste letter etc.etc.etc.

Acties:
  • 0 Henk 'm!

Verwijderd

whaah.. dan moet ik leren lezen :P

Maar goed, dan snap ik je probleem niet helemaal, dit is toch rete simpel?!

In een soort pseudo code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
DoelArray := StamArray;

nStappen := getal hoever je wilt gaan

for nStapLus:=0 to nStappen do
  begin
     DoelArray.Add(StamArray);
     For nLus:=0 to StamArray.Count-1 do
       begin
         nPos:=[nLus+(DoelArray.Count+1 mod StamArray.Count)-1]
         Doelarray[nPos]:=DoelArray[nPos]+StamArray[nLus];
       end;
  end;


zoiets.. bovenstaande code werkt uiteraard in geen enkele taal, maar het ging me om het idee..

[ Voor 17% gewijzigd door Verwijderd op 05-07-2004 17:05 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Bij dit soort problemen moet je altijd eerst nadenken over je algoritme; dat wil dus zeggen dat je een stappenplan moet opstellen voordat je het gaat implementeren in PHP.

Als je maximumlengte vooraf bekend is kun je dit makkelijk recursief oplossen. Hoe dat gaat is makkelijker uit te leggen als je een 'lege' string beschouwt als een spatie. Voor maximumlengte 3 wordt je lijst dan zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
..a
..b
 |
..z
.aa
.ab
 |
.zz
aaa
 |
zzz

Je genereert zo dus steeds strings van lengte 3, maar je hoeft natuurlijk geen echte punt te gebruiken. Deze representatie is echter handig om in te zien dat een string als '.aa' eigenlijk van dezelfde vorm is als de string 'qaa', behalve dat er een leeg karakter voor gevoegd is.

De eindconclusie is dus dat je strings dus simpelweg alle combinaties van drie karakters uit de karakterset zijn. Hoe genereer je die nu? Het makkelijkst is om dat recursief te doen: als je een string hebt van lengte X (bijvoorbeeld 'q' is van lengte 1) en je doel is om alle strings van lengte N (bijvoorbeeld: 3) te vinden, dan kun je simpelweg elk van de mogelijke karakters om de beurt toevoegen en er dezelfde procedure op loslaten. In dit voorbeeld genereer je bijvoorbeeld 'qa', 'qb' tot en met 'qz'. Als je 'qa' beschouwt en daarvoor dezelfde procedure uitvoert, dan genereer je daarvoor weer 'qaa', 'qab', enzovoorts. Je voert echter ook de procedure uit voor 'qb', en daarmee genereer je 'qba', 'qbb', enzovoorts. Uiteindelijk komen dus alle combinaties voorbij en je hoeft alleen maar te stoppen met combineren zodra de strings de gewenste lengte hebben.

In pseudo-code ziet het algoritme er ongeveer zo ui:
code:
1
2
3
4
5
6
genereer(string):
    als lengte van string is 3:
        doe iets met die string.
    anders:
        voor elk karakter in de lijst ('.', 'a', ' b', ... , 'z'):
            genereer( string . karakter )

Overigens heb ik nog een aantal gebreken overgelaten in m'n pseudocode; aan jouw de taak om die te verbeteren. ;)

Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 16-09 13:13
Bedankt in ieder geval. 'k Ga er vanmiddag weer mee aan de slag als ik er nog wat tijd voor vrij zie te krijgen :)

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Noem me dom, maar volgens mij wil je dit graag:

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
<?php

$initial_array = array();

For ($i=0;$i<26;$i++);  //  Eventjes de initial array "seeden" met chars...
{

  $initial_array[] = chr($i+97);  //  chr(97) = "a" en chr(25+97) = "z" a t/m z dus ;)

}

$charlength = 4;  //  Hoeveel chars moet hij uiteindelijk lang zijn? (dit is bijv. tot "zzzz")
$arraylength = count($initial_array)  //  Hoeveel chars zaten er in de oorspronkelijke array en hoeveel moeten er dus steeds bijgeplakt worden?
$array = $initial_array;  //  $array wordt de grote array en $initial_array blijft zichzelf

For ($a=0;$a<$charlength-1;$a++)  //  Loopje waarbij per loopje de string dus 1 char langer wordt.
{

  $c = pow($arraylength,$a+1);
  $d = count($array);
  For ($b=0;$b<$c;$b++)
  {

    For ($e=0;$e<$arraylength;$e++)  //  Telkens de initial array achter de bestaande meuk plakken
    {
    
      $array[] = $array[$d-$c+$b].$initial_array[$e];

    }

  }

}

print_r($array);

?>


Kheb ff wat commentaar toegevoegd, maar wist niet goed hoe ik sommige dingen nou precies moest omschrijven en in woorden moest brengen.
Verder zijn wat variabelen wat ongelukkig gekozen ($a enzo), maar kheb geen zin om die meer aan te passen :P
Als 't goed is moet het dus werken met allerlij chars in $initial_array :)

edit:
Voorbeeldje met $initial_array = array("1", "2", "3");
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 11
[4] => 12
[5] => 13
[6] => 21
[7] => 22
[8] => 23
[9] => 31
[10] => 32
[11] => 33
[12] => 111
[13] => 112
[14] => 113
[15] => 121
[16] => 122
[17] => 123
[18] => 131
[19] => 132
[20] => 133
[21] => 211
[22] => 212
[23] => 213
[24] => 221
[25] => 222
[26] => 223
[27] => 231
[28] => 232
[29] => 233
[30] => 311
[31] => 312
[32] => 313
[33] => 321
[34] => 322
[35] => 323
[36] => 331
[37] => 332
[38] => 333
)

[ Voor 28% gewijzigd door Osiris op 07-07-2004 19:48 ]


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
PHP:
1
2
3
4
5
6
7
8
$array = array('a','b',...'y','z');
for ($i = 0; $i < count($array); $i++)
{
  for ($j = 0; $i < count($array); $j++)
  {
    echo $array[$i].$array[$j];
  }
}

Net zo diep nesten als je wilt.

Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Skaah schreef op 07 juli 2004 @ 20:20:
PHP:
1
2
3
4
5
6
7
8
$array = array('a','b',...'y','z');
for ($i = 0; $i < count($array); $i++)
{
  for ($j = 0; $i < count($array); $j++)
  {
    echo $array[$i].$array[$j];
  }
}

Net zo diep nesten als je wilt.
Krijg daar eigenlijk alleen maar uit:
code:
1
2
3
4
5
6
7
8
aa
ab
ay
az
a
a
a
..etc..

uit? (a, b , y, z als array). Plus, hij stopt niet echt meer hè :) Ook niet echt handig..

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Pagina: 1