Ankündigung

Einklappen
Keine Ankündigung bisher.

Permutation - Buchstaben in String mixen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Permutation - Buchstaben in String mixen

    Also ich möchte gerne wenn ich einen String angebe, dass alle möglichen Reihenfolgen der Buchstaben angezeigt werden.
    zB beim string = "abc":
    Ausgabe: abc, acb, bac, bca, cab, cba

    Ich habe einen Code für Python gefunden:

    Code:
    def unsort(s, prefix=""):
        if len(s) == 1:
            return [prefix + s]
        r = []
        for i in range(len(s)):
            r.extend(unsort(s[:i] + s[i+1:], prefix + s[i]))
        return r
        
    print unsort('ABC')
    Dieser erfüllt auch die Aufgabe, allerdings möchte ich das gerne in PHP haben. Mein Versuch das selbst umzuschreiben sind gescheitert:

    PHP-Code:
    <?php

    function fac($s$prefix="") {
        if (
    strlen($s) == 1) {
            echo 
    $s;
    }
        
    $r = array();
        for (
    $i 0$i strlen($s); $i++) {
            
    $ar[] = fac($s[:$i] + $s[$i+1:], $prefix $s[$i]);
    }
        echo 
    $r;
    }
    echo 
    fac('abc');
    ?>
    Also irgendwie logisch, dass man das nicht einfach so umändern kann, aber weiß nicht wie ich es sonst hin bekommen sollte.

    Mein Problem ist wohl die stelle: "$ar[] = fac($s[:$i] + $s[$i+1:], $prefix + $s[$i]);"
    Ich verstehe nicht was dort gemacht wird... hat ja eigentlich auch eher was mit python zu tun, aber vielleicht kann das ja jemand ableiten.
    Schonmal vielen Dank im Voraus =)


  • #2
    1. sollte $ar auch dein definiertes Array sein, also $r
    2. das ist ein Array, das kann man nicht per echo ausgeben!
    echo $r;
    3. Deine Funktion gibt nichts zurück was willst du da ausgeben?
    echo fac('abc');

    4. erklär mir mal bitte was das machen soll:
    $s[:$i]
    5. Ist dein error_reporting(-1) an?
    "My software never has bugs, it just develops random features."
    "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

    Kommentar


    • #3
      danke für deine antwort.

      1. ja, das a ist zu viel.

      2. print_r($r); ginge aber doch oder?

      3. sie sollte ja eigentlich was ausgeben^^

      4. das war ja gerade meine frage. Das gibt es nur unter python...

      5. nein ist es nicht

      Kommentar


      • #4
        Du musst ja als erstes versuchen Dir alle Buchstaben in ein Array zu schreiben. Laut Deinem Code müsste dann das so aussehen.

        PHP-Code:
        function fac($s) {
            if (
        strlen($s) == 1) {
                echo 
        $s;
            }
            
        $r = array();
            for (
        $i 0$i strlen($s); $i++) {
                
        $r[] = $s[$i] ;
            }
            
        var_dump($r);
        }

        echo 
        fac('abc'); 
        Im Zweiten Schritt müsstest Du jetzt die drei Buchstaben ausbeben. Die Daten liegen Dir ja im Array $r vor. Wie Du diese ausgibst ist ja dann Dir überlassen.

        Kommentar


        • #5
          Vielleicht so:

          PHP-Code:
          <?php

          $text
          ="abc";

          for (
          $i=0;$i<strlen($text);$i++){
              
          $split[]=$text{$i};
          }

          for(
          $i=0;$i<count($split);$i++){
              
             if(
          $i==0$erg[]=array("{$split[$i]}{$split[$i+1]}{$split[$i+2]},"{$split[$i]}{$split[$i+2]}{$split[$i+1]}");
             
             elseif(
          $i==2$erg[]=array("{$split[$i]}{$split[$i-1]}{$split[$i-2]}"{$split[$i]}{$split[$i-2]}{$split[$i-1]}");
             
             else 
          $erg[]=array("{$split[$i]}{$split[$i+1]}{$split[$i-1]},"{$split[$i]}{$split[$i-1]}{$split[$i+1]}");
          }
          var_dump($erg);

          ?>
          Das funktioniert allerdings nur mit 3 Buchstaben.

          Kommentar


          • #6
            PHP-Code:
             function fact$int )
                {
                    if( 
            $int<) return 1;
                    for( 
            $f=2$int-1>1$f*=$int-- );
                    return 
            $f;
                }

                
            $string 'abc';
                
            $array = array();
                
            $fact fact(strlen($string));
                for( 
            $i=0$i<$fact; ) {
                    if( !isset(
            $array[$string]) ) {
                        
            $array[$string] = $string;
                        
            $i++;
                    }
                    
            $string str_shuffle($string);
                }
                
            print_r($array); 
            Ausgabe:
            Code:
            Array ( [abc] => abc [cba] => cba [bac] => bac [acb] => acb [cab]  => cab [bca] => bca )
            google hätte dir die Antwort auch gebracht

            Um die Ausgabe zu vereinfachen kannst du auch die if-Abfrage ändern
            PHP-Code:
            if( !isset($array[$i]) ) {
                        
            $array[$i] = $string;
                        
            $i++;
                    } 
            Der Unterschied zwischen dem richtigen Wort und dem beinahe richtigen ist derselbe Unterschied wie zwischen dem Blitz und einem Glühwürmchen.

            Kommentar


            • #7
              for( $f=2; $int-1>1; $f*=$int-- );
              Könntest du mir erklären was das $f*=$int-- bedeutet?

              Kommentar


              • #8
                Drösel es halt auf... es ist bloß eine mathematische Berechnung
                PHP-Code:
                $f $f $int;
                $int--; 
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  Danke für eure Antworten
                  Also eigentlich weiß ich jetzt wie es geht... Problem ist allerdings wenn ich jetzt eine bestimmte Stelle ausgeben will. Da die Ausgabe direkt in der Funktion statt findet, und ich im nach hinein nciht mehr darauf zu greifen kann.

                  PHP-Code:
                  <?php
                  function perm($pool,$result=array())
                  {
                    if(empty(
                  $pool))
                    {
                      echo 
                  implode(' ',$result).'#';
                      
                    }else
                    {
                      foreach(
                  $pool as $key => $value)
                      {
                        
                  $neuerpool    $pool;
                        
                  $neuerresult  $result;
                        
                  $neuerresult[]= $value;
                        unset(
                  $neuerpool[$key]);
                        
                  perm($neuerpool,$neuerresult);
                      }
                    }
                  }

                  $s 'abc';
                  if (
                  strlen($s) == 1) {
                  echo 
                  $s;
                  }
                  $r = array();
                  for (
                  $i 0$i strlen($s); $i++) {
                  $r[] = $s[$i] ;
                  }

                  perm($r);
                  ?>

                  Zum Beispiel hier. Die Daten werden zwar richtig ausgegeben:

                  a b c#a c b#b a c#b c a#c a b#c b a#

                  Aber was muss ich machen damit nur das erste abc ausgegeben wird, also dass ich nach der Funktion die ganzen Daten immer noch zur Verfügung habe.

                  Kommentar


                  • #10
                    @Istegelitz:

                    Jetzt wo du's sagst, fällt's mir auch auf
                    Manchmal seh ich aber auch den Wald vor lauter Bäumen nicht

                    Kommentar


                    • #11
                      Zitat von secretwz Beitrag anzeigen
                      Danke für eure Antworten
                      Also eigentlich weiß ich jetzt wie es geht... Problem ist allerdings wenn ich jetzt eine bestimmte Stelle ausgeben will. Da die Ausgabe direkt in der Funktion statt findet, und ich im nach hinein nciht mehr darauf zu greifen kann.
                      Dann ändere die Funktion oder schreibe eine zweite, die anstatt der Ausgabe eine Rückgabe macht! Junge Junge...
                      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                      Kommentar


                      • #12
                        Zitat von pfump Beitrag anzeigen
                        Könntest du mir erklären was das $f*=$int-- bedeutet?
                        Zitat von lstegelitz Beitrag anzeigen
                        Drösel es halt auf... es ist bloß eine mathematische Berechnung
                        PHP-Code:
                        $f $f $int;
                        $int--; 
                        Zitat von pfump Beitrag anzeigen
                        @Istegelitz:

                        Jetzt wo du's sagst, fällt's mir auch auf
                        Manchmal seh ich aber auch den Wald vor lauter Bäumen nicht
                        Am einfachsten versteht man das immer, wenn man sich die ausgabe ansieht. hier ein beispiel:
                        PHP-Code:
                        function fact$int )
                            {
                                if( 
                        $int<) return 1;
                                for( 
                        $f=2$int-1>1$f*=$int-- );
                                 echo 
                        $f;      
                            }


                            
                        $fact fact(strlen("abc")); 
                        Ausgabe:
                        Code:
                        6
                        PHP-Code:
                            $fact fact(strlen("abcdefghijklmnop")); 
                        Ausgabe:
                        Code:
                        20922789888000
                        PHP-Code:
                            $fact fact(strlen("abcdefghi")); 
                        Ausgabe:
                        Code:
                        362880
                        Ich denke auf einem 64MB Webspace kommt man eh nicht weiter als bis zu 6 bis 8 Zeichen wenn man die erzeugten möglichkeiten in ein array speichert.
                        Der Unterschied zwischen dem richtigen Wort und dem beinahe richtigen ist derselbe Unterschied wie zwischen dem Blitz und einem Glühwürmchen.

                        Kommentar


                        • #13
                          Darf man fragen, was das werden soll?
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            Zitat von secretwz Beitrag anzeigen
                            Zum Beispiel hier. Die Daten werden zwar richtig ausgegeben:

                            a b c#a c b#b a c#b c a#c a b#c b a#

                            Aber was muss ich machen damit nur das erste abc ausgegeben wird, also dass ich nach der Funktion die ganzen Daten immer noch zur Verfügung habe.
                            Versteh ich nicht. Meine Code liefert dir ein Array. Da kannste auslesen wie du lustig bist
                            Der Unterschied zwischen dem richtigen Wort und dem beinahe richtigen ist derselbe Unterschied wie zwischen dem Blitz und einem Glühwürmchen.

                            Kommentar


                            • #15
                              Zitat von SteiniKeule Beitrag anzeigen
                              Versteh ich nicht. Meine Code liefert dir ein Array. Da kannste auslesen wie du lustig bist
                              Welcher Code? Der von mir oder welchen meinst du? Und wenn ja wie heißt das array dann?

                              Kommentar

                              Lädt...
                              X