Algorithmus

Hallo,

ich habe z.B. 2 Zeichen (Anzahl nach oben offen). 1 Zeichen kann 13 Werte annehmen. Nun soll der Algorithmus alle 169 Möglichkeiten (Kombinationen) ausgeben. Also immer entsprechend der Anzahl.

Lösen möchte ich das in C#. Die Ausgabe soll in Blöcken je 13 Zeilen gemacht werden. Bevor eine Zeile ausgegeben wird, soll sie in einen string zwischengespeichert werden.

Hat jemand eine Lösung, ein Gerüst, oder irgendeinen Ansatz für mich für dieses Problem?

Grüße Roman

Hallo,

bei weniger als 27 verschiedenen Werten je Zeichen kann man zur Ausgabe schlicht Buchstaben verwenden (bei weniger als 53 könnte man Groß- und Kleinbuchstaben unterscheiden, u.U. kann man auch noch die lateinischen Ziffern etc hinzunehmen).

Einen Wert W zwischen 1 und 13 kannst du dann einfach in das ASCII-Zeichen 64 + W übersetzen. Die Kombination der Werte 5 und 12 wäre dann zB. „EL“.

Zur Ausgabe aller Kombinationen von Zeichen aus der Menge 1…N (N ist in Deinem Bsp 13) der beliebigen Länge L (bei Dir: 2 oder mehr) würde ich eine Rekursion vorschlagen. Der Rekursionsfunktion wird die bis dahin erstellte Zeichenkette übergeben. Die Funktion durchläuft dann eine Schleife von 1…N, in der das nächste Zeichen angehängt wird. Für jedes angehängte Zeichen ruft sich die Funktion rekursiv auf. Abbruchbedingung ist, dass die übergebene Zeichenkette die Länge L erreicht hat. Dann wird sie ausgegeben. Man kann einen globalen Zähler für jede Ausgabe mitzählen und immer eine Leerzeile zusätzlich ausgeben, wenn der Zähler ohne Rest durch L teilbar ist.

LG
Jochen

Hallo,

eigentlich ganz einfach. Ich habe da schnell mal was zusammengeschrieben.

Um die blockweise Ausgabe musst Du Dich noch selbst kümmern - aber das ist extrem tivial.


using System;
using System.Collections.Generic;
using System.Text;

namespace FacilityGenerator
{
 class Program
 {
 private static void GenerateFacilitiesSub(List ResultList, string Root, int NumberOfChars, char[] CharArray)
 {
 foreach (char singleChar in CharArray)
 {
 if (Root.Length + 1 GenerateFacilities(int NumberOfChars, char[] CharArray)
 {
 List result = new List();

 foreach (char singleChar in CharArray)
 GenerateFacilitiesSub(result, singleChar.ToString(), NumberOfChars, CharArray);

 return result;
 }

 static void Main(string[] args)
 {

 List AllFacilities;
 AllFacilities = GenerateFacilities(2, new char[] { 'A', 'B' });

 foreach (String facility in AllFacilities)
 Console.WriteLine(facility);

 Console.ReadLine();

 }
 }
}

Grüße
Thorsten

Hallo Thorsten,

Danke für deinen Code. Leider kann ich mit ihm nichts anfangen. Ich hatte mir etwas einfachers erhofft. Ich werde vielleicht doch noch was eigenes versuchen und dir dann das mailen.

Grüße Roman

Hallo Jochen,

Danke auch für deine Hilfe. Bei dir bin ich etwas weitergekommen. Mir ist eine Bsp. eingefallen:

00
01
10
11

Letzter Wert wechselt immer. Vorletztes Zeichen kommt immer doppelt, das davor vierfach…

Bei mir kommen die 13 Werte für das letzte Zeichen immer von 1-13, 1-13… Die vorletzte Position, da kommt jeder Wert 13 mal direkt hintereinander…

Grüße Roman

Moien

Danke für deinen Code. Leider kann ich mit ihm nichts
anfangen.

Was er geschrieben hat ist die generische, an alle möglichen Zeichenfolgen und Zeichentypen automatisch anpassbare Lösung. Das ist an sich die „gute“ Lösung und die sollte man auch verstehen.

Die simple, nicht generische Lösung für schreibfaule ist (pseudo-Code):

char[] chars = {"A","B","C",...}
for (i=0;i

Wer stellt euch eigentlich solche Hausaufgaben?

cu

Hi Roman,

Danke auch für deine Hilfe. Bei dir bin ich etwas
weitergekommen. Mir ist eine Bsp. eingefallen:
00
01
10
11
Letzter Wert wechselt immer.

ja.

Vorletztes Zeichen kommt immer doppelt, das davor vierfach…

Wie, wo, watt? Für mich nicht ersichtlich was du da meinst.

Bei mir kommen die 13 Werte für das letzte Zeichen immer von
1-13, 1-13… Die vorletzte Position, da kommt jeder Wert 13
mal direkt hintereinander…

*hmmh*, klären wir das erstmal anhand des Vierzeilers oben, vielleicht verstehe ich dann was du damit meinen könntest.

Gruß
Reinhard

Hi,

Wer stellt euch eigentlich solche Hausaufgaben?

genau die Leute, die dafür verantwortlich sind, dass ich solche „Schüler“ einer kompletten Gehirnwäsche unterziehen darf, wenn sie hier eingestellt werden…

Gruss,
Herb

Hallo,

nun muss ich doch mit der Wahrheit rausrücken :smiley: Also ich habe mir eine kleines Proggi gemacht, was in einem Wort ungerade Buchstaben (im Alphabet) nach „A“ umwandelt und alle geraden Buchstaben zu „B“. Klar nun, warum ausgerechnet 13 Werte… Nun dachte ich, du musst das ja nun zurück auch können… Leider fehlte mir der passende Anstoß… Das Projekt ist reine Freizeitaktivität, also Hobby.

Hallo Reinhard,

Jedes Zahlensystem hat für ein Zeichen einen Maximalwert, dann gibts nen Übertrag… das ist mir nun nochmal in Erinnerung gekommen.

Nun das Beispiel und mein „Problem“:

Die letzte Spalte bringt immer 010101010101… die vorletzte immer 001100110011…

Die letzte Spalte bringt immer ACEGIKLMOQSUWY oder BDFHJHJLNPRTVXZ…
die vorletzte immer z.B. AAAAAAAAAAAAACCCCCCCCCCCCEEEEEEEEEEEE…

Grüße Roman

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moien

nun muss ich doch mit der Wahrheit rausrücken :smiley: Also ich
habe mir eine kleines Proggi gemacht, was in einem Wort
ungerade Buchstaben (im Alphabet) nach „A“ umwandelt und alle
geraden Buchstaben zu „B“.

So weit, so klar.

Nun dachte ich, du musst das ja nun zurück auch
können…

Dann hab ich die ursprüngliche Frage nicht verstanden.

Das kann nicht verlustfrei gehen. Du schmeisst ja 13 Werte zusammen in einen Topf. Welcher Wert es ursprünglich war ist danach nicht mehr ermittelbar.

Was möglich wäre ist ein T9-Ansatz, wie es Handies nutzen => http://de.wikipedia.org/wiki/Text_on_9_keys . Aber dann muss man wissen welche Sprache es war… usw.

Der Algo dahinter ist komplex, aber nur wenn man in den Grenzen eines Handies arbeitet. Auf PC wäre sowas mit einer SQL-DB relativ einfach machbar.

cu

Hallo,

Hat jemand eine Lösung, ein Gerüst, oder irgendeinen Ansatz
für mich für dieses Problem?

Muß es denn in C# sein? In Perl ist das zum Beispiel
schon eingebaut, das sähe so aus:

 # Erzeugen
 my @strings = glob "{A,B,C,D,E,F,G,H,I,J,K,L,M}" x 2 ;
 
 # Ausgeben
 print "$\_\n" for @strings;
 
 # Resultat:
 # AA
 # AB
 # AC
 # ..
 # MM
 # (169 Zeilen)

Letztlich ist es simple Kombinatorik. Welche Lösung
hast Du denn bisher?

Grüße

CMБ

Hallo,

Dann hab ich die ursprüngliche Frage nicht verstanden.

Das kann nicht verlustfrei gehen. Du schmeisst ja 13 Werte
zusammen in einen Topf. Welcher Wert es ursprünglich war ist
danach nicht mehr ermittelbar.

stimmt, dass soll auch sinn der sache sein. nur möchte ich halt alle möglichkeiten ausgegeben haben. sonst könnt ich ja das ja eins zu eins machen… ich habe auch ne idee, dass dann etwas z.b. in AACBBBCAAABB o.ä codiert wird, aber das wollte ich bewusst hier raushalten :smile:der string vor der ausgabe soll dazu dienen ihn auf muster/worte zu untersuchen.