<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kombinationsmöglichkeiten II]]></title><description><![CDATA[<p>Hey,</p>
<p>Da mir volkard in meinem letzten Thread dazu geraten hat einen Neuen aufzumachen, tue ich das jetzt.</p>
<p>Diesmal aber mit dem eigentlichen Problem.<br />
Ich habe z.B.folgendes Array:</p>
<pre><code class="language-cpp">char set[] = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890&quot;;
</code></pre>
<p>Jetzt möchte ich aus diesem Array sämtliche Kombinationsmöglichkeiten für Strings berechnen und zwar mit der Länge 1-10.</p>
<pre><code>Also:
A
B
..
AA
BB
AB
..
AAAABC2FsK
usw.
</code></pre>
<p>Und bevor jetzt jemand sagt dass es ziemlich viele davon gibt(ca. 1,527375914832281763277376583922*e^6223 Möglichkeiten)</p>
<p>und diese sehr viel Speicherplatz fressen würden wenn ich sie in eine TXT schreibe, ich weiß das, ich habe etwas anderes damit vor.</p>
<p>PS: bitte diesmal kein geflame wer wann mit was angefangen hat</p>
<p>//EDIT: Mir ist desweiteren klar dass es genug Wordlists und Rainbowtables im Net gibt.. diese lösen mein Problem aber leider nicht.</p>
<p>MfG Fury</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269666/kombinationsmöglichkeiten-ii</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 00:18:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269666.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Jun 2010 10:16:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 10:28:19 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>Da mir volkard in meinem letzten Thread dazu geraten hat einen Neuen aufzumachen, tue ich das jetzt.</p>
<p>Diesmal aber mit dem eigentlichen Problem.<br />
Ich habe z.B.folgendes Array:</p>
<pre><code class="language-cpp">char set[] = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890&quot;;
</code></pre>
<p>Jetzt möchte ich aus diesem Array sämtliche Kombinationsmöglichkeiten für Strings berechnen und zwar mit der Länge 1-10.</p>
<pre><code>Also:
A
B
..
AA
BB
AB
..
AAAABC2FsK
usw.
</code></pre>
<p>Und bevor jetzt jemand sagt dass es ziemlich viele davon gibt(ca. 1,527375914832281763277376583922*e^6223 Möglichkeiten)</p>
<p>und diese sehr viel Speicherplatz fressen würden wenn ich sie in eine TXT schreibe, ich weiß das, ich habe etwas anderes damit vor.</p>
<p>PS: bitte diesmal kein geflame wer wann mit was angefangen hat</p>
<p>//EDIT: Mir ist desweiteren klar dass es genug Wordlists und Rainbowtables im Net gibt.. diese lösen mein Problem aber leider nicht.</p>
<p>MfG Fury</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918802</guid><dc:creator><![CDATA[The_Fury]]></dc:creator><pubDate>Tue, 29 Jun 2010 10:28:19 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 11:01:16 GMT]]></title><description><![CDATA[<p>Es gibt doch genügend Passwortlisten im Internet die sogar gezippt mehrere Gigabytes groß sind. Da sind auch Sonderzeichen dabei.</p>
<p>Für 1-10 müsste mein geposteter Algorithmus locker langen.</p>
<p>Ich ziehe mal den ersten rekursiven Ansatz hier rüber:</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
static int t=1;
void permutiere(char *eingabe, char *permutation);
char *substr (const char *eingabe, int start, int laenge);

int main() {

	char wort[] = &quot;AB&quot;;
	int i,n = (int) strlen(wort);

	for(i=0;i&lt;n;i++){ 
		char *tmpword = malloc((i+1)*sizeof(char));
		t=0;
		tmpword = substr(wort,0,i+1);
		permutiere(tmpword,tmpword);
	}

	printf(&quot;Entgueltige Tiefe %i\n&quot;,t);
	return 0;
}

void permutiere(char *eingabe, char *permutation) {

	char *tausche,*selbst;
	char tempwort;
	t++;

	if (*(permutation+1) == 0) printf(&quot;%s\n&quot;, 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 &lt; 0) start = strlen (eingabe) + start;
	if (start &lt; 0) start = 0;
	if (laenge &lt; 0) laenge = 0;
	if (start &gt;strlen (eingabe)) start = strlen (eingabe);
	if (laenge &gt; strlen (&amp;eingabe[start]))  laenge = strlen (&amp;eingabe[start]);
	if ((puffer= (char*) malloc (laenge + 1)) == NULL) return NULL;

	memcpy (puffer, &amp;(eingabe[start]), laenge);
	puffer[laenge] = '\0';

	return buff;
}
</code></pre>
<p>Hier ein nicht rekursiver Ansatz:<br />
Das kann man intelligenter wie eine n dimenionale quadrik aufspannen, ganz ohne Rekursion.</p>
<p>hier in 3D in Buchstaben:</p>
<p>ABC<br />
ACB<br />
BAC<br />
BCA<br />
CBA<br />
CAB</p>
<p>hier 3D in Koordinaten einer einfachen Ebene</p>
<p>-X-----Y-----Z-<br />
0.0 - 1.0 - 2.0<br />
0.0 - 2.0 - 1.0<br />
1.0 - 0.0 - 2.0<br />
1.0 - 2.0 - 0.0<br />
2.0 - 1.0 - 0.0<br />
2.0 - 0.0 - 1.0</p>
<p>Wenn man das erste Array anschaut muss man einfach nur eine Sequenz erzeugen.<br />
Jedes Element n-1 mal wiederholen.</p>
<p>Das zweite Array beginnend mit dem zweiten Element bis zum ersten Element. Dann beginnend mit dem dritten Element bis zum ersten Element usw..</p>
<p>Das dritte Element ist keines der ersten beiden.</p>
<p>Nur für diese Anfangssequenz müsste man sich etwas überlegen.</p>
<p>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.</p>
<p>Ein dritter Ansatz ist einfach eine Sequenz zu erzeugen die folgendes Berücksichtigt:<br />
ABC - ABC<br />
<strong>A</strong>CB - A<strong>C</strong>B<br />
B<strong>A</strong>C - BA<strong>C</strong><br />
<strong>B</strong>C<strong>A</strong> - B<strong>C</strong>A<br />
C<strong>B</strong>A - <strong>C</strong>BA<br />
CA<strong>B</strong> - <strong>C</strong>AB</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918807</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Tue, 29 Jun 2010 11:01:16 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 10:34:25 GMT]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-178286.html" rel="nofollow">Artikel über Permutationen</a> inkl. passender Lösung in C++.</p>
<blockquote>
<p>Ich ziehe mal den ersten rekursiven Ansatz rüber:</p>
</blockquote>
<p>Es war C++ gefragt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918812</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Tue, 29 Jun 2010 10:34:25 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 10:48:03 GMT]]></title><description><![CDATA[<p>Nukularfüsiker schrieb:</p>
<blockquote>
<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-178286.html" rel="nofollow">Artikel über Permutationen</a> inkl. passender Lösung in C++.</p>
<blockquote>
<p>Ich ziehe mal den ersten rekursiven Ansatz rüber:</p>
</blockquote>
<p>Es war C++ gefragt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Kann man ja noch gerne umschreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Eine andere Lösung als Rekursiv und bereits vorhandene Lösungen wäre auch mal wieder schön.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918820</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Tue, 29 Jun 2010 10:48:03 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 11:18:15 GMT]]></title><description><![CDATA[<blockquote>
<p>ca. 1,527375914832281763277376583922*e^6223 Möglichkeiten</p>
</blockquote>
<p>Nein, es gibt 853'058'371'866'181'866 Moeglichkeiten. Also etwa 10^24. Aber irgendwo musst du sie ja speichern, wenn du damit was machen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918835</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 29 Jun 2010 11:18:15 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 11:06:30 GMT]]></title><description><![CDATA[<p>The_Fury schrieb:</p>
<blockquote>
<pre><code class="language-cpp">char set[] = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890&quot;;
</code></pre>
<p>Jetzt möchte ich aus diesem Array sämtliche Kombinationsmöglichkeiten für Strings berechnen und zwar mit der Länge 1-10.</p>
</blockquote>
<p>Wenn Du <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-269629-and-start-is-20.html#1918641" rel="nofollow">hier</a> &quot;xxx&quot; durch &quot;xxxxxxxxxx&quot; ersetzt und &quot;ABC&quot; durch &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890&quot; ersetzt, dann macht das Programm dort genau das, was Du willst -- abgesehen von der Reihenfolge. Zunächst werden alle 10-stellingen Kombis generiert, dann die 9-stellingen, u.s.w. Aber das solltest Du ohne Probleme umdrehen können.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22362">@darkfate</a>: Es geht hier nicht um Permutationen.</p>
<p>@knivel: also etwa 10^18</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918841</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 29 Jun 2010 11:06:30 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 11:22:10 GMT]]></title><description><![CDATA[<p>Aehm, ja 3*6 = 18. im uebrigen favorisieren ich meine Loesung in Haskell von <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-269629-and-postdays-is-0-and-postorder-is-asc-and-start-is-20.html" rel="nofollow">hier</a>. C oder C++ ist dafuer denkbar ungeeignet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918847</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 29 Jun 2010 11:22:10 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 11:38:22 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>C oder C++ ist dafuer denkbar ungeeignet.</p>
</blockquote>
<p>Ich finde es gibt für Berechnungen nichts besseres als C/C++ weil es die einzige Sprache ist, für die es GPGPU Interface für alle Grafikkarten gibt.</p>
<p>Für diese Aufgabe sind acht Threads eines üblichen i7 Quads zu wenig.<br />
Dauert einfach zu lang.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918857</guid><dc:creator><![CDATA[darkfate]]></dc:creator><pubDate>Tue, 29 Jun 2010 11:38:22 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 12:05:48 GMT]]></title><description><![CDATA[<p>knivil: wie kommst du auf 10^24? das wären dann die Möglichkeiten allein für 10 stellige Strings bei einem Array mit der Größe 24, soweit ich weiß.<br />
Zur Speicherung: ich will das Ganze nirgendwo Speichern sondern die Ketten zur Laufzeit ausarbeiten, sobald das funktioniert werde ich dann voraussichtlich eine Funktion Implementieren in der das Ganze dann schon berechnet und verschlüsselt steht(will eine Art MD5/MD4/SHA1/usw Cracker programmieren(nein ich habe damit nichts 'böses' vor ich mach das nur um mich weiterzubilden)).</p>
<p>Ansonsten möchte ich mich recht herzlich für die schnelle Hilfe bedanken, habe mein Problem gelöst indem ich eure Sources als Vorlage verwendet habe.</p>
<p>//Edit: darkfate: genau das habe ich vor <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>MfG Fury</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918878</guid><dc:creator><![CDATA[The_Fury]]></dc:creator><pubDate>Tue, 29 Jun 2010 12:05:48 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 12:24:12 GMT]]></title><description><![CDATA[<blockquote>
<p>wie kommst du auf 10^24?</p>
</blockquote>
<p>Ich komme auf 10^18 und zwar durch den Hinweis &quot;Länge 1-10&quot;. Dein Pool &quot;ABCDE..90&quot; hat 62 Zeichen. Es gibt 62 Moeglichkeiten fuer Woerter der Laenge 1, 62*62 Moeglichkeiten der Laenge 2, 62^3 Moeglichkeiten der Laenge 3, .. 62^10 Moeglichkeiten der Laenge 10. Addiert man diese, so komme ich auf eben diese Zahl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918886</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 29 Jun 2010 12:24:12 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 14:29:53 GMT]]></title><description><![CDATA[<p>Viel Spaß beim Warten auf das Ergebnis:</p>
<pre><code class="language-cpp">#include &quot;stdio.h&quot;
#include &quot;string.h&quot;

void Fill(char* str, const char* szCharSet, size_t iPos, size_t iMaxLen)
{
	if (iPos==iMaxLen)
	{
		str[iMaxLen] = 0;
		puts(str);
		return;
	}

	// add each possible character
	for (size_t i=0, iChars=strlen(szCharSet); i&lt;iChars; ++i)
	{
		str[iPos] = szCharSet[i];
		// Do the same for the remaining positions
		Fill(str,szCharSet,iPos+1,iMaxLen);
	}
}

void Fill(const char* szCharSet, size_t iMaxLen)
{
	char* szWork = new char[iMaxLen+1];
	for (size_t  iLen=1; iLen&lt;=iMaxLen; ++iLen)
		Fill(szWork,szCharSet,0,iLen);
	delete [] szWork;
}

int _tmain(int argc, _TCHAR* argv[])
{
	const size_t MAX_LEN = 10;
	const char CHARSET[] = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890&quot;;

	Fill(CHARSET,MAX_LEN);
	return 0;
}
</code></pre>
<p>Rekursionstiefe maximal 10.<br />
Anzahl 62<sup>1+62</sup>2+62<sup>3+...+62</sup>10 = ca. 8,53*10^17</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918892</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 29 Jun 2010 14:29:53 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 14:24:38 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<pre><code class="language-cpp">...
</code></pre>
</blockquote>
<p>Die ist aber hübsch. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918971</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 29 Jun 2010 14:24:38 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 16:38:34 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Ich habe so ziemlich das gleiche gemacht für eine rekursive Lösung. Wollte es eigentlich gestern mal noch posten, aber da volkard angedroht hat den alten Thread zu löschen habe ich es gelassen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Habs Heute nochmal (zwecks Syntaxübung) auch mal noch in Eiffel gemacht, aber es nicht gwagt das mal mit einem grösseren Quelle als 3 zu testen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Ich habe lediglich den Teil mit den führenden Leerzeichen wahrscheinlich umständlicher gemacht. War doch ein wenig umständlicher, als ich gedacht habe. Habe mir das eher als 5-10 Zeiler vorgestellt mit einer Rekursiven Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919009</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 29 Jun 2010 16:38:34 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Tue, 29 Jun 2010 17:26:30 GMT]]></title><description><![CDATA[<p>ohne Rekursion, ohne max länge, mit C++:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;cstddef&gt;

template&lt;typename T&gt;
void brute_force( const T* const pool_beg, std::size_t length )
{
    const T* const pool_end = pool_beg + length;
    std::vector&lt;const T*&gt; position;
    std::vector&lt;T&gt; current_combination;

    for(;;) //alternativ eine maximale länge als abbruchbedingung
    {
        typename std::vector&lt;T&gt;::size_type j = 0;

        for(; j != current_combination.size(); ++j)
        {
            ++position[j];
            if(position[j] != pool_end )
            {
                current_combination[j] = *position[j];
                break;
            }
            else
            {
                position[j] = pool_beg;
                current_combination[j] = *pool_beg;
            }
        }
        if(j == current_combination.size())
        {
            position.push_back(pool_beg);
            current_combination.push_back(*pool_beg);
        }

        //ausgeben oder was auch immer von current_combination
    }
}

#include &lt;string&gt;

int main()
{
    std::string pool = &quot;ABC&quot;;
    brute_force(&amp;pool[0], pool.size());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1919024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919024</guid><dc:creator><![CDATA[warum nicht so?]]></dc:creator><pubDate>Tue, 29 Jun 2010 17:26:30 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Wed, 30 Jun 2010 06:59:59 GMT]]></title><description><![CDATA[<p>Und noch einer, nicht rekursiv mit einfachen Datentypen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<pre><code class="language-cpp">#include &quot;stdio.h&quot;
#include &quot;string.h&quot;

void Fill2(const char* szCharSet, size_t iMaxLen)
{
	size_t iChars=strlen(szCharSet);

	// buffer to build and buffer to track permutation count
	char* szWork = new char[iMaxLen+1];
	size_t *aUsage = new size_t[iMaxLen];
	// Just init with the start combination (position 0)
	for (size_t i=0; i&lt;iMaxLen; ++i)
		szWork[i] = szCharSet[aUsage[i] = 0];
	szWork[iMaxLen] = 0;

	for (;;) 
	{
		// Output current combination (may be the first)
		puts(szWork);

		// get next iteration (start at end)
		size_t iPos;
		for (iPos=iMaxLen; iPos; iPos--)
		{
			szWork[iPos-1] = szCharSet[++aUsage[iPos-1&rsqb;&rsqb;;
			if (aUsage[iPos-1]&lt;iChars)
				break;
			else
				// Need to change previous position, so reset current
				szWork[iPos-1] = szCharSet[aUsage[iPos-1] = 0];	
		}

		// reached the end (overflow)
		if (iPos==0)
			break;
	}

	delete [] szWork;
	delete [] aUsage;
}

void Fill(const char* szCharSet, size_t iMaxLen)
{
	for (size_t  iLen=1; iLen&lt;=iMaxLen; ++iLen)
		Fill2(szCharSet,iLen);
}

int _tmain(int argc, _TCHAR* argv[])
{
	const size_t MAX_LEN = 10;
	const char CHARSET[] = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890&quot;;
	Fill(CHARSET,MAX_LEN);
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1919218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919218</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 30 Jun 2010 06:59:59 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Wed, 30 Jun 2010 08:41:03 GMT]]></title><description><![CDATA[<p>@warum nicht so?: Warum uebergibst du die maximale Laenge nicht als Parameter? Endlosschleifen sind nicht so der Bringer.</p>
<p>Im uebrigen vermisse ich eine Iteratorloesung. Ein einfaches ++ sollte dann zur naechsten Kombination fuehren. Das waehre auch sinnvoll, wenn man nicht alle Moeglichkeiten generieren will, sondern sie nach und nach bearbeiten moechte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919279</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 30 Jun 2010 08:41:03 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Wed, 30 Jun 2010 12:39:54 GMT]]></title><description><![CDATA[<p>Mir war grad langweilig. Noch eine iterative Version:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;

using std::vector;
using std::string;

void next(vector&lt;int&gt; &amp; v, int base)
{
  unsigned pos = 0;
  while (pos&lt;v.size()) {
    if (++v[pos] &lt; base) return;
    v[pos++] = 0;
  }
  v.push_back(0);
}

void print(vector&lt;int&gt; const&amp; v, string const&amp; cset)
{
  for (unsigned i=v.size(); i--&gt;0;) {
    std::cout &lt;&lt; cset[v[i&rsqb;&rsqb;;
  }
  std::cout &lt;&lt; '\n';
}

int main()
{
  const string cset = &quot;ABC&quot;;
  const unsigned maxlen = 3;
  const unsigned base = cset.size();
  vector&lt;int&gt; x;
  for (;;) {
    next(x,base);
    if (x.size()&gt;maxlen) break;
    print(x,cset);
  }
}
</code></pre>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1919424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919424</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 30 Jun 2010 12:39:54 GMT</pubDate></item><item><title><![CDATA[Reply to Kombinationsmöglichkeiten II on Wed, 30 Jun 2010 15:02:18 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<p>Und noch einer, nicht rekursiv mit einfachen Datentypen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Für die einfachen Datentypen kannst du das template ja spezialisieren.</p>
<p>knivil schrieb:</p>
<blockquote>
<p>@warum nicht so?: Warum uebergibst du die maximale Laenge nicht als Parameter? Endlosschleifen sind nicht so der Bringer.<br />
Im uebrigen vermisse ich eine Iteratorloesung. Ein einfaches ++ sollte dann zur naechsten Kombination fuehren. Das waehre auch sinnvoll, wenn man nicht alle Moeglichkeiten generieren will, sondern sie nach und nach bearbeiten moechte.</p>
</blockquote>
<p>Das Problem beim Durchiterieren ist, dass man bei jeder &quot;Stelle&quot; der kombination checken muss, an welchem Ort im Pool sie gerade steht. In meiner Funktion speichere ich das in Positions.<br />
Ein iterativer Ansatz sähe so aus (jetzt lexikalisch korrekt):</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;cstddef&gt;

template&lt;typename T&gt;
bool generate_next_combination(const T* pool_beg,
                               std::size_t length,
                               std::vector&lt;T&gt;&amp; current_combination,
                               std::size_t max_length)
{
    int j = current_combination.size()-1;

    for(; j &gt;= 0; --j) //rückwärts für lexikalische Richtigkeit
    {
        for(typename std::vector&lt;T&gt;::size_type i = 0; i != length; ++i)
        {
            if(current_combination[j] == pool_beg[i])
            {
                if(i+1 != length)
                {
                    current_combination[j] = pool_beg[i+1];
                    return true;
                }
                else
                    current_combination[j] = *pool_beg;
            }
        }
    }
    if(j &lt; 0)
    {
        if(current_combination.size()==max_length)
            return false; //vll vector noch clearen
        current_combination.insert(current_combination.begin(),*pool_beg); //neues element vorne hinzufügen. Vll anderer Container als vector
    }
    return true;
}

#include &lt;string&gt;
#include &lt;iostream&gt;

int main()
{
    std::string pool = &quot;10&quot;;
    std::string start_key = &quot;100&quot;;
    std::vector&lt;char&gt; key (start_key.begin(), start_key.end());

    std::sort(pool.begin(), pool.end());
    //std::unique(pool.begin(), pool.end());

    while( generate_next_combination( &amp;pool[0], pool.size(), key, 4 ) )
        std::cout&lt;&lt;std::string(key.begin(), key.end())&lt;&lt;std::endl;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1919527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1919527</guid><dc:creator><![CDATA[warum nicht so?]]></dc:creator><pubDate>Wed, 30 Jun 2010 15:02:18 GMT</pubDate></item></channel></rss>