Zum Inhalt springen

Random mit Buchstaben (Problem)


Phreak93

Empfohlene Beiträge

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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'));

		  }

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. :P 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();

        }

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...