C# :: Aufgabe #124 :: Lösung #1

3 Lösungen Lösungen öffentlich
#124

Zeichensatz zu Umlauten

Fortgeschrittener - C# von J_U_B - 16.03.2016 um 10:03 Uhr
Es soll ein Programm geschrieben werden, welches Zeichensätze aus einem String - wie zum Beispiel "AE", "OE", "UE" oder "SS" - in die Entsprechenden Umlaute umwandelt - "AE" zu "Ä", "OE" zu "Ö" u.s.w.

Hierbei sollte auf die Korrekte Umsetzung der Wörter geachtet werden, hierfür einige Beispiele:

STOSSDAEMPFER = STOßDÄMPFER
STEUERKETTE = STEUERKETTE
KASSE = KASSE
HUELSE = HÜLSE

u.s.w.
#1
vote_ok
von daniel59 (4260 Punkte) - 06.04.2016 um 10:39 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using Word = Microsoft.Office.Interop.Word;

namespace ConsoleUmlaut
{
    class Program
    {
        static readonly string[] Umlaute = { "ae", "oe", "ue", "ss", "Ae", "Oe", "Ue" };

        static Dictionary<string, string> Values = new Dictionary<string, string>() { };
        static void Main(string[] args)
        {
            Values = new Dictionary<string, string>();
            Values.Add("ae", "ä");
            Values.Add("oe", "ö");
            Values.Add("ue", "ü");
            Values.Add("ss", "ß");
            Values.Add("Ae", "Ä");
            Values.Add("Oe", "Ö");
            Values.Add("Ue", "Ü");

            string text = "Stossdaempfer Steuerpruefung Suessstofffresssucht Uebergroessentraeger";
            string[] split = text.Split(' ', '\t', '\r', '\n', ',', ';', '.', '?', '!', '-');
            int words = split.Length;

            IEnumerable<IEnumerable<string>> allPossibilities = CreatePossibilities(split);
            IEnumerable<string> correctWords = GetCorrectWords(allPossibilities);

            foreach(string word in correctWords)
            {
                Console.WriteLine(word);
            }
            Console.ReadLine();
        }

        static IEnumerable<List<bool>> CheckSpelling(IEnumerable<IEnumerable<string>> words)
        {
            Word.Application app = new Word.Application();

            foreach (IEnumerable<string> word in words)
            {
                List<bool> list = new List<bool>();
                foreach (string s in word)
                {
                    list.Add(app.CheckSpelling(s));
                }
                yield return list;
            }

            app.Quit();
        }

        static IEnumerable<string> GetCorrectWords(IEnumerable<IEnumerable<string>> allPossibilties)
        {
            var checkedPossibilties = CheckSpelling(allPossibilties);
            int curList = 0;
            foreach (var item in checkedPossibilties)
            {
                int index = item.LastIndexOf(true);
                if (index == -1)
                { index = 0; }
                string word = allPossibilties.ElementAt(curList).ElementAt(index);
                curList++;
                yield return word;
            }
        }

        static IEnumerable<IEnumerable<string>> CreatePossibilities(string[] words)
        {
            foreach (string word in words)
            {
                yield return CreatePossibilties(word);
            }
        }

        static IEnumerable<string> CreatePossibilties(string word)
        {
            string[] split = SplitAtUmlaut(word);
            if (split == null)
            {
                yield return word;
            }
            else
            {
                int possibility = (int)Math.Pow(2, split.Length);
                bool[] getsMapped = new bool[split.Length];
                string[] temp = new string[split.Length];
                for (int i = 0; i != possibility; i++)
                {
                    split.CopyTo(temp, 0); ;

                    string s = Convert.ToString(i, 2).PadLeft(split.Length, '0');
                    var table = GetTable(s).ToList();
                    for (int b = 0; b != table.Count; b++)
                    {
                        if (table[b])
                        {
                            string part = split[b];
                            temp[b] = Replace(part);
                        }
                    }
                    string possible = RebuildString(temp);
                    yield return possible;
                }
            }
        }

        static string Replace(string text)
        {
            string key = text;
            foreach (var item in Values)
            {
                key = key.Replace(item.Key, item.Value);
            }
            return key;
        }

        static string RebuildString(string[] source)
        {
            string text = null;
            foreach (string s in source)
            {
                text += s;
            }
            return text;
        }

        static IEnumerable<bool> GetTable(string s)
        {
            char[] values = s.ToCharArray();
            for (int i = 0; i != values.Length; i++)
            {
                if (values[i] == '1')
                {
                    yield return true;
                }
                else if (values[i] == '0')
                { yield return false; }
                else
                { throw new ArgumentException("Der string darf nur die Zeichen '0' und '1' beinhalten."); }
            }
        }

        static string[] SplitAtUmlaut(string text)
        {
            List<int> indexes = FindAllIndexes(text, Umlaute).ToList();
            int minus = FindAllIndexes(text, new string[1] { "sss" }).Count();
            int count = indexes.Count - minus;
            if (count == 0)
            { return null; }
            else if (count == 1)
            { return new string[1] { text }; }
            else
            {
                string[] split = new string[count];
                int first = indexes.First();
                int last = indexes.Last();
                int length = 0;
                int startIndex = 0;
                for (int i = 0; i != count; i++)
                {
                    int next = 0;
                    if (i == count - 1)
                    { length = text.Length - startIndex; }
                    else if (i == 0 && indexes[i + 1] - indexes[i] == 1)
                    { length = indexes[1] + 1; next = length; }
                    else if (indexes[i + 1] - indexes[i] == 1)
                    { length = 2; next = startIndex + 2; }
                    else if (i == 0 && indexes[i] != 0)
                    { length = indexes[1]; next = length; }
                    else
                    { length = indexes[i + 1] - indexes[i]; next = indexes[i + 1]; }
                    split[i] = text.Substring(startIndex, length);
                    startIndex = next;
                }
                return split;
            }
        }

        static IEnumerable<int> FindAllIndexes(string source, params string[] param)
        {
            int index = 0;
            int i = 0;
            bool run = true;
            while (run)
            {
                List<int> temp = new List<int>();
                foreach (string par in param)
                {
                    temp.Add(source.IndexOf(par, i));
                }
                if (temp.Max() == -1)
                { break; }

                index = (from t in temp where t > -1 select t).Min();
                i = index + 1;
                yield return index;
            }
        }
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
1816563

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.