Bewerbungstest (Backend (Server)) C++ Basics



  • 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