Kombinationsmöglichkeiten eines char Arrays berechnen



  • volkard schrieb:

    krümelkacker hat aber sowas von recht.

    Hat er eben nicht. Er wusste doch gar nicht wie ich es bei der ersten Betrachtung implementieren würde? Ich bitte mal an dieser Stelle um eine Antwort woher du wusstest wie ich es geplant habe?

    volkard schrieb:

    do weißt, was passiert, wenn man mehr als 69 elemente zum permutieren hat? du kannst die rechenzeit nicht mehr mit dem schultaschenrechner berechnen. und 69 dinge passen eigentlich meistens vielleicht schon gelegentlich auf den stack.

    Diese Begründung ist absolut Nachvollziehbar. Nachdem ich auch ein wenig rumprobiert habe, bin ich auch darauf gekommen, dass es besser und schneller geht. Wenn er so geantwortet hätte, würde es auch keinen Flame geben. Er ist wie immer der Brandherd.

    Nexus schrieb:

    Sinnlos war das garantiert nicht. Deine Aussagen werden nicht wahrer, indem du andere schlecht machst.

    Immer wieder das Problem. Er hat angefangen. Wie kommst du auf die Idee das ich ihn schlechter mache als er ist? Wieso sprichst du jetz mich an? Steht mein Post vor seinem?

    Nexus schrieb:

    Das sind drei Rekursionsebenen. Du hast in jedem komplexeren Programm die hundertfache Aufruftiefe und es stört niemanden.

    So intelligent konnte man argumentieren. Hat er aber nicht.

    xDDDD schrieb:

    darkfate schrieb:

    ...

    Klarer Fall: [SELF](OWNED)

    Komm lass gut sein krümmelkacker, hier weiß jeder dass es nur einen gibt der auf so ein Niveau sinken kann, da hilft auch kein neuer nick.

    Ich poste mal einen ersten Ansatz ohne Gewähr auch Typsicherheit/undefiniertes Verhalten und Sonstiges... damit der Thread wenigstens einen Sinn hat.

    #include <stdio.h>
    #include <string.h>
    static int t=1;
    void permutiere(char *eingabe, char *permutation);
    char *substr (const char *eingabe, int start, int laenge);
    
    int main() {
    
    	char wort[] = "AB";
    	int i,n = (int) strlen(wort);
    
    	for(i=0;i<n;i++){ 
    		char *tmpword = malloc((i+1)*sizeof(char));
    		t=0;
    		tmpword = substr(wort,0,i+1);
    		permutiere(tmpword,tmpword);
    	}
    
    	printf("Entgueltige Tiefe %i\n",t);
    	return 0;
    }
    
    void permutiere(char *eingabe, char *permutation) {
    
    	char *tausche,*selbst;
    	char tempwort;
    	t++;
    
    	if (*(permutation+1) == 0) printf("%s\n", eingabe);
    	else {
    		for(tausche = permutation; *tausche; ++tausche) {
    			for(selbst = permutation; *selbst != *tausche; ++selbst);
    			if (selbst == tausche) {
    				tempwort = *tausche;
    				*tausche = *permutation;
    				*permutation = tempwort;
    				permutiere(eingabe, permutation+1);
    				*permutation = *tausche;
    				*tausche = tempwort;
    			}
    		}
    	}
    }
    
    char *substr (const char *eingabe, int start, int laenge) {
    	char *puffer;
    	if (eingabe == NULL) return NULL;
    	if (start < 0) start = strlen (eingabe) + start;
    	if (start < 0) start = 0;
    	if (laenge < 0) laenge = 0;
    	if (start >strlen (eingabe)) start = strlen (eingabe);
    	if (laenge > strlen (&eingabe[start]))  laenge = strlen (&eingabe[start]);
    	if ((puffer= (char*) malloc (laenge + 1)) == NULL) return NULL;
    
    	memcpy (puffer, &(eingabe[start]), laenge);
    	puffer[laenge] = '\0';
    
    	return buff;
    }
    

    Ist aber wie man sieht nur rekursiv und kein C++



  • darkfate schrieb:

    volkard schrieb:

    krümelkacker hat aber sowas von recht.

    Hat er eben nicht. Er wusste doch gar nicht wie ich es bei der ersten Betrachtung implementieren würde? Ich bitte mal an dieser Stelle um eine Antwort woher du wusstest wie ich es geplant habe?

    Weil ich angenommen hatte, daß Du schlau bist. Ich fürchte, nach Deinem letzen Posting kannst Du das in Bezug auf Permutationenprogrammierung auch nicht mehr so recht leugnen. hihi. 😃
    Naja, eventuell ist dies oder jenes einen MOment zu spät oder zu früh gesagt worden, aber alles im Bereich, wie es für mich gut verständlich ist und kein Grund für rote Köpfchen 😡 . 🙂



  • Nexus schrieb:

    Bei Beispiel des Threaderstellers sind es drei Zeichen.

    Endl schrieb:

    sämtliche Kombinationsmöglichkeiten des Inhaltes eines char Arrays zu berechnen und auszugeben

    Jetzt könnte ich genau so antworten wie Krümmelkacker in seinem ersten Post mit: SO EIN QUATSCH! Ist es angenehme Antwort nachdem du sein Anliegen nicht richtig verstanden hast so wie ich im ersten Moment anscheinend keine optimale Lösung hatte? Nein ist es nicht. Da wird aber kein Wort in seine Richtung gesprochen der es permanent fast in jedem Post macht. Scheuklappen?

    Ein char Array kann auch laenger als drei Zeichen sein. Hat nirgendwo geschrieben dass es nur drei Zeichen sein sollen.



  • volkard schrieb:

    Weil ich angenommen hatte, daß Du schlau bist.

    Tja.. 🤡

    volkard schrieb:

    Ich fürchte, nach Deinem letzen Posting kannst Du das in Bezug auf Permutationenprogrammierung auch nicht mehr so recht leugnen. hihi. 😃

    Ich hatte Zorn und wollte bei dem ganzen Ärger wenigstens eine Lösung bieten damit der Fragende nicht andauernd Flame lesen muss.

    volkard schrieb:

    Naja, eventuell ist dies oder jenes einen MOment zu spät oder zu früh gesagt worden, aber alles im Bereich, wie es für mich gut verständlich ist und kein Grund für rote Köpfchen 😡 . 🙂

    Nein eben nicht. Dieser Krümmelkacker buksiert andauernd mit seinen absolut Sinnlosen kommentaren die eher Zorn als Hilfe bringen.



  • darkfate schrieb:

    volkard schrieb:

    krümelkacker hat aber sowas von recht.

    Hat er eben nicht. Er wusste doch gar nicht wie ich es bei der ersten Betrachtung implementieren würde? Ich bitte mal an dieser Stelle um eine Antwort woher du wusstest wie ich es geplant habe?

    Wen interessiert, wie du es geplant hast? Du kannst die rekursive Lösung nicht dadurch schlecht machen, dass du sie total verunstaltest.

    So intelligent konnte man argumentieren. Hat er aber nicht.

    Ich erkenne bei ihm mehr Argumentation als bei dir => eigene Nase.



  • Michael E. schrieb:

    Wen interessiert, wie du es geplant hast?

    Lies erst einmal um was es geht.

    Michael E. schrieb:

    Ich erkenne bei ihm mehr Argumentation als bei dir => eigene Nase.

    Lies doch einmal den Thread durch bevor du schreibst.

    Michael E. schrieb:

    Du kannst die rekursive Lösung nicht dadurch schlecht machen, dass du sie total verunstaltest.

    Was ist denn dass bitteschön für eine Aussage? Wo ist da der Bezug zu überhaupt irgend etwas?



  • darkfate schrieb:

    Immer wieder das Problem. Er hat angefangen. Wie kommst du auf die Idee das ich ihn schlechter mache als er ist? Wieso sprichst du jetz mich an? Steht mein Post vor seinem?

    Ich habe nirgends gesagt, dass ich krümelkackers "So ein Quatsch!" gut finde. Aber du lässt dich auch wirklich sehr leicht provozieren. Immerhin hat krümelkacker nebenbei sachlich geantwortet und dir das Problem erklärt, du solltest seinen Post nicht auf einen Flame reduzieren. Ich habe auch nicht das Gefühl, dass das "So ein Quatsch" allzu persönlich gemeint ist (auch wie ich krümelkacker vom Forum hier kenne). Bei "deine Posts sind immer sinnlos" fällt es mir hingegen schon schwerer, das zu glauben.

    Ich will damit nur sagen, dass du in Zukunft vielleicht etwas lockerer reagieren und nicht gleich alle Kritik als feindselig erachten solltest. Und Rechtfertigungen wie "er hat angefangen" hast du nun wirklich nicht nötig.



  • warum hat bisher eigtl niemand std::next_permutation vorgeschlagen?

    mindestens für die n-elementigen geht das super - für die ein- und zweielementigen(bzw nicht n-elementigen) fällt mir zugegebenermaßen keine super-tolle idee damit ein...

    bb



  • Es paßt zwar nicht mehr ganz so ins C++-Forum, und ich müßte eigentlich dichtmachen, aber ich lasse den Thread mal laufen.
    Der Fragesteller Endl kann sich ja die benötigten Informationen herausziehen.
    Zu Permutationen gibts AFAIR sigar eibnen Artikel im Magazin. http://www.c-plusplus.net/forum/viewtopic-var-t-is-178286-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html
    Hier waren nur Kombinationsmöglichkeiten gefragt, fürchte ich. Die würde ich nichtmal rekursiv machen. Das geht auch wie ein mechanischen Zählwerk http://de.wikipedia.org/w/index.php?title=Datei:Handzaehler01_clip.jpg&filetimestamp=20060614112826 irgendwie.



  • unskilled schrieb:

    warum hat bisher eigtl niemand std::next_permutation vorgeschlagen?

    Da hatten wir bis gerade Glück gehabt. Weil es nicht um die 3!=6 Permutaionen von ABC geht, sondern um die 3^3=27 Kombinationen. Um Genau zu sein, um die 3^2 zweibuchstabigen und 3^1 einbuchstabigen auch, aber das kann ein Schleifchen außenrum ja gut machen.



  • Nexus schrieb:

    Ich habe nirgends gesagt, dass ich krümelkackers "So ein Quatsch!" gut finde.

    Nutzt nichts wenn du aber nur meinen Post anmerkst. Ist nicht das erste mal übrigens.

    Nexus schrieb:

    Aber du lässt dich auch wirklich sehr leicht provozieren.

    Weil es eben wie gesagt nicht das erste mal ist. Und es ist nicht das erste mal das komischerweise keiner seinen absolut unnötigen Kommentar bemängelt.

    Nexus schrieb:

    Immerhin hat krümelkacker nebenbei sachlich geantwortet und dir das Problem erklärt,

    Super damit wäre ich glücklich. Ich habe noch nie Jemanden angepöbelt der mir sachlich kritisch geantwortet hat.

    Nexus schrieb:

    du solltest seinen Post nicht auf einen Flame reduzieren.Ich habe auch nicht das Gefühl, dass das "So ein Quatsch" allzu persönlich gemeint ist (auch wie ich krümelkacker vom Forum hier kenne).

    Wenn ich mich mit dir unterhalte und dich zwischendurch beleidige dann versuch du mal das Gespräch nicht auf die Beleidigungen zu reduzieren. Erst recht wenn es der erste Satz war.

    Nexus schrieb:

    Bei "deine Posts sind immer sinnlos" fällt es mir hingegen schon schwerer, das zu glauben.

    Geh doch seine Posts durch. Er hat eine total unverschämte Art. Wenn manch einer sich das bieten lässt ist es ok... ich nicht.

    Nexus schrieb:

    Ich will damit nur sagen, dass du in Zukunft vielleicht etwas lockerer reagieren und nicht gleich alle Kritik als feindselig erachten solltest. Und Rechtfertigungen wie "er hat angefangen" hast du nun wirklich nicht nötig.

    Wie gesagt, wenn er so reden möchte, soll er es Zuhause bei seinen Eltern/Freunden oder wem auch immer tun. Ich möchte das nicht.



  • darkfate schrieb:

    Michael E. schrieb:

    Wen interessiert, wie du es geplant hast?

    Lies erst einmal um was es geht.

    Hab ich.

    Michael E. schrieb:

    Ich erkenne bei ihm mehr Argumentation als bei dir => eigene Nase.

    Lies doch einmal den Thread durch bevor du schreibst.

    Hab ich immer noch.

    Michael E. schrieb:

    Du kannst die rekursive Lösung nicht dadurch schlecht machen, dass du sie total verunstaltest.

    Was ist denn dass bitteschön für eine Aussage? Wo ist da der Bezug zu überhaupt irgend etwas?

    Zum von mir Zitierten.

    Aber da ich weiß, dass du sowieso ein hoffnungsloser Fall bist, bin ich auch schon wieder weg 🙄



  • Das kann man intelligenter wie eine n dimenionale quadrik aufspannen, ganz ohne Rekursion.

    hier in 3D in Buchstaben:

    ABC
    ACB
    BAC
    BCA
    CBA
    CAB

    hier 3D in Koordinaten einer einfachen Ebene

    -X-----Y-----Z-
    0.0 - 1.0 - 2.0
    0.0 - 2.0 - 1.0
    1.0 - 0.0 - 2.0
    1.0 - 2.0 - 0.0
    2.0 - 1.0 - 0.0
    2.0 - 0.0 - 1.0

    Wenn man das erste Array anschaut muss man einfach nur eine Sequenz erzeugen.
    Jedes Element n-1 mal wiederholen.

    Das zweite Array beginnend mit dem zweiten Element bis zum ersten Element. Dann beginnend mit dem dritten Element bis zum ersten Element usw..

    Das dritte Element ist keines der ersten beiden.

    Nur für diese Anfangssequenz müsste man sich etwas überlegen.

    Man braucht halt drei Arrays mit n³-2n²+n Elementen. Dürfte theoretisch besser sein als andauern Rücksprungadressen auf dem Stack abzulegen. Außerdem kann man damit schön Mehrkernprozessoren auslasten.



  • darkfate, sobald in einem Post irgendeine Bemerkung kommt, siehst du rot und fängst ein Riesen-Theater an. Völlig unabhängig davon, ob dir der Benutzer auch schon geholfen hat, oder ob er dir sogar im gleichen Post wertvolle Hinweise gibt. Ausserdem siehst du sowas gerade als Anlass, selbst beleidigend zu werden und dich auf noch tieferes Niveau zu begeben. Sowas kann nicht gut gehen.

    In einem Forum führt es zu nichts, derart empfindlich zu sein. Letztes Mal hat dich krümelkacker wegen der fehlenden Eigeninitative kritisiert, und schon da hast du die Gelegenheit genutzt, um eine Metadiskussion anzufangen und ihn über eine Seite lang des Flamens zu beschuldigen. Was bringt das? Du fällst nur negativ auf und die Leute wundern sich. Falls du krümelkacker wirklich für einen Troll hältst (ich tue das nicht, er schreibt hier oft gute Beiträge), dann ignoriere ihn doch. Oder noch besser: Versuch es mit ihm persönlich zu klären, notfalls über einen Moderator. Aber veranstalte keinen öffentlichen Pranger, dabei kannst du nichts gewinnen.

    Ich hoffe, du verstehst diesen Post als guten Rat und nicht auch etwa als persönlichen Angriff.



  • Nexus schrieb:

    darkfate, sobald in einem Post irgendeine Bemerkung kommt, siehst du rot und fängst ein Riesen-Theater an.

    Ab hier ist schluss. Dass stimmt einfach nicht. Nenne mir ein einziges Beispiel wo Krümmelkacker nicht beteiligt ist.

    Nexus schrieb:

    Letztes Mal hat dich krümelkacker wegen der fehlenden Eigeninitative kritisiert, und schon da hast du die Gelegenheit genutzt, um eine Metadiskussion anzufangen und ihn über eine Seite lang des Flamens zu beschuldigen.

    Natürlich weil das absolut nicht stimmt. Ich lasse mir das auch nicht anhängen.

    Nexus schrieb:

    In einem Forum führt es zu nichts, derart empfindlich zu sein. In einem Forum führt es zu nichts

    Es ist aber auch kein Freischein andere Leute absolut zu unrecht anzupöbeln.

    Nexus schrieb:

    Du fällst nur negativ auf und die Leute wundern sich.

    Schon wieder. Wer hat zuerst angefangen zu pöbeln? Ich muss mir nicht in jedem seiner Beiträge irgendwelche Provokationen gefallen lassen.

    Nexus schrieb:

    Falls du krümelkacker wirklich für einen Troll hältst

    Er hat nur einfach keine gute Erziehung genossen. In realem Umfeld wäre es sehr unangenehm für Ihn so einen Unfug von sich zu lassen.

    Nexus schrieb:

    er schreibt hier oft gute Beiträge),

    Schließt es doch nicht aus dass er gerne Unfug schreibt.

    Nexus schrieb:

    dann ignoriere ihn doch.

    Garantiert. Solchen Leuten muss man einfach zeigen dass es nicht so weiter geht.

    Nexus schrieb:

    Oder noch besser: Versuch es mit ihm persönlich zu klären, notfalls über einen Moderator. Aber veranstalte keinen öffentlichen Pranger, dabei kannst du nichts gewinnen.

    Lies dir doch mal die letzte Konfrontation, da habe ich es auch versucht zu erklären das ich nicht nebenbei schlafe. Im Endeffekt war es sinnlos.



  • Naja da dies hier alles irgendwie ausartet und ich(dank volkard & darkfate) schon eine ungefähre Vorstellung habe wie ich mein Problem lösen werde, möchte ich allen(die nicht geflamt haben) danken und bitte um Schließung des Threads bevor es noch weiter ausartet.

    MfG Endl



  • Endl schrieb:

    Threads bevor es noch weiter ausartet.

    Huch?! Im moment ist es doch wieder ruhig?



  • darkfate schrieb:

    krümelkacker schrieb:

    ..

    Immer deine sinnlosen Beiträge.
    [...]

    Hast Du etwa nach dem "So ein Quatsch!" aufgehört zu lesen? Ich schrieb:

    krümelkacker schrieb:

    Es kommt auf die Tiefe des "Aufruf-Baums" an und nicht, wieviele "Knoten" der hat, was im übrigen auch nicht n! gewesen wäre. Die Tiefe des "Aufruf-Baums" bei so einem rekursiven Ansatz für das Aufzählen aller Kombinationsmöglichkeiten der Länge n wäre n selbst. Das ist natürlich kein Problem für den automatischen Speicher.

    Ich denke, der "Ansatz" ist von Dir gar nicht verstanden worden. Der "rekursive Ansatz" sieht so aus (falls das noch nicht klar sein sollte):

    #include <iostream>
    #include <cassert>
    
    void aufzaehlen(char* ioptr, const char* from, int sub=0)
    {
      if (!*ioptr) {
        std::cout << (ioptr-sub) << '\n';
        return;
      }
      const char* q = from;
      while (*q) {
        *ioptr = *q++;
        aufzaehlen(ioptr+1,from,sub+1);
      }
    }
    
    int main()
    {
      char puffer[] = "xxx"; // bis zu drei Zeichen ...
      char* p = puffer;
      while (*p) {
        aufzaehlen(p,"ABC"); // ... aus A,B,C
        p++;
      }
    }
    

    Wie Du feststellen kannst, ist da die Rekursionstiefe höchstens 3.

    darkfate schrieb:

    Nenne mir ein einziges Beispiel wo Krümmelkacker nicht beteiligt ist.

    ??
    Ich kann mich jetzt nur an 2 Threads erinnern, wo ich mich Dir gegenüber negativ zu Wort gemeldet habe. Das eine Mal hast Du nachgefragt, wozu das "const" hinter Elementfunktionen gut ist, was man auch alleine hätte rausfinden können und das zweite Mal heute hier, wo Du anscheinend nicht auf diese simple Lösung gekommen bist und etwas von Rekursionstiefe n! erzählen wolltest.

    kk



  • Endl schrieb:

    möchte ich allen(die nicht geflamt haben) danken und bitte um Schließung des Threads bevor es noch weiter ausartet.

    Vielen Dank. Wir Mods haben bei sowas immer das Problem, ob wir einen Thread abwürgen, was zwar den Streit (kurzfristig) beendet, aber dem Fragesteller unter Umständen die Lösung entzieht. Jetzt weiß jeder Mod, daß er schließen kann. Nett von Dir. Ich werde auch den Thread nicht nur schließen, sondern sogar ganz löschen, weil er doch ein wenig zu weit danebengeht. Aber noch hoffe ich, daß die Kombattanten sich einigen. Nicht wundern, wenn der Thread plötzlich weg ist.

    Endl schrieb:

    Naja da dies hier alles irgendwie ausartet und ich(dank volkard & darkfate) schon eine ungefähre Vorstellung habe wie ich mein Problem lösen werde,

    Ich würde empfehlen, daß Du nochmal einen Thread startest, in dem Du explizit nach einer Lösung fragst für das Alphabet "ABCDEF" und nur alle achtbuchstabigen Kombinationen. (Kein Witzt, da steckt algorithmisch noch ein Klassiker drin, der saulecker ist.)



  • krümelkacker schrieb:

    Hast Du etwa nach dem "So ein Quatsch!" aufgehört zu lesen?

    Ja weil es überflüssig war. Es geht auch anders.

    krümelkacker schrieb:

    Ich denke, der "Ansatz" ist von Dir gar nicht verstanden worden. Der "rekursive Ansatz" sieht so aus (falls das noch nicht klar sein sollte)

    Super! Damit wäre ich glücklich. Ich bin kein Programmierer ich hatte keine C/C++ Vorlesung. Gönne mir Fehler!

    krümelkacker schrieb:

    Ich kann mich jetzt nur an 2 Threads erinnern, wo ich mich Dir gegenüber negativ zu Wort gemeldet habe.

    Da haben wir doch schon eins. Du weißt ja, negative Dinge brennen sich sehr einfach ins Gedächtnis. Ich bin eben auf der Suche sogar auf sinnvolle Antworten von dir auf meine Fragen gestoßen. Die hatte ich wohl zuvor im Zorn verdrängt.

    krümelkacker schrieb:

    was man auch alleine hätte rausfinden können

    Es ging darum ob man sich die übrigen const in den Argumenten sparen könnte wenn man hinter die Memberfunktion ein const hat. Die Antwort war nein, das const hinter der Memberfunktion gilt nur für this->Pointer. Dafür habe ich einen ganzen Tag suchen müssen bevor nach vielen Vorwürfen der Untätigkeit der richtige Tipp kam. Total unnötig. Diese schnelle Knappe Antwort von 10sec Aufwand hätte mir die frustrierende Suche erspart.
    Alleine wäre ich sicherlich auch nach zwei Tagen nicht drauf gekommen weil ich nach einer anderen Form von Antwort gesucht habe. Zu meiner Frustration kamst auch noch du und behauptest ich sei zu faul selber zu suchen. Ich habe es ja versucht zu erklären aber es war fruchtlos.

    krümelkacker schrieb:

    und das zweite Mal heute hier, wo Du anscheinend nicht auf diese simple Lösung gekommen bist und etwas von Rekursionstiefe n! erzählen wolltest.

    Es ist nunmal so das man eine Lösung unendlich kompliziert gestalten kann. Ich habe, ohne viel Zeit dafür zu investieren, schnell eine Skizze gemacht und bin auf eine Tiefe von n! gekommen, dafür konnte ich im Moment nichts. Keine gute Lösung, aber auch kein Grund mich so anzufahren. Weil ich mich schon mit einer anderen/besseren Lösung beschäftigt habe (steht irgendwo oben), ließ ich kurz ein Kommentar los damit er sieht das man seine Frage zur Kenntnis genommen hat. Damit hatte er auch eine Richtung in die er schonmal anfangen könnte.


Anmelden zum Antworten