/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Generer alle kombinationer af en string vi~
Fra : Thomas Løjmann Jørge~


Dato : 14-08-07 07:55

Hej,

Jeg står og skal generer en række værdier.

Det skal være alle kombinationer der er mulige, med en string der er
mellem 1 og 10 chars lang.
Det må ikke starte på '_' eller '-' og må heller ikke indeholde mere end
én af disse i stræk.

Mit array med mulige chars i, ser sådan her ud:

$values = 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, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, _, '-');


Dvs koden skal lave:

a
b
c
..
..
..
aa
ab
ac
...
...
...
ba
bb
bc
...
...
...
...
...
...
osv osv osv...

Jeg har knoklet lidt med noget kode, men syntes langt fra at det ligner
noget, der kommer til at virke...

Nogle som kan hjælpe mig?

/Thomas

 
 
Michael Zedeler (14-08-2007)
Kommentar
Fra : Michael Zedeler


Dato : 14-08-07 08:43

Thomas Løjmann Jørgensen wrote:
> [...]
> Mit array med mulige chars i, ser sådan her ud:
>
> $values = 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, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, _, '-');
>
>
> Dvs koden skal lave:
>
> a
> b
> c
> .
> .
> .
> aa [klip]
> Jeg har knoklet lidt med noget kode, men syntes langt fra at det ligner
> noget, der kommer til at virke...
>
> Nogle som kan hjælpe mig?

Start med at bringe din kode her.

Mvh. Michael.

Ukendt (14-08-2007)
Kommentar
Fra : Ukendt


Dato : 14-08-07 09:47

NÃ¥ ja :)

<?
   $letters = 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, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, _, '-');
   $domain = "";
   $numbers = 100;
   $i = 0;
   $count = 0;

   echo "Start\n\n";
   while($i <= $numbers && $count < 200) {
      if($i == 38) {
         if(isset($z)) {
            $i = $z;
            $z = $i + $z;
            $z++;
         }
         else {
            $i = $i - $count;
            $z = $i + $z;
         }
         echo "-----------------\n";
         if($letters[$i] != "_" && $letters[$i] != "-") {
            echo "$count. $letters[$i]$letters[$z].dk (i: $i - z: $z)\n";
         }
         echo "-----------------\n";
      }
      else {
         // && $letters[$i] != "_" && $letters[$i] != "-"
         if($letters[$z] != "_" && $letters[$z] != "-") {
            echo "$count. $letters[$z]$letters[$i].dk (X i: $i - z: $z)\n";
         }
      }
      $i++;
      $count++;
   }
   echo "\n\nEnd\n";
?>

Michael Zedeler (14-08-2007)
Kommentar
Fra : Michael Zedeler


Dato : 14-08-07 22:08

Thomas Løjmann Jørgensen wrote:
> <?
> $letters = 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, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, _, '-');
> $domain = "";
> $numbers = 100;
> $i = 0;
> $count = 0; [klip]

Jeg har kigget lidt på dit program og på det output, det genererer. Det
ser ikke godt ud. Første observation er at hvis du ønsker at generere x
strenge af y længde, må der på den ene eller anden måde være to løkker
der gennemløbes henholdsvis x og y gange, hvilket giver x * y gennemløb.
Det har du ikke.

En anden mulighed er at løse problemet rekursivt - dermed fremgår det
dog ikke så tydeligt at man når at lave x * y gennemløb. Jeg synes at
det letteste er at skrive en rekursiv funktion, så here goes:

<?php
function get_variations( $selection, $prefix, $length ) {
if( $length == 0 ) {
print "$prefix\n";
} else {
for($i=0; $i < sizeof( $selection ); $i++ ) {
if( $selection[$i] == "\0" ) {
// end of string
get_variations( $selection, $prefix, 0 );
} else {
get_variations( $selection, "$prefix$selection[$i]", $length
- 1);
}
}
}
}

get_variations( array(a, b, c, d, e, f, "\0" ), '', 5 );

?>

Mvh. Michael.

P.s. domænenavne må ikke indeholde underscore.

Ukendt (15-08-2007)
Kommentar
Fra : Ukendt


Dato : 15-08-07 05:42

Tak Michael,

Jeg skal se lidt på den kode, har lige testet kort her i toget til
morgen og det ser ganske dejligt ud.
Mange tak for din eye-opener og din kodestump.

/Thomas

PS: Har brugt det array et andet sted, derfor underscore som så klart
ikke kan være i et domænenavn :)

Bertel Lund Hansen (14-08-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 14-08-07 10:04

Thomas Løjmann Jørgensen skrev:

> Det skal være alle kombinationer der er mulige, med en string der er
> mellem 1 og 10 chars lang.

Det giver 3656158440062976 muligheder blot for de strenge der har
præcis 10 tegn (minus en smule der bryder din regel). Hvis du
genererer 100 i sekundet, tager det 1'159'360 år at gennemløbe
dem.

Skal du virkelig bruge dem alle?

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Thomas Løjmann Jørge~ (14-08-2007)
Kommentar
Fra : Thomas Løjmann Jørge~


Dato : 14-08-07 10:22

Hej Bertel,

Bertel Lund Hansen wrote:
> Thomas Løjmann Jørgensen skrev:
>
>> Det skal være alle kombinationer der er mulige, med en string der er
>> mellem 1 og 10 chars lang.
>
> Det giver 3656158440062976 muligheder blot for de strenge der har
> præcis 10 tegn (minus en smule der bryder din regel). Hvis du
> genererer 100 i sekundet, tager det 1'159'360 år at gennemløbe
> dem.
>
> Skal du virkelig bruge dem alle?
>
Nej det skal jeg ikke helt, vil nok begrænse mig ved strings som er max
20 tegn. Jeg ved det kommer til at tage super lang tid at lave det data,
men det er til et 'lille' eksperiment jeg roder med når jeg ikke kan
sove om natten :)

/Thomas

Bertel Lund Hansen (14-08-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 14-08-07 10:49

Thomas Løjmann Jørgensen skrev:

> Nej det skal jeg ikke helt, vil nok begrænse mig ved strings som er max
> 20 tegn.

20 i stedet for 10. Skulle det gå hurtigere?

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Thomas Løjmann Jørge~ (14-08-2007)
Kommentar
Fra : Thomas Løjmann Jørge~


Dato : 14-08-07 11:15

Bertel Lund Hansen wrote:
> Thomas Løjmann Jørgensen skrev:
>
>> Nej det skal jeg ikke helt, vil nok begrænse mig ved strings som er max
>> 20 tegn.
>
> 20 i stedet for 10. Skulle det gå hurtigere?
>
Naturligvis ikke.
Jeg vil blot eksperimenter med denne store data mængde, for at have lidt
at regne på... 12-15 tegn pr string er måske også nok.

Jeg er klar over det er meget data, men det kan ikke være umuligt at
lege med...

/Thomas

Bertel Lund Hansen (14-08-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 14-08-07 11:39

Thomas Løjmann Jørgensen skrev:

> Jeg er klar over det er meget data, men det kan ikke være umuligt at
> lege med...

Hvis du var startet da Jesus blev født, kunne du være færdig med
at beregne strenge med 10 tegn nu. Med 15 tegn vil det vare
140'204'160'147 år blot at gennemløbe dem der har 15 tegn. Det er
vist 7 gange universets nuværende alder.

Brug ANTAL som en konstant og sæt den til 4 til at begynde med.
Når det hele så kører, så sæt den til 5, 6 osv. indtil du forstår
begrebet "meget lang tid".

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Christian Hansen (14-08-2007)
Kommentar
Fra : Christian Hansen


Dato : 14-08-07 10:56

Thomas Løjmann Jørgensen wrote:

> Nej det skal jeg ikke helt, vil nok begrænse mig ved strings som er max
> 20 tegn. Jeg ved det kommer til at tage super lang tid at lave det data,
> men det er til et 'lille' eksperiment jeg roder med når jeg ikke kan
> sove om natten :)

Bertels eksempel tager så udgangspunkt i at dine strenge max er 10 tegn
lange og det er altså på den baggrund han har beregnet antallet af
muligheder og tiden det vil tage, hvis man har en computer, der kun kan
klare 100 i sekundet :)

Men måske er det ikke det, du mener?

Mvh Christian

Thomas Løjmann Jørge~ (14-08-2007)
Kommentar
Fra : Thomas Løjmann Jørge~


Dato : 14-08-07 11:16

Hej Christian,

Jeg skal nok finde ud af hvor lang tid det tager, det er en del af min
hygge-projekt.
Jeg har dog brug for at generer disse mange strings for at finde ud af
hvad det i teorien vil tage for at generer alle. Derfor er en
begrænsning på 12-12-15-20 teg pr. string godt nok, selvom det er RIGTIG
MANGE STRINGS og vil tage lang tid...


/Thomas

Bertel Lund Hansen (14-08-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 14-08-07 11:33

Christian Hansen skrev:

> muligheder og tiden det vil tage, hvis man har en computer, der kun kan
> klare 100 i sekundet :)

Jeg lavede lige en test. Hvis de skal skrives løbende til
skærmen, klarer min pc knap 50'000 i sekundet. Så tager det kun
2'318 år.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste