Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » 1. Sonntagsrätsel

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 <
020
17.07.2002, 17:22 Uhr
~NemoEimi
Gast



Zitat:

Siehst du Möglichkeiten, es schneller zu machen?


Hier ist mal eine schnellere Version:


C++:
#include<iostream.h>
#include<vector>
#include<stdio.h>
#include<cstdlib>

int main(int argc, char *argv[]) {
   vector<char> zahl, w;
   int n = atoi(argv[1])-1; int neue_laenge = 2;
   zahl.push_back(1);
   cout << 1 << " " << 2 << " ";
   for (int i = 1; i<n; i++) {
     char counter = 1; char jetzige_ziffer = zahl[0]; int laenge = zahl.size();
     int position = 0;
     w.resize(neue_laenge); jetzige_ziffer = zahl[0];
     for (int j = 1; j < laenge; j++) {
       if (zahl[j]==jetzige_ziffer)
         counter = counter + 1;
        else
         {
     w[position]=counter; w[position+1]=jetzige_ziffer; counter = 1;
     jetzige_ziffer = zahl[j]; position = position + 2;
     }
       }
     w[position]=counter; w[position+1]=jetzige_ziffer;
     laenge = neue_laenge; zahl.resize(laenge);
     neue_laenge = 2; jetzige_ziffer = w[0];
     for (int j = 0; j < laenge; j++) {
       zahl[j]=w[j];
       if (w[j]!=jetzige_ziffer) {jetzige_ziffer=w[j]; neue_laenge=neue_laenge+2;}
       }
     cout << neue_laenge << " ";
   }
   return(0);
}



Man kann das natürlich noch weiter verbessern, indem man noch kompaktere Datenstrukturen wählt. Wesentlich interessantere Möglichkeiten sehe ich da so ad hoc nicht.

Grüße,
NemoEimi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
17.07.2002, 22:10 Uhr
virtual
Sexiest Bit alive
(Operator)


Na, auf dich ist verlass!

Ich weiss nicht genau, ob es kompaktere Datenstrukturen bringen, haengt auch davon ab, was Dir so vorschebt. Also supercompakt waeren zwar so immer 2 Bits pro Ziffer, aber dafuer waere das auseinanderfrimeln der Bits wiederum zeitaufwendig.

Ich habe leider noch nicht die Zeit für eine eigene Lösung gefunden, werde mir aber - wie versprochen/angekuendigt - noch eine ausdenken.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
18.07.2002, 11:02 Uhr
Christian
C/C++ Master
(Operator)


Hallo!

Ich habe das ganze nicht mit ANSI gelöst sondern auf den MFC Datentyp CString zurückgegriffen.


C++:
CString Wurm1 = "1";
    CString Wurm2 = "";
    CString temp = "";
    CString ausgabe = "";
    int pos = 0;
    int ziffer = 0;
    int len = 0;

    for(int l = 0; l <= 26; l++)
    {
    
    while (pos < Wurm1.GetLength())
    {
        ziffer = Wurm1.GetAt(pos) - '0';
        if(Wurm1.GetLength() > pos + 1)
        {
            if((Wurm1.GetAt(pos + 1)-'0') == ziffer)
            {
                len = 2;
                if(Wurm1.GetLength() > pos + 2)
                {
                    if((Wurm1.GetAt(pos + 2) - '0') == ziffer)
                    {
                        len = 3;
                    }
                }
            }
            else
                len = 1;
        }
            
        else
            len = 1;

        
        temp.Format("%d%d", len, ziffer);
        Wurm2 += temp;
        pos += len;
        
    }
    ausgabe.Format("%d. Zeichenanzahl: %d\n\n\n", l + 2, Wurm2.GetLength() /*,LPCSTR(Wurm2)*/);
    cout << LPCSTR(ausgabe) << endl;    

    Wurm1 = Wurm2;
    Wurm2 = "";
    pos = 0;
    }





Ist wahrscheinlich langsamer (wahrscheinlich viel langsamer), aber ich finde es sehr angenehm mit der CString Klasse zu coden.

Grüße
--
Grüße, Christian

Dieser Post wurde am 18.07.2002 um 11:02 Uhr von Christian editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
19.07.2002, 14:04 Uhr
virtual
Sexiest Bit alive
(Operator)


Da ich mich in der Mittagspause gelangweilt habe, hier meine Loesung fuer das Quersummenraetsel. Damit die Lösung überhaupt eine Daseinsberechtigung hat, ist es eine C++ Lösung (Leif hatt ja schon eine C Lösung geschrieben):

C++:
#include <string>
#include <cstdlib>
#include <cctype>

int main()
{
        std::string strArtikelNr;

        // Eingabe machen - Damit die Artikelnr. mit fuehrenden Nullen klar geht,
        // machen wir das auf Stringbasis.
        std::cout << "Bitte Artikelnummer ohne Pruefziffer angeben: " << std::flush;
        std::cin >> strArtikelNr;

        // Eingabe prüfen und Quersumme berechnen
        unsigned quersumme = 0;
        if (strArtikelNr.length() != 9)
        {
                std::cerr << "*** Eingabe falsch (nicht 9 Zeichen lang)!" << std::endl;
                exit(EXIT_FAILURE);
        }
        for(std::string::size_type j=0; j<9; ++j)
        {
                if (!isdigit(strArtikelNr[j]))
                {
                    std::cerr << "*** Eingabe falsch (" << (j+1)
                                          << ". Zeichen keine Ziffer)!" << std::endl;
                exit(EXIT_FAILURE);
                }
                quersumme += strArtikelNr[j]-'0';
        }

        // Pruefziffer berechnen und ausgeben
        int pruefziffer = 7 - quersumme%7;
        std::cout << "Artikelnummer " << strArtikelNr << " hat die Pruefziffer "
              << pruefziffer << std::endl;
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 19.07.2002 um 14:06 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
20.07.2002, 11:49 Uhr
virtual
Sexiest Bit alive
(Operator)


Hi,

ich hab mal zwei Lösungen zum Wurmrätsel gemacht, die erste guckt nicht auf die Performance, sondern ist eher als Gimmick gedacht:

C++:
#include <iostream>
#include <string>

std::string&
replace_all(
    std::string& str,
    const std::string& search,
    const std::string& replace)
{
    std::string::size_type diff_len = replace.length()-search.length()+1;

    for(std::string::size_type i=str.find(search);
        std::string::npos != i;
        i=str.find(search, i+diff_len))
    {
        str.replace(i, search.length(), replace);
    }
    return str;
}


std::string&
next_generation(
    std::string& worm)
{
    replace_all(worm, "111", "A");
    replace_all(worm, "11", "B");
    replace_all(worm, "222", "C");
    replace_all(worm, "22", "D");
    replace_all(worm, "333", "E");
    replace_all(worm, "33", "F");

    replace_all(worm, "1", "11");
    replace_all(worm, "2", "12");
    replace_all(worm, "3", "13");
    replace_all(worm, "A", "31");
    replace_all(worm, "B", "21");
    replace_all(worm, "C", "32");
    replace_all(worm, "D", "22");
    replace_all(worm, "E", "33");
    replace_all(worm, "F", "23");

    return worm;
}


int
main()
{
    int max_generation;
    std::string worm("1");
    std::cout << "Bitte max. Generation eingeben: " << flush;
    std::cin >> max_generation;
    for(int i=1; i<=max_generation; ++i, worm=next_generation(worm))
    {
        std::cout << "Generation " << i << ": " << worm.length() << endl;
    }
}


Naja, ohne Worte halt.

Die andere Lösung war schon eher ernst gemeint, kommt aber auch nicht an die Performance von der Lösung von NemoEimi dran (der Unterschied ist deutlich). Ist auch sehr unübersichtlich geworden:

C++:
#include <iostream>
#include <vector>

typedef std::vector<int> worm_t;

worm_t&
next_generation(
    worm_t& worm)
{
    worm_t::size_type current_size = worm.size();
    worm_t::size_type expected_size = 0;
    worm_t::size_type j = 0;
    worm_t::size_type k = 0;
    int digit;

    while(j<current_size)
    {
        digit = worm[j];
        k = j;

        while (digit == worm[j])
        {
            worm[k] += 10;
            ++j;
        }
        expected_size += 2;
    }

    worm.resize(expected_size);

    j = expected_size;
    k = current_size;
    while (k!=0)
    {  
        if ((digit=worm[k-1])>10)
        {        
            worm[--j] = digit%10;
            worm[--j] = digit/10;
            if (--k>j) k = j;
        }else  
            --k;
    }

    return worm;
}


int
main()
{
    int max_generation;

    worm_t worm;
    worm.push_back(1);
    std::cout << "Bitte max. Generation eingeben: " << flush;
    std::cin >> max_generation;
    for(int i=1; i<=max_generation; ++i, worm=next_generation(worm))
    {  
        std::cout << "Generation " << i << ": " << worm.size() << endl;
    }
}


Sorry Christian, Deien Lösung konnte ich nicht vergleichen, schaut aber gut aus. Ich denke, daß das Format allerdings der Performance killer sein wird.
Schönes Wochenende,
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 20.07.2002 um 11:54 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
20.07.2002, 11:56 Uhr
virtual
Sexiest Bit alive
(Operator)


Besteht interesse an weiteren Rästeln?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
20.07.2002, 12:39 Uhr
Bruder Leif
dances with systems
(Operator)



Zitat:
virtual postete
Besteht interesse an weiteren Rästeln?


HER DAMIT!!! *lechz*

Tschööööööööö
Leifus
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
20.07.2002, 12:55 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo virtual,
Mein Standpunkt:
Ich empfinde es eigentlich als eine gute von Dir in das Leben gerufene "Einrichtung" (Sonntagsrätsel). Eigentlich. Man sollte jedoch berücksichtigen, dass das Forum viele, entschuldigt jetzt den Ausdruck, Programmieranfänger besuchen. Dem sollten wir Rechnung tragen und evtl. in "leicht" und "schwieriger" unterteilen. Ist dann vielleicht auch eine Motivation für jene welche mit dem Programmieren anfangen, darüber nachzudenken sich dann an solchen Aufgaben zu beteiligen. Nehmen wir noch mal das Bsp. Schachbrett und speziell das Springer-(Pferd)Problem. Ich schätze das es dann eine geringe Beteiligung gibt.
Anders herum wäre für unsere "Anfanger" so etwas interssant (denke ich jedenfalls): "Entwickle einen Algorithmus zur Berechnung von PI (auf n-Stellen)" usw.. Aber es gibt ja nicht nur meine Meinung
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
20.07.2002, 14:21 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Wir könnten ja ein Forum

C/C++ Rätsel hinzufügen!

und in den Betreff schreibt man dann am Anfang:

A (= Anfänger)
F (= Fortgeschritten)
E (= Experte)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
20.07.2002, 14:59 Uhr
virtual
Sexiest Bit alive
(Operator)


@flo
gute idee!
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: