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