Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

1

09.01.2008, 14:20

#02: "Palindrom", K.d.C., 20.01.2008

#02: "Palindrom"
Typ: Kürze des Codes
Deadline: 20.01.2008
Abgabe: contest@spieleprogrammierer.de

Bitte beachten:
- Ablauf und Regeln
- Ergebnis-Thread


Ein Palindrom ist ein Wort (oder für uns: ein String), das vorwärts wie rückwärts gelesen dasselbe ergibt. Zum Beispiel: "otto", "aba", "aa", "x" oder der leere String "".
Ihr sollt eine Funktion schreiben, die einen nullterminierten String als Eingabe erhält und die Länge des längsten Substrings darin zurückliefert, der ein Palindrom ist.
Für den String "abbaottoxotto" wäre das Ergebnis zum Beispiel 9. "abba" wäre zwar auch ein Palindrom, aber "ottoxotto" ist das Längste. Bei der Eingabe "abc" wäre 1 das korrekte Ergebnis ("a", "b" und "c" sind jeweils Palindrome der Länge 1). Beim leeren String "" ist das korrekte Ergebnis 0.

Bei diesem Contest dürfen keine Funktionen oder Klassen aus der Standardbibliothek benutzt werden (also auch nicht strlen() oder std::string).
Auf den String darf nur innerhalb des gültigen Bereichs zugegriffen werden, also auf alle Speicherstellen vom Beginn des Strings bis einschließlich der terminierenden Null.
Bewertungskriterium ist die Kürze des Codes in Token. Siehe dazu die Regeln.

Viel Spaß!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
//////////////////////////////////////////////////////////////////////////

// spieleprogrammierer.de-Programmier-Contest #02                       //

// ******************************************************************** //

// Titel: ...... "Palindrom"                                            //

// Typ: ........ Kürze des Codes                                        //

// Deadline: ... 20.01.2008                                             //

// Abgabe: ..... contest@spieleprogrammierer.de                         //

// ******************************************************************** //

// Aufgabe:                                                             //

// --------                                                             //

// Deine Funktion erhält als Eingabe einen String und muss die Länge    //

// des längsten Palindroms innerhalb dieses Strings zurückgeben.        //

// Ein Palindrom ist ein String, der vorwärts wie rückwärts gelesen     //

// dasselbe ergibt. Beachte: ein Substring mit nur einem einzigen       //

// Zeichen ist immer ein Palindrom. Bei einem leeren String als Eingabe //

// ist die korrekte Ausgabe die Null.                                   //

// Jegliche Benutzung der Standardbibliothek ist verboten!              //

//////////////////////////////////////////////////////////////////////////


#include <iostream>

//////////////////////////////////////////////////////////////////////////


// >>> EIGENE FUNKTION - BITTE IMPLEMENTIEREN! <<<

// >>> BENUTZUNG DER STANDARDBIBLIOTHEK IST VERBOTEN! <<<

size_t my_palindrome(const char* p_string)
{
    return 0;
}

//////////////////////////////////////////////////////////////////////////


// Referenzfunktion, zum Vergleich

size_t reference_palindrome(const char* p_string)
{
    // Länge des Strings bestimmen

    size_t string_length = 0;
    while(p_string[string_length]) ++string_length;

    // Leerer String?

    if(string_length == 0) return 0;

    size_t longest_palindrome = 1;
    for(size_t start = 0; start < string_length; ++start)
    {
        for(size_t end = start + 1; end < string_length; ++end)
        {
            const size_t substring_length = end - start + 1;
            bool found = true;

            if(substring_length % 2)
            {
                // ungerade Länge

                const size_t center = (start + end) / 2;
                for(size_t i = 0; i <= substring_length / 2; ++i)
                {
                    if(p_string[center - i] != p_string[center + i])
                    {
                        found = false;
                        break;
                    }
                }
            }
            else
            {
                // gerade Länge

                for(size_t i = 0; i < substring_length / 2; ++i)
                {
                    if(p_string[start + i] != p_string[end - i])
                    {
                        found = false;
                        break;
                    }
                }
            }

            // Längeres Palindrom gefunden?

            if(found && substring_length > longest_palindrome)
                longest_palindrome = substring_length;
        }
    }

    return longest_palindrome;
}

//////////////////////////////////////////////////////////////////////////


int main()
{
    const char* p_test[] = { "",
                             "x",
                             "aa",
                             "ab",
                             "nix",
                             "xyx",
                             "otto",
                             "abcd",
                             "abcabacab",
                             "ottoottoottoerikafeuertnuruntreuefakire123" };

    bool all_correct = true;
    for(size_t i = 0; i < sizeof(p_test) / sizeof(p_test[0]); ++i)
    {
        const size_t reference_result = reference_palindrome(p_test[i]);
        const size_t my_result = my_palindrome(p_test[i]);
        const bool correct = reference_result == my_result;
        all_correct &= correct;
       
        std::cout << "s = \"" << p_test[i] << "\": " << std::endl;
        std::cout << "reference_palindrome(s) = " << reference_result << std::endl;
        std::cout << "my_palindrome(s)        = " << my_result << std::endl;
        std::cout << (correct ? "Richtig!" : "Falsch!") << std::endl;
        std::cout << std::endl;
    }

    std::cout << (all_correct ? "Alles richtig!" : "Es gab einen oder mehrere Fehler!") << std::endl;
    std::cout << std::endl << std::endl;

    return 0;
}

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

2

09.01.2008, 14:29

Zitat


#02: "Palindrom"
Typ: Kürze des Codes
Deadline: 06.01.2008
Abgabe: contest@spieleprogrammierer.de


Sorry aber war das net schon ?

3

09.01.2008, 14:36

Hmm 1. das und 2. würde es ja schon kürzer sein, wenn man const weglässt usw. ... doch ist der Code dadurch ja eher schlechter. Aber trotzdem nur Tokenanzahl von belang?
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

09.01.2008, 14:44

Sorry, hatte den alten Beitrag als Vorlage genommen.
An den beiden anderen Stellen stand aber auch das richtige Datum.

Geht auf keinen Fall von der Referenzlösung aus!
Die ist absoluter Mist! ;)


Und: ja, es zählt nur die Anzahl der Token eurer Funktion (deren Signatur ihr nicht ändern dürft). Es kann also theoretisch auch mehrere Sieger geben.

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

5

09.01.2008, 15:09

Wie is es mit definitionen ?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//stat:

if( blablabla )
{


}else{


}else{


}else{

}

//einfach:

#define MYELSE   }else{

if( blablabla )
{


MYELSE


MYELSE


MYELSE

}


???

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

09.01.2008, 15:18

woran erinnert mich das nur....*hust* DEA *hust* :D
Würde ja glatt mitmachen, aber immer dieser Leistungsdruck :oops:
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

09.01.2008, 15:34

Zitat von »"Databyte"«

Wie is es mit definitionen ?

Natürlich werden die Token nach dem Präprozessor-Schritt gezählt.
Das bringt dir also nichts.

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

8

09.01.2008, 15:35

Gibt es in Visual Studio 2005 irgend ein Tool mit dem man die Anzahl Token zählen kann. Ich habe keine Lust das immer zu zählen...
Und darf man davon ausgehen, dass das längste Palindrom eine vernünfige Länge hat (<= max_int) ?
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

09.01.2008, 15:41

Zitat von »"big_muff"«

Gibt es in Visual Studio 2005 irgend ein Tool mit dem man die Anzahl Token zählen kann. Ich habe keine Lust das immer zu zählen...
Und darf man davon ausgehen, dass das längste Palindrom eine vernünfige Länge hat (<= max_int) ?

Ich kenne kein solches Tool.
Ja, die Längen halten sich in Grenzen.

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

10

09.01.2008, 15:50

Wie zählst denn du nachher die Anzahl Token der eingereichten Lösungen? Von Hand?
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Werbeanzeige