Phreak93 Geschrieben 23. November 2010 Geschrieben 23. November 2010 So mein Problem ist dieses: Ich möchte ein Programm haben, bei dem man ein Wort eingibt (z.B. Jacke), das Programm soll dann alle Buchstaben, bis auf den ersten und letzten Zufällig vertauschen, also diese: Jacke dann ganze sollte dann halt zum Beispiel so aussehen: Jcake ... Mein Ansatz ist dieser: Random r = new Random(); string str; Console.WriteLine("Bitte geben sie ein Wort ein:"); str = Console.ReadLine(); Char[] Array = str.ToCharArray(); for(int i = 1; i < Array.Length -1; i++) { } Console.Write(str); Console.Write("\n\nTaste für Ende..."); Console.ReadKey(); Ich komm halt bei dem (zufälligen) Vertauschen von dem Buchstaben im Wort nicht weiter... Ich hoffe mir kann jemand helfen ... Thx schonmal im vorraus Zitieren
Klotzkopp Geschrieben 23. November 2010 Geschrieben 23. November 2010 C oder C++ ist das aber nicht, sieht eher nach C# aus. Ist das beabsichtigt? Zitieren
Phreak93 Geschrieben 23. November 2010 Autor Geschrieben 23. November 2010 Oo stimmt sry da haste recht ... -.- ähm kann ich das selbst verschieben ? wenn ja wie ?^^ und sonst an den mod pls einmal verschieben sry nochmal ^^ Zitieren
Phreak93 Geschrieben 23. November 2010 Autor Geschrieben 23. November 2010 (bearbeitet) sry war doppelpost Bearbeitet 23. November 2010 von Phreak93 doppelpost ... Zitieren
.NETter Geschrieben 24. November 2010 Geschrieben 24. November 2010 Hi, vielleicht hilft Dir dieser Link: C# Anagram Method Gruß, Thomas Zitieren
NerdonRails Geschrieben 24. November 2010 Geschrieben 24. November 2010 Mein Ansatz wäre: public class NameObfuscator { public String Obfuscate(String stringToObfuscate) { String result = String.Empty; Char firstChararcter = this.ExtractFirstChar(stringToObfuscate); Char lastCharacter = this.ExtractLastChar(stringToObfuscate); IEnumerable<Char> charactersInBetween = this.ExtractCharactersInBetween(stringToObfuscate, firstChararcter, lastCharacter); IEnumerable<Char> randomizedCharactersInBetween = this.RandomizeCharacters(charactersInBetween); result = this.ConstructResultString(firstChararcter, lastCharacter, randomizedCharactersInBetween); return result; } private IEnumerable<Char> ExtractCharactersInBetween(String stringToObfuscate, Char firstChararcter, Char lastCharacter) { IEnumerable<Char> charactersInBetween = from current in stringToObfuscate where current != firstChararcter && current != lastCharacter select current; return charactersInBetween; } private Char ExtractFirstChar(String stringToObfuscate) { return (from current in stringToObfuscate select current).FirstOrDefault(); } private Char ExtractLastChar(String stringToObfuscate) { return (from current in stringToObfuscate select current).LastOrDefault(); } private IEnumerable<Char> RandomizeCharacters(IEnumerable<Char> charactersInBetween) { IEnumerable<Char> result = new List<Char>(); result = this.RandomizeOrder(charactersInBetween); do { result = this.RandomizeOrder(charactersInBetween); } while (!charactersInBetween.SequenceEqual(result)); return result; } private IEnumerable<Char> RandomizeOrder(IEnumerable<Char> charactersInBetween) { Random randomizer = new Random(); return charactersInBetween.OrderBy<Char, Int32>(item => randomizer.Next()); } private String ConstructResultString(Char firstCharacter, Char lastCharacter, IEnumerable<Char> charactersInBetween) { String result = String.Empty; result = String.Concat(firstCharacter, new String(charactersInBetween.ToArray()), lastCharacter); return result; } } Der Test dazu: [TestMethod] public void TestThatAWordIsObfuscated() { String testData = "Jacke"; NameObfuscator obfuscator = new NameObfuscator(); String actual = obfuscator.Obfuscate(testData); Assert.IsFalse(testData == actual); Assert.IsTrue(actual.First() == 'J' && actual.Last() == 'e'); Assert.IsTrue(actual.Contains('a') && actual.Contains('c') && actual.Contains('k')); } Zitieren
Klotzkopp Geschrieben 24. November 2010 Geschrieben 24. November 2010 Mein Ansatz wäre:Ich brech zusammen. In C++ wäre das ein Einzeiler. Welches Ziel verfolgt man mit einer derart komplexen Lösung? Außer, dass man es als Hausaufgabenabschreibvorlage nicht verwenden kann? Der Test dazu: Dein Test akzeptiert auch "Jckaacckeke". Zitieren
Brabax Geschrieben 24. November 2010 Geschrieben 24. November 2010 Wie sehe dieser Einzeiler denn aus? Ich würde wie folgt vorgehen: Nimm das Wort und packe es in einen Array (was es ja an sich schon ist, wenn du es so behandelst), dann hast du [0] = J [1] = A [2] = C [3] = K [4] = E Dann lässt du dir für jeden Buchstaben eine zufällige ganzzahlige Position aus 0-5 ermitteln und prüfst, ob du die Position schon vergeben hast. Danach setzt du den Buchstaben nur noch auf die entsprechende Stelle ins Array und machst wieder einen String daraus. lG Zitieren
Klotzkopp Geschrieben 24. November 2010 Geschrieben 24. November 2010 Wie sehe dieser Einzeiler denn aus? // s ist der String mit dem Wort std::random_shuffle(s.begin()+1, s.end()-1);[/code] Zitieren
Phreak93 Geschrieben 24. November 2010 Autor Geschrieben 24. November 2010 erstmal danke an alle die geantwortet haben aber ich habs jez selber hinbekommen und es ist um einiges kürzer als das von "NerdonRails", wenn ich ehrlich bin habe ich mir deins nicht mal durchgelesen war einfach zu lang für son kleines prog. und hatte meine version fertig bevor ich deins hier gelesen habe^^ werde es mir gleich aber mal angucken ich habs jez so gemacht: static void Main(string[] args) { Console.WriteLine("Bitte geben sie ein Wort ein:\n"); Random r = new Random(); string str; str = Console.ReadLine(); Char[] Array = str.ToCharArray(); char speicher; int x; for (int i = 1; i < Array.Length - 2; ++i) { x = r.Next(i + 1, Array.Length - 1); speicher = Array[i]; Array[i] = Array[x]; Array[x] = speicher; } Console.WriteLine(Array); Console.Write("\n"); Console.ReadKey(); } Zitieren
NerdonRails Geschrieben 24. November 2010 Geschrieben 24. November 2010 Ich brech zusammen. In C++ wäre das ein Einzeiler. Welches Ziel verfolgt man mit einer derart komplexen Lösung? Außer, dass man es als Hausaufgabenabschreibvorlage nicht verwenden kann? Natürlich geht das in C# auch kürzer, ich dachte mir: lieber ausführlich und verständlich als kurz und "hä?". Ist ja im zweifel auch nur als Idee zur Implementierung gedacht. Dein Test akzeptiert auch "Jckaacckeke". Stimmt, aber meine Pause war zu ende und ich dachte mir: hey, lieber ein Test der nur die Aufgabenstellung abdeckt als gar keiner. Zitieren
Guybrush Threepwood Geschrieben 24. November 2010 Geschrieben 24. November 2010 lieber ausführlich und verständlich nee is klar Zitieren
NerdonRails Geschrieben 25. November 2010 Geschrieben 25. November 2010 nee is klar Nur so interessehalber : was ist denn nicht verständlich ? Damit ich auch noch was lern. Zitieren
Klotzkopp Geschrieben 25. November 2010 Geschrieben 25. November 2010 Nur so interessehalber : was ist denn nicht verständlich ? Damit ich auch noch was lern.Falls das mit dem "verständlich" wirklich ernst gemeint war: Deine Lösung ist unnötig komplex. Sie ist grob geschätzt dreimal so lang wie die Lösung, auf die Phreak93 am Ende selbst gekommen ist. Glaubst du, der zusätzliche Code schafft irgendwie mehr Verständnis? In Phreak93s Code kann man Fehler viel leichter finden. Die Fehler in deinem Code findet man nicht so leicht. Dass dein eigener Test diese Fehler nicht findet, spricht Bände. Du hast also (geschätzt) dreimal solange gebraucht, um eine dreimal so lange Lösung zu finden, die nicht nur nicht funktioniert, sondern auch schlechter wartbar ist. Nur ein Beispiel: So etwas hier: String result = String.Empty; result = String.Concat(firstCharacter, new String(charactersInBetween.ToArray()), lastCharacter); return result; [/code] ist unnötiger Ballast, wenn es das auch tut: [code]return String.Concat(firstCharacter, new String(charactersInBetween.ToArray()), lastCharacter); Die Funktion tut eigentlich nichts anderes, als ihre Argumente zu konkatenieren. Braucht man dafür wirklich eine eigene Funktion? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.