C# :: Aufgabe #398

4 Lösungen Lösungen öffentlich

String abwechselnd neu anordnen

Anfänger - C# von JKooP - 15.05.2021 um 10:48 Uhr
Gegeben ist ein String (Text) bestehend aus Kleinbuchstaben und Ziffern.
Ziel ist es diesen String neu anzuordnen, sodass sich Kleinbuchstaben und Ziffern abwechseln.
D.h., auf einen Kleinbuchstaben darf kein Kleinbuchstabe und auf eine Ziffer keine weitere Ziffer folgen.
Die Reihenfolge der Zeichen-Gruppen (Kleinbuchstaben bzw. Ziffern) darf nicht verändert werden.
Sind beide Zeichengruppen gleich lang, ist es egal mit welchem Zeichen begonnen wird.
Gibt es keine Lösung, soll ein Leer-String zurückgegeben werden.

Beispiele:
s = "train1234"
Lösung: "t1r2a3i4n"

s = "1234567"
Lösung: "", da nur Ziffern

s = "abcdefg"
Lösung: "", da nur Buchstaben

s = "abcdef123"
Lösung: "", nicht abwechselnd möglich

s = "abcd1234"
Lösung: "a1b2c3d4" oder "1a2b3c4d"

Schreibe eine Methode/Funktion, die obige Aufgabenstellung umsetzt.

Viel Spaß

Lösungen:

vote_ok
von manoloForead (390 Punkte) - 18.05.2021 um 01:16 Uhr
Quellcode ausblenden C#-Code
private string ReorderString(string input)
        {
            // Anteile Buchstaben und Ziffern
            var alphas = Regex.Matches(input, @"[a-z]");
            var nums = Regex.Matches(input, @"[0-9]");

            // Prüfen, ob gleich beide lang oder maximal 1 Unterschied, sonst leeren String zurück geben
            if (Math.Abs(alphas.Count - nums.Count) > 1)
                return "";

            // Herausfinden, ob mehr Zahlen oder Buchstaben enthalten sind
            var biggerCollection = alphas;
            var smallerCollection = nums;

            if (alphas.Count < nums.Count)
            {
                biggerCollection = nums;
                smallerCollection = alphas;
            }

            // Ergebnis-String zusammensetzen (gleiche Länge)
            string result = "";

            for (int i = 0; i < smallerCollection.Count; i++)
            {
                result += biggerCollection[i];
                result += smallerCollection[i];
            }

            // Falls ungleiche Länge, dann das letzte fehlende Zeichen hinzufügen
            if (biggerCollection.Count != smallerCollection.Count)
                result += biggerCollection[biggerCollection.Count - 1];

            return result;
        }
vote_ok
von JKooP (18070 Punkte) - 21.05.2021 um 22:04 Uhr
NET 5.x; C# 9.x; VS-2019
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;

var lst = new List<string>()
{
    "train1234", "1234567", "abcdefg", "abcdef123", "abcd1234"
};

lst.ForEach(x => Console.WriteLine(OrderedSequence(x)));

string OrderedSequence(string s)
{
    char[] arr = new char[s.Length];

    int nc = s.Count(x => x >= 'a' && x <= 'z');
    int nd = s.Count(x => x >= '0' && x <= '9');
    int cc = 0;
    int cd = 0;

    if (Math.Abs(nc - nd) > 1) return "";
    if (nc > nd)
        cd = 1;
    else
        cc = 1;

    foreach (char i in s)
    {
        if (i >= 'a' && i <= 'z')
        {
            arr[cc] = i;
            cc += 2;
        }
        else
        {
            arr[cd] = i;
            cd += 2;
        }
    }

    return new string(arr);
}
vote_ok
von Heftog (300 Punkte) - 06.06.2021 um 00:40 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Linq;

namespace TestFramwork
{
    public class Program
    {
        public static void Main()
        {
            try
            {
                string[] test = new string[] { "train1234", "1234567", "abcdefg", "abcdef123", "abcd1234", "abcd12345" };
                foreach(string s in test)
                {
                    Console.WriteLine($"Ergebniss zu:\ninput: {s}\noutput: {HandleString(s)}\n\n");
                }

            }
            catch (Exception ex)
            {
                string error = ex.ToString();
            }
        }

        private static string HandleString(string input)
        {

            int countLetter = input.ToCharArray().Count(c => char.IsLetter(c));
            int countDigit = input.ToCharArray().Count(c => char.IsDigit(c));

            if ((countLetter + 1 == countDigit || countLetter - 1 == countDigit) || countDigit == countLetter)
            {
                string result = "";

                //Deppends on which Counter is longer we set the chars
                int charIndex1 = countLetter < countDigit ? countLetter : 0;
                int charIndex2 = countLetter - charIndex1;
                bool charIndex1IsLetter = charIndex1 == 0;

                //FOR -> As long as the longest Counter is (Digit, Letter)
                for (int i = 0; i < (countLetter < countDigit ? countDigit : countLetter); i++)
                {
                    //To avoid OutOfIndexEx check the possibility
                    if (charIndex1 == input.Length 
                        || !(charIndex1IsLetter ? char.IsLetter(input[charIndex1]) : char.IsDigit(input[charIndex1])))
                    {
                        result += input[charIndex2].ToString();
                    }
                    else if (charIndex2 == input.Length 
                        || !(charIndex1IsLetter ? char.IsDigit(input[charIndex2]) : char.IsLetter(input[charIndex2])))
                    {
                        result += input[charIndex1].ToString();
                    }
                    else if (char.IsLetter(input[charIndex1IsLetter ? charIndex1 : charIndex2])
                        && char.IsDigit(input[!charIndex1IsLetter ? charIndex1 : charIndex2]))
                    {
                        result += input[charIndex1].ToString() + input[charIndex2].ToString();
                    }
                    else
                    {
                        return "";
                    }
                    charIndex1++;
                    charIndex2++;
                }
                return result;
            }

            return "";
        }
    }



}
vote_ok
von ionut (80 Punkte) - 13.07.2021 um 00:32 Uhr
Quellcode ausblenden C#-Code
Console.Write("Bitte schreibe ein Wort der gleichen Anzahl von Buchstaben und Ziffer hat: ");
            string s = Console.ReadLine();
            Abwechseln(s);
        }

        static void Abwechseln(string Text)
        {
            int buchstaben = 0;
            int ziffer = 0;
            bool buchstabenGleichZiffer = false;
            string antwort = "";
            string buchstabenString = "";
            string zifferString = "";
            // Prüfen ob Buchstaben und Zahlen gleich sind.

            for (int i = 0; i < Text.Length; i++)
            {
                if (Char.IsDigit(Text[i]))
                {
                    ziffer++;
                }
                else
                {
                    buchstaben++;
                }
            }

            if (buchstaben == ziffer) // prüfe ob buchstabenAnzahl gleich zifferAnzahl ist.
            {
                buchstabenGleichZiffer = true;
                buchstabenString = Text.Substring(0, buchstaben);
                zifferString = Text.Substring(ziffer);
            }
            

            if (buchstabenGleichZiffer)
            {
                for (int i = 0; i < buchstabenString.Length; i++)
                {
                    antwort = antwort + buchstabenString[i] + zifferString[i];
                }
            }
            Console.WriteLine();
            Console.WriteLine(antwort);
            Console.ReadLine();