Bewerbungstest (Backend (Server)) C++ Basics



  • 40 Zeilen und 35 Zeilen sind echt verdammt kurz 👍. Hmmm... ich werde vielleicht mal noch ein bisschen an meinem Code herumschrauben :). Meine Funktion zur Umwandlung in Kleinbuchstaben ist 6 Zeilen lang (ohne Kommentare und ohne die Deklaration der Funktion mitzuzählen).

    Fellhuhn schrieb:

    Und das "ignorieren" von Sonderzeichen etc. habe ich einfach mal wörtlich genommen.

    Ich habe es so gemacht, das ich alle Sonderzeichen und Zahlen einfach aus den Strings lösche (mit einer 11 Zeilen langen Funktion, auch wieder ohne Kommentare und ohne die Deklaration der Funktion mitzuzählen) bevor sie in die std::map geschrieben werden :D.

    Wenn ich die Kommentare alle nicht mitzählen würde, wäre mein Code zwar auf jeden Fall auch kürzer als 142 Zeilen, aber ich glaube von 40 Zeilen bzw. 35 Zeilen bin ich noch ein paar Zeilen entfernt :).

    Edit: Was ich noch vergessen habe: Includes habe ich für meine oben erwähnten Funktionen auch nicht mitgezählt.



  • Mit Filterung komm ich auf 40. Etwas doof das die ganzen alten C-Funktionen immer einen int wollen und keinen char...

    EDIT: 45. Vergessen das durch simples Entfernen von Sonderzeichen ja Wörter zusammengelegt werden...



  • ohne includes und die Implementation der Funktionen zum Filtern von Zeichen und "verkleinern" der Buchstaben bin ich mit Kommentar- und leerzeilen bei 36 gelandet - lässt sich bestimmt noch quetschen 😉

    bool isNumber(std::string);
    std::string filter(std::string); //löscht Interpunktionszeichen und ändert alles auf Kleinbuchstaben
    
    typedef std::multiset<std::string> Strset;
    typedef Strset::iterator StrIter;
    
    int main()
    {
      ifstream input("input.txt");
      std::string s;
      Strset strings;
      while (input >> s)
      { 
        s = filter(s);
        if (!isNumber(s)) 
          strings.insert(s);
      } 
    
      StrIter first = strings.begin(), end = strings.end();
      while (first != end)
      {
        struct Cmp12 //vergleicht die ersten beiden Buchstaben zweier strings
        { 
          bool operator() (std::string lhs, std::string rhs) 
          { return (lhs[0]==rhs[0]) && (lhs[1]==rhs[1]); }
        }
        //range = Gruppierung nach Anfangsbuchstaben
        std::pair<StrIter> range = std::equal_range(first, end, *first, Cmp12());
        StrIter it = first = range.second;
        while (it != range.first)
        {
          unsigned int equals = it - std::find(range.first, it, *(it-1));
          std::cout << equals << "faches Vorkommen von " << *(it -= equals) << std::endl;
        }
      }
    }
    


  • 25 Zeilen, alles mitgezählt. Schön ist das aber nicht...



  • MFK schrieb:

    25 Zeilen, alles mitgezählt. Schön ist das aber nicht...

    Auch alle Sonderfälle? Sonderzeichen entfernt, dadurch keine Wörter zusammengelegt. Wörter die vorher nur durch ein Sonderzeichen getrennt waren werden danach als einzelne Wörter gewertet etc.?
    Diese Kleinigkeiten blähen den Code meist auf. 🙂

    43 ohne extremes Gestauche.



  • Also, wenn ich meinen Code so Zähle wie wie es pumuckl getan hat (ohne Inlcudes und ohne Funktionsimplemetierung) und ich außerdem noch alle Kommentare rauspfeffere dann komme ich auf 55 Codezeilen, wobei ich keine Algorithmen der STL verwende (was unter anderem auch daran liegt, das ich std::equal_range bisher noch gar nicht kannte 😉 )
    Übrigens geht meine main() so los:

    int main(int argc, char *argv[])
    {
    	if(argc != 2) {
    		cerr << "Falsche Anzahl an uebergebenen Argumenten." << endl;
    		warten();
    		return EXIT_FAILURE;
    	}
    /* ... */
    

    da bei mir der Dateiname der zu lesenden Datei mittels der Befehlszeile des Programms übergeben wird. ( warten() verhindert nur das sich das Konsolenfenster gleich wieder schließt 😉 )

    Fellhuhn schrieb:

    Wörter die vorher nur durch ein Sonderzeichen getrennt waren werden danach als einzelne Wörter gewertet etc.?

    Das habe ich bei meinem Code aber auch nicht berücksichtigt, was dazu führt, das bei mir aus 2, durch Sonderzeichen getrennte Wörter einfach ein Wort wird. Da besteht wohl auch noch Nachbesserungsbedarf bei mir :D.

    An den Threadersteller: Hast du dich eigentlich schon an der Aufgabe probiert? Und falls ja, hast du sie vielleicht schon gelöst? Wenn nicht dann immer her mit deinen konkreten Fragen, wir helfen ja gerne :).



  • 23 🤡 (Ohne Inkludes, ohne Leerzeilen, ohne Kommentare, ohne alleinstehende geschweifte Klammern, mit Body der Hilfsfunktionen)



  • eine.
    Mit allen Hilfsfunktionen und Kommentaren, allerdings ohne includes, ohne Zeilenumbrüche zwischen Befehlen, Blöcken etc. Und vor allem ohne Lesbarkeit 🤡



  • Ich finds ja schon interessant, wie aus dem Problem ein Wettbewerb um den kürzesten Code entstanden ist. 😃

    @ pumuckl:
    Gerade wollte ich vorschlagen, dass der Wettbewerb nun nach dem Kriterium "wenigste Zeichen im Code" fortgeführt werden könnte. 😉



  • pumuckl schrieb:

    eine.
    Mit allen Hilfsfunktionen und Kommentaren, allerdings ohne includes, ohne Zeilenumbrüche zwischen Befehlen, Blöcken etc. Und vor allem ohne Lesbarkeit 🤡

    Schummler :p



  • Ach wo, pro Zeile eine Anweisung und Umbrauch bei Schleifen und Bedingungen sollten wohl selbstverständlich sein.

    edit:

    Nexus schrieb:

    Ich finds ja schon interessant, wie aus dem Problem ein Wettbewerb um den kürzesten Code entstanden ist. 😃

    Ich kann's mir auch nicht erklären, ist aber irgendwie eine reizvolle Aufgabenstellung 🙂



  • Nexus schrieb:

    @ pumuckl:
    Gerade wollte ich vorschlagen, dass der Wettbewerb nun nach dem Kriterium "wenigste Zeichen im Code" fortgeführt werden könnte. 😉

    was dann mindestens ebenso unleserlich werden kann:

    using namespace std;
    typedef string S;
    typedef multiset<S> M;
    typedef M::iterator I;
    bool i(S);
    S g(S); //löscht Interpunktionszeichen und ändert alles auf Kleinbuchstaben
    bool c (S l, S r) { //vergleicht die ersten beiden Buchstaben zweier strings
      return (l[0]==r[0]) && (l[1]==r[1]); 
    }
    
    int main() {
      ifstream t("t.txt");
      S s; M m;
      while (t >> s) { 
        s = g(s);
        if (!i(s)) m.insert(s);
      } 
      I f = m.begin(), e = m.end();
      while (f != e) {
        pair<I> r = equal_range(f, e, *f, c);
        I i = f = r.second;
        while (i != r.first) {
          int n = i - find(r.first, i, *(i-1));
          cout << n << "mal " << *(i -= n) << endl;
        }
      }
    }
    

    gleicher code wie oben...



  • Du hast ein #define t typedef vergessen, das spart nochmal 7 Buchstaben :p



  • Meine Güte, ihr klaut mir meine Ideen! Jetzt hatte ich gerade vor, die Spielregeln auf #define zu erweitern... 😃



  • pumuckl schrieb:

    cout << n << "mal " << *(i -= n) << endl;
    

    Eine Kleinigkeit könnte man daran noch kürzer fassen:

    cout << n << "x " << *(i -= n) << endl;
    

    😉
    Hoffentlich gibts solche Wettbewerbe nicht wirklich, denn der Code sieht ja schrecklich aus 😮.



  • Ich bin jedenfalls hier gelandet (merkwürdige Einlese-Art, weil z.B. Hallo[Welt] sonst nur ein einziges Wort wäre):

    #include <algorithm>
    #include <string>
    #include <map>
    #include <set>
    #include <fstream>
    #include <iostream>
    #include <boost/filesystem.hpp>
    
    typedef std::map< std::string, std::set<std::string> > StringCtr;
    StringCtr data;
    std::map<std::string,int> counts;
    
    void cvtChar( char& c )
    {
    	c = isalpha(c)?  tolower(c)  :  '\0';
    }
    
    void printWord( const std::string& s )
    {
    	std::cout << "  ";
    	if ( counts[s] > 1 )
    		std::cout << counts[s] << "x ";
    	std::cout << s << std::endl;
    }
    
    int main( int argc, char** argv )
    {
    	// Datei komplett binär einlesen
    	std::ifstream f( argv[1], std::ios::binary );
    	std::vector<char> buf( boost::filesystem::file_size(argv[1])+1 );
    	f.read( &buf[0], buf.size() );
    
    	// Buchstaben werden ge-lower-t und alles Sonstige wird zu '\0'.
    	std::for_each( buf.begin(), buf.end(), cvtChar );
    
    	// Ganze Wörter extrahieren
    	for ( size_t i=0; i<buf.size()-1;  )
    	{
    		// Nächstes Wort suchen
    		while ( !buf[i] && i<buf.size()-1 )
    			++i;
    
    		if ( i < buf.size()-1 )
    		{
    			// Wort zu Datenbestand hinzufügen
    			const std::string txt = &buf[i];
    			data[txt.substr(0,2)].insert( txt );
    			++counts[txt];
    			i += txt.size();
    		}
    	}
    
    	// Ausgabe gruppiert nach ersten zwei Anfangsbuchstaben, umgekehrt sortiert.
    	for ( StringCtr::iterator i=data.begin(); i!=data.end(); ++i )
    	{
    		// Gruppenname ausgeben
    		std::cout << i->first << ":" << std::endl;
    
    		// Rückwärts alle Wörter der Gruppe ausgeben (mit eventuellem Zähler)
    		std::for_each( i->second.rbegin(), i->second.rend(), printWord );
    	}
    }
    


  • Badestrand schrieb:

    Du hast ein #define t typedef vergessen, das spart nochmal 7 Buchstaben :p

    Wenn schon, dann aber ein anderer Buchstabe, wegen

    ifstream t("t.txt");
    

    Mizar schrieb:

    Hoffentlich gibts solche Wettbewerbe nicht wirklich, denn der Code sieht ja schrecklich aus 😮.

    Doch, gibt es. Ähnlich wäre die Kategorie Code-Verschleierung (IOCCC).



  • Nexus schrieb:

    Mizar schrieb:

    Hoffentlich gibts solche Wettbewerbe nicht wirklich, denn der Code sieht ja schrecklich aus 😮.

    Doch, gibt es. Ähnlich wäre die Kategorie Code-Verschleierung (IOCCC).

    Offenbar gibt es tatsächlich für alles irgendeinen Wettbewerb :D.

    Wikipedia schrieb:

    Den Beiträgen werden jedes Jahr in zahlreichen Kategorien wie z. B. [...] Most Erratic Behavior (dt.: unberechenbarstes Verhalten) Preise verliehen.

    Programmierer wollen anscheinend auch mal Spaß haben :D.



  • Nunja, ich muss dir beipflichten, zum thema "übervorderung" ^^ weil es mir ein wenig viel scheint für jemanden der in seine Bewerbung schreibt: "ich plane mich in naher zukunft enger mit dem thema zu befassen, da mir leider bisher die zeit dazu fehlte." Ich habe so gut wie keine grundkenntnisse, in der schule habe ich einen html kurs besucht und festgestellt, dass mir das riesenspaß macht 🙂 daher interessiere ich mich für den beruf. auch das mit dem goldtablett stimmt natürlich. jedoch bin ich jemand, der wenn er die fertige arbeit vor sich hat, sich versucht einen reim darauf zu machen wie das alles funktioniert. von daher würde es den lerneffekt und einen zeitaufschub gewähren. ich stecke leider im moment in einem praktikum von dem ich erst gegen 6 uhr abends nach hause komme, und um 5 uhr morgens auch schon wieder hoch muss ... da kriegt ich das niemals hin. ich wäre dir sehr dankbar, wenn du mir dein werk schicken würdest und mir vielleicht für rückfragen zur verfügung stehen könntest 🙂 das wäre prima 😃 vielen dank im vorraus, auch an alle anderen die sich bemüht haben mir bei meinem problem zu helfen, ich werd mich bemühen in den nächsten tagen meine schlüsse daraus zu ziehen 🙂

    p.s.: eigentlich müsstest du mir das per mail schicken können, hab ich zumindest erlaubt 🙂



  • Fellhuhn schrieb:

    MFK schrieb:

    25 Zeilen, alles mitgezählt. Schön ist das aber nicht...

    Auch alle Sonderfälle? Sonderzeichen entfernt, dadurch keine Wörter zusammengelegt. Wörter die vorher nur durch ein Sonderzeichen getrennt waren werden danach als einzelne Wörter gewertet etc.?

    Ja. Ich musste aber noch eine Zeile hinzufügen, g++ 4 wollte nicht ohne <iterator>. Außerdem wollte er die Casts für irgendwelche Überladungen für isalpha und tolower.

    Ich könnte noch eine Zeile sparen, wenn ich einen istream_iterator aus einem temporären stringstream erstellen könnte, aber auch das lässt mich der g++ 4 nicht machen, MSVC 8.0 hingegen schon.

    #include <fstream>
    #include <map>
    #include <string>
    #include <cctype>
    #include <algorithm>
    #include <vector>
    #include <functional>
    #include <iostream>
    #include <sstream>
    #include <iterator>
    int main()
    {
        std::stringstream ss;
        ss << std::ifstream("test.cpp").rdbuf();
        std::string s = ss.str();
        std::replace_if(s.begin(), s.end(), std::not1(std::ptr_fun(static_cast<int(*)(int)>(std::isalpha))), ' ');
        std::transform(s.begin(), s.end(), s.begin(), static_cast<int(*)(int)>(std::tolower));
        ss.str(s);
        std::vector<std::string> vs = std::vector<std::string>(std::istream_iterator<std::string>(ss), std::istream_iterator<std::string>());
        std::map<std::string, std::map<std::string, int> > m;
        for(size_t i=0; i<vs.size(); ++i)
            m[vs[i].substr(0, 2)][vs[i]]++;
        for(std::map<std::string, std::map<std::string, int> >::iterator i = m.begin(); i != m.end(); ++i)
            for(std::map<std::string, int>::reverse_iterator j = i->second.rbegin(); j != i->second.rend(); ++j)
                std::cout << j->first << " (" << j->second << ")\n";
    }
    

    Eine sinnvolle Aufgabe für einen Bewerbungstest für eine Ausbildungstelle ist das aber IMHO nicht.


Anmelden zum Antworten