[PHP] Strings "verhogen"?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Topicstarter
Ik weet niet hoe je dit precies noemt, maar het probleem is het volgende:

Ik wil een functie maken dat steeds een letter verder gaat, zoals dit:
a
b
c
etc. Dat is vrij makkelijk met ord() en chr(), maar het moet ook verder gaan, zoals:
z
aa
ab

en daarna
az
ba

enzovoort (tot ongeveer 12 characters).. Ik heb geen idee hoe ik zoiets voor mekaar moet krijgen, iemand een idee?

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Wil je 1 grote lijst krijgen of wil je een soort van for lus waarin telkens met die string een commando wordt uitgevoerd; geef eens wat meer achtergrond informatie?

Overigens zijn er voor de meeste progsels al gewoon bruteforce crackers op de markt; het nut om er zelf 1 te schrijven (in PHP nog wel) is redelijk nihil :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Topicstarter
Steeds een lus ja..

Het wordt geen bruteforcer, het wordt voor een soort woordspelletje, beetje moeilijk uit te leggen, als het werkt post ik het eindresultaat wel :)

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Je geeft zelf de oplossing al aan; schrijf een functie die een string opsplitst in losse characters; de laatste met 1 verhoog; en indien deze te hoog is het character daarvoor verhoogt.

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je hoeft 'm natuurlijk niet op te splitsen in chars, aangezien je individuele chars kunt aanspreken met de {} operator

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

.oisyn schreef op 04 april 2004 @ 14:41:
Je hoeft 'm natuurlijk niet op te splitsen in chars, aangezien je individuele chars kunt aanspreken met de {} operator
Dat is waar; ik wilde het idee even duidelijk neerzetten. Iedere string is immers ook als array aan te spreken :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
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
<?php

$charStart = 97;
$charEnd = 122;
$MaxChars = 2;

$eval = "";
for ($i = 0; $i < $MaxChars; $i++)
{
    //code generation here
    $CounterName = chr ($i + 105);
    $LastCounterName = chr ($i + 104);
    
    $eval .= 
        "for (\$". $CounterName .
        " = {$charStart}; \$" . $CounterName .
        " <= " . $charEnd . "; \$" . $CounterName . "++)\n{\n\t";
    if ($i != 0)
        $eval .= "\$str[{$i}] = \$str[" . ($i - 1) ."] . chr (\${$CounterName});\n";
    else
        $eval .= "\$str[{$i}] = chr (\${$CounterName});\n";

    if ($i == $MaxChars -1)
    {
        $eval .= "echo \$str[{$i}] . \"<br>\";\n";
        $eval .= "\$str[{$i}] = \"\";";
    }
    $prepend .= "\n}";
}
eval ($eval . $prepend);
?>


Lijkt me behoorlijk duidelijk, $MaxChars is het aantal tekens en het duurt met 4 max tekens al behoorlijk lang, laat staan met 12, maar goed

Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Warom die verschrikkelijk lelijke evals erin :?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Spider.007 schreef op 04 april 2004 @ 14:43:
[...]


Dat is waar; ik wilde het idee even duidelijk neerzetten. Iedere string is immers ook als array aan te spreken :)
Dat werkt nog wel in php4 maar is eigenlijk deprecated, gebruik de "nieuwe" (php4 is natuurlijk niet zo nieuw meer ;)) {} operator
OMG, dat is toch wel de meest ranzige code die ik ooit heb gezien :X

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
function incStr ($s)
{
    $i = strlen ($s) - 1;
    do
    {
        $c = ord ($s{$i}) + 1;
        if ($c == ord ("z") + 1)
        {
            $c = ord ("a");
            $carry = true;
        }
        else
            $carry = false;
        $s{$i--} = chr ($c);
    }
    while ($carry && $i >= 0);

    return $carry ? "a" . $s : $s;        
}


$s = "a";
for ($i = 0; $i < 1000; $i++)
{
    echo $s . "\n";
    $s = incStr ($s);
}

[ Voor 51% gewijzigd door .oisyn op 04-04-2004 15:20 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Topicstarter
Werkt goed .oisyn, bedankt ;)

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Spider.007 schreef op 04 april 2004 @ 15:04:
Waarom die verschrikkelijk lelijke evals erin :?
ik vond het in dit geval nog wel kunnen eigenlijk
.oisyn schreef op 04 april 2004 @ 15:10:
Dat werkt nog wel in php4 maar is eigenlijk deprecated, gebruik de "nieuwe" (php4 is natuurlijk niet zo nieuw meer ;)) {} operator
Maar effectief doet het hetzelfde ;)

[ Voor 41% gewijzigd door PrisonerOfPain op 04-04-2004 15:28 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Radiant16 schreef op 04 april 2004 @ 15:21:
Werkt goed .oisyn, bedankt ;)
Mja, dat was natuurlijk niet helemaal de bedoeling, nu leer jij er niets van :X
Probeer iig even mijn code te begrijpen, heb je zelf ook een stuk meer aan :)
PrisonerOfPain schreef op 04 april 2004 @ 15:22:
[...]

ik vond het in dit geval nog wel kunnen eigenlijk
waarom in hemelsnaam :?
eval = evil (het verschilt niet voor niets slechts 1 klinker :P)

[ Voor 31% gewijzigd door .oisyn op 04-04-2004 15:44 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

.oisyn schreef op 04 april 2004 @ 15:42:
[...]


Mja, dat was natuurlijk niet helemaal de bedoeling, nu leer jij er niets van :X
Probeer iig even mijn code te begrijpen, heb je zelf ook een stuk meer aan :)

[...]
Lol; inderdaad ja.. ik verwacht van de TS een documentatie van minstens 1 pagina over deze functie :P

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
.oisyn schreef op 04 april 2004 @ 15:42:
waarom in hemelsnaam :?
eval = evil (het verschilt niet voor niets slechts 1 klinker :P)
1) er kan weinig fout gaan, heb geen user input oid
2) waarom is 'evil', een taal heeft niet voor niets ondersteuning voor eval
3) hoe ranzig ook, het is wel de simpelste code die in mij op kwam, op dat moment (is al weer ff oud, dit stuk)
4) onderhoudbaarheid doet hier niet echt toe

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

PrisonerOfPain schreef op 04 april 2004 @ 15:47:
[...]

1) er kan weinig fout gaan, heb geen user input oid
dit vind ik geen argument om het maar te gebruiken, zeker als het absoluut niet nodig is
2) waarom is 'evil', een taal heeft niet voor niets ondersteuning voor eval
Goto zit ook in een taal, goto is ook evil. Haha, bovendien is er over PHP sowieso niet bijzonder goed over nagedacht, dus dat iets in PHP zit betekent allesbehalve dat het dan niet evil is :Y)
Maar ga jij je code nu eens herschrijven naar C of C++ oid, dat lukt je niet. Java of C# zou nog wel lukken, daar kun je gebruik maken van een compiler. Maar waarom zou je het überhaupt gebruiken? Het is zo inefficient als het maar zijn kan
3) hoe ranzig ook, het is wel de simpelste code die in mij op kwam, op dat moment (is al weer ff oud, dit stuk)
Serieus? Is een normale aanpak zonder eval niet logischer? Kun je misschien je code eens toelichten, en waarom het volgens jou "moeilijker" is zonder eval?
4) onderhoudbaarheid doet hier niet echt toe
slap excuus, een goede programmeur schrijft uit zichzelf al onderhoudbare code

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Om het nog maar niet te hebben over dat de code compleet onleesbaar is voor iemand die het niet geschreven heeft (met wat moeite lukt het wel.. maar die moeite wil ik niet doen)...

[ Voor 5% gewijzigd door Bosmonster op 04-04-2004 16:00 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Radiant16 schreef op 04 april 2004 @ 14:04:
Ik weet niet hoe je dit precies noemt, maar het probleem is het volgende:

Ik wil een functie maken dat steeds een letter verder gaat, zoals dit:
a
b
c
etc. Dat is vrij makkelijk met ord() en chr(), maar het moet ook verder gaan, zoals:
z
aa
ab

en daarna
az
ba

enzovoort (tot ongeveer 12 characters).. Ik heb geen idee hoe ik zoiets voor mekaar moet krijgen, iemand een idee?
OK ik heb de replies in dit topic gezien en misschien denk ik te simpel... maar is dit niet wat je wil?

PHP:
1
2
3
4
$string = 'a';
for($i=0; $i<200; $i++){
    print $string++.'<br>';
}


in actie te zien: http://www2.hku.nl/~jaap3/stringincrement.php

[edt] Ojah als de string bijvoorbeeld spaz is en je doe string++ wordt dit dus spba. Volgens mij is dit dus helemaal wat je zoekt... (natuurlijk wel zelf even in een functie bakken :D)

[ Voor 14% gewijzigd door Verwijderd op 04-04-2004 16:10 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

.edit: hmm idd
PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's. For example, in Perl 'Z'+1 turns into 'AA', while in C 'Z'+1 turns into '[' ( ord('Z') == 90, ord('[') == 91 ). Note that character variables can be incremented but not decremented.
:D

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
.oisyn schreef op 04 april 2004 @ 15:55:
dit vind ik geen argument om het maar te gebruiken, zeker als het absoluut niet nodig is

Goto zit ook in een taal, goto is ook evil. Haha, bovendien is er over PHP sowieso niet bijzonder goed over nagedacht, dus dat iets in PHP zit betekent allesbehalve dat het dan niet evil is :Y)
Maar ga jij je code nu eens herschrijven naar C of C++ oid, dat lukt je niet.
Daar was ik idd bij het 'ontwerpen' tegenaan gelopen, maar ik zag dus echt niet hoe het anders zou kunnen
Java of C# zou nog wel lukken, daar kun je gebruik maken van een compiler. Maar waarom zou je het überhaupt gebruiken? Het is zo inefficient als het maar zijn kan
Ik heb er serieus een tijd over nagedacht, en zeker geprobeerd het zonder eval te doen ;) De doelstelling was ongeveer "maar een script wat een binnen een reeks alle tekens afloopt" net als hier, maar dan moest het aantal tekens variabel zijn. Dus dacht ik "HA! geneste loops kunnen dit, maar hoe maak ik dit nou weer variabel" nou zo dus :P
Serieus? Is een normale aanpak zonder eval niet logischer? Kun je misschien je code eens toelichten, en waarom het volgens jou "moeilijker" is zonder eval?
Als ik er zo overna denk is het idd veel logischer, maar k ben er niet op gekomen, omdat ik met die geneste loop's in m'n hoofd zat :x
slap excuus, een goede programmeur schrijft uit zichzelf al onderhoudbare code
wat zou er onderhoudbaar moeten zijn aan dit script dan? Normaal houd ik er zeker wel rekening mee, maar als ik zeer zeker weet dat het niet moet/hoeft doe ik het niet zeker niet bij sniplets als deze.
PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's. For example, in Perl 'Z'+1 turns into 'AA', while in C 'Z'+1 turns into '[' ( ord('Z') == 90, ord('[') == 91 ). Note that character variables can be incremented but not decremented.
in php gaat het dus niet met echo $a +1; oid, dan gebeurt er of niets of je krijgt '1' te zien, je doet dus echo ++$a;

[ Voor 16% gewijzigd door PrisonerOfPain op 04-04-2004 16:25 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Ik denk dat Jaap3 gewoon de enige juiste oplossing geeft. Zelf zat ik te denken aan het koppelen van strings aan getallen, zodat 0 == 'a', 25 == 'z', 26 == 'aa', 54 = 'bc', etc. Die strings zijn immers een soort 26-tallige representatie van de natuurlijke getallen (maar net niet helemaal, bij gebrek aan een 0-karakter). Voor die conversie is wel een vrij korte recursieve functie voor te schrijven:
PHP:
1
2
3
function int_to_str($n) {
    return $n < 0 ? '' : int_to_str((int)($n/26) - 1).chr(ord('a') + $n%26);
}

En eventueel is dat ook weer om te schrijven naar een iteratieve functie:
PHP:
1
2
3
4
5
function int_to_str($n) {
    for($str = ''; $n >= 0; $n = $n/26 - 1)
        $str = chr(ord('a') + $n%26).$str;
    return $str;
}


Maar goed, als PHP dit uit zichzelf al kan, dan zou je wel gek zijn om er zelf code voor te gaan schrijven. Denk er trouwens wel aan dat het je nooit gaat lukken om strings tot 12 karakters langs te gaan, want dat zijn een kleine honderd miljoen miljard strings en da's best wel veel. :P

[ Voor 9% gewijzigd door Soultaker op 04-04-2004 16:31 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Oh ja, eval zit waarschijnlijk alleen in PHP omdat het toevallig redelijk eenvoudig te implementeren is als je al een interpreter hebt die strings kan evalueren (dat is zo'n beetje alles wat PHP doet). Als het bijzondere moeite had gekost om eval te implementeren dan hadden de makers van PHP het waarschijnlijk achterwege gelaten, omdat het als bouwsteen van serieuze scripts een nogal onpraktisch ding is.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Soultaker: waarom zou mijn oplossing niet juist zijn?
omdat het als bouwsteen van serieuze scripts een nogal onpraktisch ding is.
Maar dat is natuurlijk niet iets wat de developers van PHP tegen zou houden ;)

[ Voor 61% gewijzigd door .oisyn op 04-04-2004 16:32 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Omdat het onzinnig is om code te schrijven die hetzelfde doet als een built-in constructie. (Mijn suggestie was wat dat betreft net zo fout hoor, maar ik had het zitten uitzoeken en kon het toen niet laten 'm toch nog even te posten.)

[ Voor 44% gewijzigd door Soultaker op 04-04-2004 16:32 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah op die fiets, dan geef ik je idd gelijk :) (zie ook mijn vorige edit trouwens, mocht je dit gemist hebben)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
PHP:
1
2
for ($i = 'a'; $i < 'zzz';)
    echo ++$i . " ";

werkt dus ook gewoon :x

[ Voor 24% gewijzigd door PrisonerOfPain op 04-04-2004 16:37 ]

Pagina: 1