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

6 Lösungen Lösungen öffentlich
#232

Teufelskreis einer selbstbezüglichen Aussage

Anfänger - C# von hollst - 17.12.2018 um 18:46 Uhr
Die folgende Aussage sei gegeben als String:

"Dieser Satz hat vierzig Buchstaben sowie einen Punkt."


Die Aussage ist natürlich falsch, denn der Satz hat tatsächlich fünfundvierzig Buchstaben.

Ersetzen wir nun in der Aussage das Wort "vierzig" durch "fünfundvierzig" bleibt die Aussage aber trotzdem falsch,

denn der neue Satz hat zweiundfünfzig Buchstaben. Schöner Teufelskreis, oder?


Schreibe ein Programm mit dem überprüft wird, ob es überhaupt eine (ausgeschriebene) Zahl gibt, die oben zu einer wahren Aussage führt.

Viel Spaß!

#1
3 Kommentare
vote_ok
von Exception (3860 Punkte) - 23.12.2018 um 10:29 Uhr
- Es wurden die Werte 1 ... 100 geprüft, siehe Anlage "numbers.txt".
- An gültigen Sätzen gibt es exakt einen: 53.

Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Teufelskreis_232
{
    class Program
    {
        private static string Sentence;
        private static Dictionary<int, string> Numbers;


        static void Main(string[] args)
        {
            try
            {
                Program.Sentence = "Dieser Satz hat # Buchstaben sowie einen Punkt.";
                Program.Numbers = new Dictionary<int, string>();

                Program.getMapping(args[0]);
                List<string> validSentences = Program.validateSentences();
                Program.printResults(validSentences);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.ReadLine();
        }

        /// <summary>
        /// Gibt das Ergebnis / die Ergebnisse aus.
        /// </summary>
        /// <param name="validSentences">Liste aller gültigen Sätze</param>
        private static void printResults(List<string> validSentences)
        {
            if (validSentences.Count > 0)
            {
                Console.WriteLine("Es wurden {0} gültige Sätze gefunden.", validSentences.Count);

                foreach (string sentence in validSentences)
                {
                    Console.WriteLine();
                    Console.Write("\"");
                    Console.Write(sentence);
                    Console.Write("\"");
                }
            }
            else
            {
                Console.WriteLine("Es wurden keine gültige Sätze gefunden!");
            }
        }

        /// <summary>
        /// Prüft die Gültigkeit mit den einzelnen Werten.
        /// ACHTUNG:
        /// - Auch wenn die Reihenfolge von Satz + Zahl im Bezug auf die Länge egal ist, so wird hier noch eine Ersetzung vorgenommen, 
        ///   damit die Ausgabe später schön ist.
        /// </summary>
        /// <returns>Die gültigen Sätze</returns>
        private static List<string> validateSentences()
        {
            List<string> validSentences = new List<string>();

            foreach (KeyValuePair<int, string> number in Program.Numbers)
            {
                string sentence = Program.replacePlaceholder(number.Value, Program.Sentence);
                string temp = sentence.Replace(" ", ""); // Leerzeichen werden gelöscht, da nur Buchstaben und der Punkt am Ende relevant sind.

                int expectedCharacters = number.Key; 
                int realCharacters = temp.Length;

                if(expectedCharacters == realCharacters)
                {
                    validSentences.Add(sentence);
                }
            }

            return validSentences;
        }

        /// <summary>
        /// Ersetzt in text placeholder durch value.
        /// Hierbei ist zu beachten, dass _alle_ placeholder durch value ersetzt werden.
        /// 
        /// Sollte es benötigt werden, so kann die Funktion erweitert werden, sodass zwei Listen übergeben werden,
        /// somit können mehrere _verschiedene_ Platzhalter gehandelt werden.
        /// Aber für die aktuelle Aufgabe reicht das so ;)
        /// </summary>
        /// <param name="value">Der Wert der in Platzhalter eingesetzt wird.</param>
        /// <param name="text">Der Text indem das Platzhalterzeichen vorhanden ist.</param>
        /// <param name="placeholder">Das Platzhalterzeichen</param>
        /// <returns></returns>
        private static string replacePlaceholder(string value, string text, string placeholder = "#")
        {
            return text.Replace(placeholder, value);
        }

        /// <summary>
        /// Lädt das "ZahlenWert;AusgeschriebeneZahl"-Mapping aus übergebenem Dateipfad (CSV) in ein Dictionary.
        /// </summary>
        /// <param name="filePath">Der Dateipfad</param>
        private static void getMapping(string filePath)
        {
            if(!File.Exists(filePath))
            {
                throw new FileNotFoundException("Datei wurde nicht unter \"" + filePath + "\" gefunden.");
            }

            using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                using (StreamReader sr = new StreamReader(fs, Encoding.Default))
                {
                    while(sr.Peek() >= 0)
                    {
                        string[] numberParts = sr.ReadLine().Split(';');
                        Program.Numbers.Add(Convert.ToInt32(numberParts[0]), numberParts[1]);
                    }
                }
            }
        }
    }
}

Kommentare:

AchtungHuPe

Punkte: 120


3 Lösungen
1 Kommentare

#1
03.01.2019 um 17:34 Uhr
Hallo,

in der Satzaussage wird nur die Anzahl der Buchstaben angegeben.
Der Punkt ist daher nicht relevant. Die richtige Lösung lautet 52 Buchstaben.

LG Peter
post_arrow
562 0

Exception

Punkte: 3860

84 Aufgaben
62 Lösungen
4 Kommentare

#2
04.01.2019 um 19:43 Uhr
Hallo Peter,

stimmt vollkommen, der Punkt muss auch noch raus.
Vielen Dank für deine Antwort!


Gruß und schönes Wochenende

Thomas
post_arrow
563 0

hollst

Punkte: 10740

581 Aufgaben
101 Lösungen
94 Kommentare

#3
05.02.2019 um 09:53 Uhr
Achtung, es gibt zwei Lösungen: 51 und 52
post_arrow
568 0
Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben