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

Pig Latin - Schweine Latein
Einführung:
Zitat:
Pig Latin (engl.; wörtlich: Schweine-Latein) bezeichnet eine Spielsprache, die im englischen Sprachraum verwendet wird.
Sie wird vor allem von Kindern benutzt, aus Spaß am Spiel mit der Sprache oder als einfache Geheimsprache, mit der Informationen vor Erwachsenen oder anderen Kindern verborgen werden sollen.
Erklärung:
Zitat:
Beginnt das Wort mit einem Konsonanten, so wird der initiale Konsonant oder Konsonantencluster ans Ende des Wortes verschoben und ein „ay“ angehängt. Zu betrachten ist hierbei nicht die Rechtschreibung, sondern die tatsächliche Aussprache: „Stumme“ Konsonantenbuchstaben, wie z. B. das „h“ in „honor“, sind keine Konsonanten.
loser → oser-lay
button → utton-bay
star → ar-stay
three → ee-thray
question → estion-quay
happy → appy-hay
Pig Latin → Ig-pay Atin-lay
Beginnt das Wort mit einem Vokal oder einem stummen Konsonanten, so wird direkt ein „ay“ angehängt.
eagle → eagle-ay
America → America-ay
honor → honor-ay
Aufgabe:
Schreibt ein Programm welches ein belibiges Wort ins Schweine Latein umwandelt und ausgibt. Auf die Regel mit Stummen H's kann man verzichten.

MainWindow.xaml.cs

using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Documents; using Word = Microsoft.Office.Interop.Word; namespace Schweinelatein { /// <summary> /// Interaktionslogik für MainWindow.xaml /// </summary> public partial class MainWindow : Window { Word.Application app; public MainWindow() { InitializeComponent(); app = new Word.Application(); textblockNToPig.Text = "\u2193 Übersetzen \u2193"; textblockPigToN.Text = "\u2191 Übersetzen \u2191"; } public string CreatePigLatin(string original, string pig)//Neues Wort erstellen, pig ist die Silbe { if (string.IsNullOrEmpty(original)) { return null; } int i = original.Length; char konsonant = original.First(x => !(x != 'a' && x != 'e' && x != 'i' && x != 'o' && x != 'u' && x != 'ä' && x != 'ö' && x != 'ü' && x != '\0' && x != 'A' && x != 'E' && x != 'I' && x != 'O' && x != 'U' && x != 'Ä' && x != 'Ö' && x != 'Ü')); int index = original.IndexOf(konsonant); if (index > 0) { string cut = original.Substring(0, index).ToLower(); string rest = original.Substring(index, original.Length - index); if (char.IsUpper(original[0])) { rest = original.Substring(index, 1).ToUpper() + original.Substring(index + 1, original.Length - index - 1); } return rest + cut + pig; } else { return original + pig; } } public string CreatePigText(string original, string pig = "ay")//Erstelle für alle Wörter ein neues "Schweinewort" { List<KeyValuePair<string, char>> split = GotSplittedAt(original, ' ', ',', '!', '.', '=', '?', ';', '\r', '\n', '\t', '\0', '\"', '„', '“'); string Out = null; foreach (KeyValuePair<string, char> el in split) { Out += CreatePigLatin(el.Key, pig) + el.Value; } Out = Out.Substring(0, Out.Length - 1); return Out; } public string CreateNormalText(string pigLatin, string pig)//Erstellt den Ursprungstext { List<KeyValuePair<string, char>> split = GotSplittedAt(pigLatin, ' ', ',', '!', '.', '=', '?', ';', '\r', '\n', '\t', '\0', '\"', '„', '“'); string Out = null; foreach (KeyValuePair<string, char> el in split) { Out += CreateNormalWord(el.Key, pig) + el.Value; } Out = Out.Substring(0, Out.Length - 1); return Out; } public string GetCorrectWord(string pigLatin)//Findet das ursprüngliche Wort heraus, ohne Silbe { /* piglatin: Schwein --> Einschway mögliche Wörter: Einschw Weinsch Hweinsc Chweins Schwein ... Das einzig tatsächlich existierende Wort ist Schwein, das auch zurückgegeben wird. */ string text = pigLatin; bool isUpper = char.IsUpper(pigLatin[0]); List<string> words = new List<string>(); for (int i = 0; i != pigLatin.Length; i++) { string word = text; if (isUpper) { word = text.Substring(0, 1).ToUpper() + text.Substring(1, text.Length - 1).ToLower(); } words.Add(word); text = text.Substring(text.Length - 1, 1) + text.Substring(0, text.Length - 1); } List<bool> correct = CheckSpelling(words).ToList(); try { return words[correct.IndexOf(true)]; } catch { return string.Format("%Error:[ {0} ]%", pigLatin); } } public string CreateNormalWord(string pigLatin, string pig)//Normales Wort aus Schweinelatein erstellen, pig ist die Silbe { if (!string.IsNullOrEmpty(pigLatin)) { if (pigLatin.EndsWith(pig)) { string temp = pigLatin.Substring(0, pigLatin.Length - pig.Length); return GetCorrectWord(temp); } else { return string.Format("%Error:[ {0} ]%", pigLatin); } } return null; } public IEnumerable<bool> CheckSpelling(IEnumerable<string> words)//Rechtschreibung prüfen { foreach (string word in words) { yield return app.CheckSpelling(word); } } public List<KeyValuePair<string, char>> GotSplittedAt(string Text, params char[] seperator) { List<KeyValuePair<string, char>> split = new List<KeyValuePair<string, char>>(); char[] temp = Text.ToCharArray(); string part = null; foreach (char el in temp) { if (!seperator.Contains(el)) { part += Convert.ToString(el); } else { split.Add(new KeyValuePair<string, char>(part, el)); part = null; } } split.Add(new KeyValuePair<string, char>(part, '\0')); return split; } private void buttonTranslateNToPig_Click(object sender, RoutedEventArgs e) { string orig = new TextRange(richTextBoxOrig.Document.ContentStart, richTextBoxOrig.Document.ContentEnd).Text; string text = CreatePigText(orig, textBoxKey.Text); richTextBoxPig.Document.Blocks.Clear(); richTextBoxPig.Document.Blocks.Add(new Paragraph(new Run(text))); } private void buttonTranslatePigToN_Click(object sender, RoutedEventArgs e) { string pig = new TextRange(richTextBoxPig.Document.ContentStart, richTextBoxPig.Document.ContentEnd).Text; string text = CreateNormalText(pig, textBoxKey.Text); richTextBoxOrig.Document.Blocks.Clear(); richTextBoxOrig.Document.Blocks.Add(new Paragraph(new Run(text))); } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { app.Quit(); } } }
MainWindow.xaml

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Schweinelatein" xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" x:Class="Schweinelatein.MainWindow" mc:Ignorable="d" Title="Schweinelateinübersetzer" Height="415" Width="525" ResizeMode="CanMinimize" Closing="Window_Closing"> <Grid> <RichTextBox x:Name="richTextBoxOrig" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="492" Height="150" ToolTip="Normaler Text"/> <RichTextBox x:Name="richTextBoxPig" HorizontalAlignment="Left" Margin="10,223,0,0" VerticalAlignment="Top" Width="492" Height="150" ToolTip="Schweinelatein"/> <Button x:Name="buttonTranslateNToPig" HorizontalAlignment="Left" Margin="159,168,0,0" VerticalAlignment="Top" Width="343" Click="buttonTranslateNToPig_Click"> <TextBlock x:Name="textblockNToPig" Text="Übersetzen"/> </Button> <TextBlock x:Name="textBlock" HorizontalAlignment="Left" Margin="10,174,0,0" TextWrapping="Wrap" VerticalAlignment="Top"><Run Text="Silbe"/></TextBlock> <TextBox x:Name="textBoxKey" TextWrapping="Wrap" Text="ay" Margin="41,170,363,184" TextAlignment="Center" Height="33"/> <Button x:Name="buttonTranslatePigToN" HorizontalAlignment="Left" Margin="159,196,0,0" VerticalAlignment="Top" Width="343" Click="buttonTranslatePigToN_Click"> <TextBlock x:Name="textblockPigToN" Text="Übersetzen"/> </Button> </Grid> </Window>
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar