C# aus Textdatei lesen

10/27/2013 21:15 xNRgiZeDx™#1
Hallo,

Ich möchte das für jeden Buchstaben der eingegeben wird, der zugeordnete Buchstabe Ausgegeben wird. Wie kann ich das mit einer Textdatei realisieren?

Quote:
|INPUT | a b c d e f g h i j k l m n o p q r s t u v w x y z
|OUTPUT| j k h i n o l m r s p q v w t u z G b c J a f g d e
z.B mit dieser Tabelle, für ein eingegebenes "a" soll ein "j" ausgegeben werden.

Hoffe jemand kann mir behilflich sein.
10/27/2013 21:31 Schlüsselbein#2
Dafür eignet sich eine Map sehr gut. Solch eine Datenstruktur lässt sich bestimmt auch unter .NET finden.
10/27/2013 21:36 xNRgiZeDx™#3
Meinst du sowas hier [Only registered and activated users can see links. Click Here To Register...] ?
10/27/2013 21:47 Schlüsselbein#4
Genau, Dictionary wäre ein passender Container.

Allerdings mal ne Frage nebenbei: Gehts um die Caesar-Verschlüsselung?
10/27/2013 21:58 xNRgiZeDx™#5
Nein, es geht um eine Übersetzung von zwei Fraktionssprachen in einem Spiel. Verstehe nur nicht, wie ich das auf meine Tabelle anwenden soll.
10/28/2013 00:38 Shawak#6
Code:
        public static string Translate(string text)
        {
            var from = "abcdefghijklmnopqrstuvwxyz";
            var to =   "jkhinolmrspqvwtuzGbcJafgde";
            var ret = new StringBuilder();
            foreach (var l in text)
            {
                int index;
                for (index = 0; index <= from.Length; index++)
                    if (index == from.Length || from[index] == l)
                        break;
                ret.Append(index != from.Length ? to[index] : l);
            }
            return ret.ToString();
        }
10/28/2013 00:41 xNRgiZeDx™#7
Danke dir, die Methodik war mir noch nicht bekannt. :D
10/28/2013 01:03 snow#8
Quote:
Originally Posted by Shawak View Post
[zur Übersichtlichkeit lasse ich den Code weg]
Das ergibt ne Laufzeit von len(text) * len(from), eine Map, wie von Schlüsselbein vorgeschlagen, dürfte mit len(text) * log2(len(from)) bei längeren Texten wesentlich effektiver sein.

auf die Schnelle umgesetzt:
Code:
public static string Translate(string text)
{
	var fromTo = new Dictionary<char, char>()
	{
		{'a', 'j'},
		{'b', 'k'},
		{'c', 'l'},
		//usw...
	};
	
	var ret = new StringBuilder();
	
	foreach (char l in text)
	{
		if (fromTo.ContainsKey(l))
		{
			ret.Append(fromTo[l]);
		}
	}
	
	return ret.ToString();
}
Das Dictionary kann man sicher auch noch komfortabel serialisieren, dann kann man das auch in einer Textdatei bearbeiten.
10/28/2013 01:34 xNRgiZeDx™#9
Es muss nicht zwinged eine Textdatei sein. Habe das Programm jetzt soweit das es tut was es soll, muss nurnoch überprüfen, ob es auch richtig übersetzt.
10/28/2013 01:43 Shawak#10
Ich war mal so frei:

Code:
        public static string Translate(string text, bool includeUntranslateable = true)
        {
            var fromTo = new Dictionary<char, char>()
            {
                {'a', 'j'},
                {'b', 'k'},
                {'c', 'h'},
                {'d', 'i'},
                {'e', 'n'},
                {'f', 'o'},
                {'g', 'l'},
                {'h', 'm'},
                {'i', 'r'},
                {'j', 's'},
                {'k', 'p'},
                {'l', 'q'},
                {'m', 'v'},
                {'n', 'w'},
                {'o', 't'},
                {'p', 'u'},
                {'q', 'z'},
                {'r', 'G'},
                {'s', 'b'},
                {'t', 'c'},
                {'u', 'J'},
                {'v', 'a'},
                {'w', 'f'},
                {'x', 'g'},
                {'y', 'd'},
                {'z', 'e'},
            };
            var ret = new StringBuilder();
            foreach (var l in text)
                if (fromTo.ContainsKey(l))
                    ret.Append(fromTo[l]);
                else if (includeUntranslateable)
                    ret.Append(l);
            return ret.ToString();
        }
    }
10/28/2013 01:51 xNRgiZeDx™#11
Danke dir, ich darf davon morgen 4 Stück machen, da jenachdem welcher Buchstabe kommt, ich in eine andere Tabelle Springen muss in der Wieder andere Buchstaben zugeordnet werden. Hat jemand einen Tipp wie ich das möglichst einfach realisieren kann? Sonst müsste man ja if abfragen machen und dann in die nâchste. tabelle verweisen.
10/28/2013 02:02 Shawak#12
Code:
        static void Main(string[] args)
        {
            var dict1 = DictionaryFromStrings(
                "abcdefghijklmnopqrstuvwxyz",
                "jkhinolmrspqvwtuzGbcJafgde"
            );

            var dict2 = DictionaryFromStrings(
                "abcdefg",
                "1234567"
            );

            var input = Console.ReadLine();
            Console.WriteLine("Dict1: " + Translate(dict1, input));
            Console.WriteLine("Dict2: " + Translate(dict2, input));

            Console.ReadKey();
        }

        public static Dictionary<char, char> DictionaryFromStrings(string from, string to)
        {
            var ret = new Dictionary<char, char>();
            for (int i = 0; i < from.Length; i++)
                ret.Add(from[i], to[i]);
            return ret;
        }

        public static string Translate(Dictionary<char, char> dictionary, string text, bool includeUntranslateable = true)
        {
            var ret = new StringBuilder();
            foreach (var l in text)
                if (dictionary.ContainsKey(l))
                    ret.Append(dictionary[l]);
                else if (includeUntranslateable)
                    ret.Append(l);
            return ret.ToString();
        }
10/28/2013 18:05 MrSm!th#13
snow, du hast da nicht 100%ig Recht. len(text)*len(from) wäre der Worst-Case. Im Durchschnitt könnte man also (wenn man jetzt mal von Häufigkeitsverteilungen von bestimmten Buchstaben in einer Sprache absieht) von len(text)*len(from)*1/2 ausgehen.
Ob ein Dictionary nur im Avarage-Case die Laufzeit log2(n) hat oder auch Worst-Case, weiß ich gerade nicht.
10/28/2013 18:53 snow#14
Quote:
Originally Posted by MrSm!th View Post
snow, du hast da nicht 100%ig Recht. len(text)*len(from) wäre der Worst-Case. Im Durchschnitt könnte man also (wenn man jetzt mal von Häufigkeitsverteilungen von bestimmten Buchstaben in einer Sprache absieht) von len(text)*len(from)*1/2 ausgehen.
Ob ein Dictionary nur im Avarage-Case die Laufzeit log2(n) hat oder auch Worst-Case, weiß ich gerade nicht.
Gut, dann nehmen wir die Groß-O-Darstellung, dann habe ich Recht. :p
Klar ist das Worst-Case, O(len(text)*len(from)) entspricht dann aber auch O(len(text)*len(from)*1/2). Passt schon irgendwie :bandit:

Ich weiß nicht, wie .NET das Dictionary intern aufbaut, sollten sie einen Binary-Tree verwenden, dürfte O(log2(n)) soweit passen. Sollten sie ne Hashtable verwenden.. nunja, Hashtables sind böse. :D

Letztendlich wird das ja auch egal sein, ich denke nicht, dass man das während der Ausführung wirklich merkt. Dictionaries sind allerdings cooler als diese doofen for-Schleifen.
10/28/2013 21:37 xNRgiZeDx™#15
So ich hab mal ein bischen rumgebastelt, jedoch komm ich auf keine Lösung dafür, wie ich zwischen den Tabellen springen kann.
Quote:
Initial letter:

If you want to say: a b c d e f g h i j k l m n o p q r s t u v w x y z

Type..............: i h k j m l o n q p s r u t w v y x a z c b e d g f

Then go to table..: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 1 1

OR type...........: O N Q P S R U T W V Y X A Z C B E D G F I H K J M L

Then go to table..: 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 3 3 3 3 3 3 3 3


Table 1

If you want to say: a b c d e f g h i j k l m n o p q r s t u v w x y z

Type..............: e d g f i h k j m l o n q p s r u t w v y x a z c b

Then go to table..: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1

OR type...........: K J M L O N Q P S R U T W V Y X A Z C B E D G F I H

Then go to table..: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 3 3 3 3 3 3 3 3


Table 2

If you want to say: a b c d e f g h i j k l m n o p q r s t u v w x y z

Type..............: d c f e h g j i l k n m p o r q t s v u x w z y b a

Then go to table..: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1

OR type...........: J I L K N M P O R Q T S V U X W Z Y B A D C F E H G

Then go to table..: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3


Table 3

Type..............: f e h g j i l k n m p o r q t s v u x w z y b a d c

Then go to table..: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1

OR type...........: L K N M P O R Q T S V U X W Z Y B A D C F E H G J I

Then go to table..: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3
Ich muss jenachdem welcher Buchstabe eingegeben wird, in der nächsten Tabelle weitermachen nur weiss ich nicht wie ich Prüfen kann welcher Buchstabe dazugehört, klar if-abfragen aber da tipp ich mir ja nen wolf.