login  Naam:   Wachtwoord: 
Registreer je!
 Forum

automatische reeks

Offline infinity - 07/04/2005 15:07
Avatar van infinityGouden medaille

Grafische gevorderde
bestaat er in php een functie die zelf alle combinaties opzoekt als ik bijvoorbeeld abc invul in een formuliertje?

dus ik vul in een formuliertje abc in en als output wil ik dan hebben:
abc, acb, bac, bca, cab, cba

33 antwoorden

Gesponsorde links
Offline Frisbee - 07/04/2005 15:08
Avatar van Frisbee HTML beginner niet dat ik weet 

ik denk dat je zoiets zelf zal moeten schrijven

waarvoor wil je het gaan gebruiken?

zijn het altijd 3 tekens? als het er ook meer kunnen zijn krijg je wel superveel uitkomsten
Offline VonDutch - 07/04/2005 15:21
Avatar van VonDutch PHP interesse Volgens mij kan je berekenen hoeveel verschillende mogelijkheden er zijn door aantal mogelijkheden per teken tot de macht aantal tekens te doen... Ik denk dat zo een functie opzich wel te maken is.
Offline Fenrir - 07/04/2005 15:33 (laatste wijziging 07/04/2005 15:47)
Avatar van Fenrir PHP expert Ik heb er een voor je gemaakt:

Het werkt zo:

array reeks(array mogelijkheden, int aantal, bool iedereletter1keer)

mogelijkheden: een array van de letters die mogelijk zijn, in dit geval array('a', 'b', 'c');

aantal: het aantal letters dat achter elkaar moet worden gezet, nu 3

  1. <?php
  2.  
  3. function reeks($mogelijkheden, $aantal, $ilek = true, $gehad = array())
  4. {
  5. $reeks = array();
  6.  
  7. foreach($mogelijkheden as $key => $mogelijkheid)
  8. {
  9. if($aantal > 1)
  10. {
  11. $newmogel = $mogelijkheden;
  12. if($ilek)
  13. {
  14. $newmogel[$key] = NULL;
  15. }
  16. $newreeks = reeks($newmogel, $aantal - 1);
  17. foreach($newreeks as $item)
  18. {
  19. if(!ilek || strlen($item) == $aantal - 1)
  20. {
  21. $reeks[] = $mogelijkheid . $item;
  22. }
  23. }
  24. }else
  25. {
  26. $reeks[] = $mogelijkheid;
  27. }
  28. }
  29.  
  30. return $reeks;
  31. }
  32.  
  33. $reeks = reeks(array('a', 'b', 'c'), 3);
  34.  
  35. foreach($reeks as $item)
  36. {
  37. echo $item . '<br />';
  38. }
  39.  
  40. echo '<br />';
  41.  
  42. $reeks = reeks(array('a', 'b', 'c'), 3, false);
  43.  
  44. foreach($reeks as $item)
  45. {
  46. echo $item . '<br />';
  47. }
  48.  
  49. ?>


EDIT: betere versie ^
Offline MothZone - 07/04/2005 15:51 (laatste wijziging 07/04/2005 15:54)
Avatar van MothZone PHP ver gevorderde @infinity: md5-bruteforcer aan het maken?:p
ben er ook aan eentje bezig, en als ik dit script bekijk is het beter dan mijn $a = 'a'; $a++ 

edit: als hij langer dan 30 seconden duurt, zet dit dan bovenaan:
  1. <?php
  2. ?>
Offline Fenrir - 07/04/2005 15:54
Avatar van Fenrir PHP expert Brute forcer in php?
Kies dan C++, of assembly, dat is tenminste snel 
Offline MothZone - 07/04/2005 20:13 (laatste wijziging 09/04/2005 13:02)
Avatar van MothZone PHP ver gevorderde mss een late reactie he fenrir, maar als je als aantal 3 instelt begint hij met aab ipv aaaen eindigt met ccb ipv ccc
by 4 letters begint hy met aabc en eindigt hij met ccba
dit toch bij de onderste he
Offline Thomas - 09/04/2005 13:33 (laatste wijziging 09/04/2005 13:33)
Avatar van Thomas Moderator Ah, permutaties.

Onderstaande code ziet elke letter als "uniek symbool". Wanneer je "aabc" invult, zul je dus dubbele items krijgen, maar deze kun je er makkelijk uitfilteren, bijvoorbeeld met array_count_values() ofzo.

  1. <?php
  2. $perm = array();
  3.  
  4. function swap($str, $from, $to) {
  5. $temp = $str[$from];
  6. $str[$from] = $str[$to];
  7. $str[$to] = $temp;
  8. return $str;
  9. }
  10.  
  11. function permute($var, $start) {
  12. global $perm;
  13. $l = strlen($var);
  14. $temp = $var;
  15. for($i=$start; $i<$l; $i++) {
  16. if($l - $start == 1) $perm[] = $var;
  17. $var = swap($temp,$start,$i);
  18. permute($var,$start+1);
  19. }
  20. }
  21. ?>
  22. <html>
  23. <head>
  24. <title>permutaties</title>
  25. </head>
  26.  
  27. <body>
  28. <?php
  29. if(!isset($_POST['submit'])) {
  30. ?>
  31. <form action="rec.php" method="post">
  32. <input type="text" name="text" /><input type="submit" name="submit" value="submit" />
  33. </form>
  34. <?php
  35. } else {
  36. if(isset($_POST['text'])) {
  37. $text = $_POST['text'];
  38. if(trim($text) != "") {
  39. permute($text, 0);
  40. asort($perm);
  41. foreach($perm as $v) echo $v."<br />\n";
  42. echo "<br />".sizeof($perm)." permutations<br />";
  43. } else {
  44. echo "No input.<BR>\n";
  45. }
  46. }
  47. echo "<a href=\"rec.php\">again</a><br />\n";
  48. }
  49. ?>
  50. </body>
  51. </html>
Offline MothZone - 09/04/2005 13:39 (laatste wijziging 09/04/2005 23:21)
Avatar van MothZone PHP ver gevorderde jah, maar fenrir had eerst een script gepost waarbij hij alle combinaties afging:
aaa
aab
aac
aba
...
en die werkte perfect, tot hij een "betere versie" over zijn script zette, en toen werkte het niet meer zo goed:s
en ik kan dat eerste van hem wel gebruiken
Offline Fenrir - 10/04/2005 09:44
Avatar van Fenrir PHP expert Als je het zo aanroept: $reeks = reeks(array('a', 'b', 'c'), 3, false);
Dan gaat hij alles af, dus: aaa, aab, aac, aba, etc.

Maar zo: $reeks = reeks(array('a', 'b', 'c'), 3);
Doet hij alleen dit: abc, bac, cba, etc.
Offline MothZone - 10/04/2005 13:06
Avatar van MothZone PHP ver gevorderde nochtans, als ik dit doe:

$reeks = reeks(array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'), 4, false);

dan begint hij met aabc en eindigd hij met zzyx
Offline Thomas - 10/04/2005 13:55 (laatste wijziging 10/04/2005 14:10)
Avatar van Thomas Moderator Euh, je wilt dus alle combinaties van N karakters in een string ter lengte L ? Dat zijn dus (als mijn kennis mij niet in de steek laat) "N boven L" combinaties, oftewel N! / (L! * (N - L)!

In jouw geval zijn dit 14950 combinaties.

EDIT: Je zou mijn oplossing kunnen gebruiken door alle combinaties van L karakters te pakken, en daarvan (van elke combinatie) alle permutaties te bepalen.
Offline MothZone - 10/04/2005 14:20
Avatar van MothZone PHP ver gevorderde :s jah, jah, euh, kan je het iets duidelijker uitleggen? snap het niet echt
Offline Thomas - 10/04/2005 14:28
Avatar van Thomas Moderator 1. zoek alle mogelijke lettercombinaties (volgorde doet er niet toe)
Bijvoorbeeld (als je alle 3-letter combinaties uit de reeks a-z wilt hebben): abc, abd, abe, et cetera

2. bepaal alle permutaties (verwisselingen) van deze combinaties:
voor abc: abc, acb, bac, bca, cab, cba
voor abd: abd, adb, bad, bda, dab, dba
voor abe: abe, aeb, bae, bea, eab, eba
et cetera
Offline MothZone - 10/04/2005 14:42
Avatar van MothZone PHP ver gevorderde jah, maar dan kan je nooit uitkomsten hebben zoals aab of bcb ofzo, en zo'n script zoek ik
Offline Fenrir - 10/04/2005 15:02
Avatar van Fenrir PHP expert Hier:

  1. function combinaties($mogelijkheden = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'), $lengte = 4)
  2. {
  3. $return = array();
  4. foreach($mogelijkheden as $a)
  5. {
  6. if($lengte > 1)
  7. {
  8. $comb = combinaties($mogelijkheden, $lengte - 1);
  9. foreach($comb as $c)
  10. {
  11. $return[] = $a . $c;
  12. }
  13. }else
  14. {
  15. $return[] = $a;
  16. }
  17. }
  18. return $return;
  19. }

Dit gaat denk ik wel een paar minuten (uren?) duren:

Er zijn 26 ^ 4 = 456976 mogelijkheden.
Offline MothZone - 10/04/2005 15:50 (laatste wijziging 11/04/2005 18:46)
Avatar van MothZone PHP ver gevorderde ok, thx, hij werkt (juist getest)


eneuh, na 30 seconden toont hij al dtky dus uren... 

maar toch thx

edit: kan je ook ergens instellen by welke combinatie hij moet beginnen?
Offline nemesiskoen - 11/04/2005 19:38
Avatar van nemesiskoen Gouden medaille

PHP expert
verbeter me als ik verkeert ben maar ik denk zo

  1. <?php
  2. $mogelijkheden = array('d', 'e', 'f', 'g', /*enz*/);
  3. $lengte = /*uw lengte*/;
  4.  
  5. combinaties($mogelijkheden, $lengte);
  6. ?>
Offline MothZone - 11/04/2005 19:43
Avatar van MothZone PHP ver gevorderde jah, das hoe de functie moet gebruikt worden, maar je stelt niet in dat hij vb bij hzpx moet beginnen he
Offline infinity - 11/04/2005 20:21
Avatar van infinity Gouden medaille

Grafische gevorderde
  1. function combinaties($mogelijkheden = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'), $lengte = 4)
  2. {
  3. $return = array();
  4. foreach($mogelijkheden as $a)
  5. {
  6. if($lengte > 1)
  7. {
  8. $comb = combinaties($mogelijkheden, $lengte - 1);
  9. foreach($comb as $c)
  10. {
  11. $return[] = $a . $c;
  12. }
  13. }else
  14. {
  15. $return[] = $a;
  16. }
  17. }
  18. return $return;
  19. }



als ik dat gebruik krijg ik helemaal geen output. hoe moet ik dat nou precies echo-en:/ beetje een n00b vraag

Offline Rens - 11/04/2005 20:33
Avatar van Rens Gouden medaille

Crew algemeen
  1. <?PHP
  2. $mogelijkheden = array('d', 'e', 'f', 'g', /*enz*/);
  3. $lengte = /*uw lengte*/;
  4.  
  5. $sCombinaties = combinaties($mogelijkheden, $lengte);
  6. echo $sCombinaties
  7. // of
  8. echo combinaties($mogelijkheden, $lengte);
  9. ?>


Je kunt hem eerst in een variabele zetten, voor als je er nog iets mee wilt doen ipv alleen op het scherm zetten.
Of je kunt hem meteen op het scherm zetten, zodat je er niks meer mee kunt doen.
Offline MothZone - 11/04/2005 20:45
Avatar van MothZone PHP ver gevorderde staat op de vorige pagina
  1. <?php
  2. $reekd = combinaties($mogelijkheden, $lengte);
  3.  
  4. foreach($reeks as $item)
  5. {
  6. echo $item . '<br />';
  7. }
  8. ?>


Maar weet hier nu niemand hoe je kan instellen met wat hij moet beginnen? 
Offline Dark_force - 11/04/2005 22:16
Avatar van Dark_force Nieuw lid even offtopic
dit:
array('a','b','c'.....'y','z');
Is juist het zelfde als:
range('a', 'z');
OF met numbers=
$symbolen=array_merge(range('a', 'z'), range('0', '9'))
Offline MothZone - 11/04/2005 22:31 (laatste wijziging 12/04/2005 18:31)
Avatar van MothZone PHP ver gevorderde ow, leuk om te weten, dat maakt de code een stukje korter 
Offline nemesiskoen - 12/04/2005 18:39 (laatste wijziging 13/04/2005 14:06)
Avatar van nemesiskoen Gouden medaille

PHP expert
Mothzone
je moet gewoon een array $mogelijkheden aanmaken, een daarin zet je al je letters... het eerste letter dat je erin ze, daarmee begint het

dus ik wil bv zien van de letters d, e en f dan doe ik:

  1. <?php
  2. $mogelijkheden = array('d', 'e', 'f');
  3. $reekd = combinaties($mogelijkheden, 3);
  4. //en dan hier iets met die reeks doen
  5. ?>
Offline MothZone - 12/04/2005 18:45 (laatste wijziging 12/04/2005 22:37)
Avatar van MothZone PHP ver gevorderde jah, ik kan lezen he 
ik weet wel hoe ik hem moet gebruiken, maar hoe kan je instellen waarmee hij moet STARTEN
vb:
in $start staat "ghi"
eenmaal hij begint toont hij dit:
ghi
ghj
ghk
ghl
ghm
...

snap je t?
Offline Thomas - 13/04/2005 11:05
Avatar van Thomas Moderator Misschien kun je iets doen met een getallenreeks die opgebouwd is uit machten van 26 (er zitten 26 letters in het alfabet).

Dus stel dat je 3 letters hebt, dan kun je hiervan als volgt een getal maken:

ghi: 7 * 26^2 + 8 * 26^1 + 9 * 26^0
ghj: 7 * 26^2 + 8 * 26^1 + 10 * 26^0
...

Al deze getallen zijn uniek doordat je een soort van 26-tallig stelsel gebruikt.
Offline MothZone - 13/04/2005 13:03
Avatar van MothZone PHP ver gevorderde jah, ken die formule ook... maar snap niet echt hoe je zo een beginwaarde kan ingeven 
Offline Thomas - 13/04/2005 13:18
Avatar van Thomas Moderator En die ghi moet dan helemaal naar zzz ?
De karakters waaruit de string bestaat zijn dan g t/m z ? Dus er komt geen a in voor ofzo ? Want dat zou het wel wat makkelijker maken.

Ik heb nog steeds geen goed beeld van de specificatie zeg maar.
invoer -> uitvoer.
Offline MothZone - 13/04/2005 13:46
Avatar van MothZone PHP ver gevorderde een vb met 2 karakters:
hij begint bij "yz", dus dit zou ik dan moeten krijgen:
yz
za
zb
zc
zd
ze
...
zz

vanaf y en z vind je ook geen a in het alfabet, maar toch komen ze in de reeks voor...
snap je t nu?:s 
Offline Thomas - 13/04/2005 14:38
Avatar van Thomas Moderator Jup, ik zal wel ff een programmaatje hiervoor schrijven, zal wel ff duren though .
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.308s