WPC... geht weiter! -> wpc12



  • Hallo,

    der WPC lebt!

    Ich werde die Aufgabenstellung für den 12. WPC morgen abend 20:00 auf wpc.schornboeck.net posten. Die Abgabe ist dann am Freitag drauf wieder bis spätestens 20:00.

    Ich würde mich über rege teilnahme freuen.

    MfG Jester

    -------------------------------------

    WPC heißt: weekly programming contest

    zu gewinnen gibt es: Anerkennung, Ruhm und Ehre, außerdem ne Menge Spaß!



  • 🙂 🙂



  • Wenn die Aufgabe diesmal nicht zu umfangreich ist bin ich auch dabei, denke ich.



  • Jester wird wohl schlau genug sein und ne gute Aufgabe stellen. 👍



  • Morgen (Freitag, 3.3.05) geht's weiter mit Aufgabe 12!

    Ähm Freitag ist der 4.3.05 😉 (Oder meine Uhr stimmt nicht)



  • Ich hab mich zumindest redlich bemüht eine Aufgabe zu finden, die in ein paar (wenigen) Stunden lösbar ist.



  • Die Aufgabe ist jetzt da.



  • Sieht interessant aus 🙂 . Hoffentlich finde ich im Laufe der Woche Zeit sie zu lösen.

    Ich glaube du hast einen klitzekleinen Fehler in makeState... Sollte es nicht state[index]=='1' statt state[index]==1 heißen?



  • Jo richtig 🙂

    ich werd's gleich ändern.



  • Noch was...

    std::vector<bool> state1 = makeState("10011");
    std::vector<bool> state2 = makeState("11100");
    
    wpc12(state1, state2); // sollte eine Exception werfen
    

    Warum Exception. Wenn ich state1[2] umlege, dann sind doch so wie ich das verstanden habe beide gleich...



  • Hi Walli,

    wenn du state[2] bei einem 00000 vector umlegst sieht das so aus:

    0 1 2 3 4    <- INDEX
       _|_|_|_|_
       0|0|0|0|0
    
    -> state[2]
    
       0 1 2 3 4    <- INDEX
       _|_|_|_|_
       0|1|1|1|0
    

    hier noch n beispiel mit gesetzten bits

    0 1 2 3 4    <- INDEX 
       _|_|_|_|_
       0|1|0|1|0
    
    -> state[2]
    
       0 1 2 3 4    <- INDEX 
       _|_|_|_|_
       0|0|1|0|0
    


  • Walli: Dann ist aber das letzt Bit beim ersten noch gesetzt, beim zweiten nicht.



  • Jester schrieb:

    Walli: Dann ist aber das letzt Bit beim ersten noch gesetzt, beim zweiten nicht.

    Ach shit, habe ich übersehen 🙄 .



  • Coole aufgabe ! 🙂 Bin ich leider zu doof zu...



  • @ Jester: Hast du mal nen anderen Testfall der länger ist und n ergebnis liefern sollte?

    Wäre cool. Weil mit den 2 angegebenen Beispielen sicherzustellen das der Algo korrekt arbeitet, ist etwas schwierig. (IMHO)

    MfG



  • Ich werd versuchen im Laufe der nächsten Stunden was zu basteln 🙂



  • eViLiSSiMo schrieb:

    @ Jester: Hast du mal nen anderen Testfall der länger ist und n ergebnis liefern sollte?
    Wäre cool. Weil mit den 2 angegebenen Beispielen sicherzustellen das der Algo korrekt arbeitet, ist etwas schwierig. (IMHO)

    keine garantie auf richtigkeit:

    #include <vector>
    #include <string>
    #include <queue>
    #include <set>
    #include <map>
    #include <iostream>
    #include <windows.h>
    using namespace std;
    
    // Helper für leichten Aufruf. 
    std::vector<bool> makeState(std::string const& state) 
    { 
       std::vector<bool> res; 
       for(size_t index = 0; index<state.length(); ++index) 
       { 
          res.push_back(state[index]=='1'); 
       } 
       return res; 
    } 
    
    class Unsolvable {}; 
    std::vector<size_t> wpc12(std::vector<bool> & state1, std::vector<bool> & state2); 
    
    vector<bool> pressButton(size_t button,vector<bool> in){
    	vector<bool> out=in;
    	if(button-1>=0)
    		out[button-1]=!out[button-1];
    	out[button]=!out[button];
    	if(button+1<out.size())
    		out[button+1]=!out[button+1];
    	return out;
    }
    
    ostream& operator<<(ostream& out,vector<bool> const& v){
    	for(vector<bool>::const_iterator i=v.begin();i!=v.end();++i)
    		cout<<*i;
    	return out;
    }
    
    int main(){
    	typedef vector<bool> State;
    	queue<State> border;
    	map<State,size_t> seen;
    	State state=makeState("00000");
    	border.push(state);
    	seen[state]=1;
    	while(!border.empty()){
    		State current=border.front();
    		border.pop();
    		for(size_t i=0;i<current.size();++i){
    			State next=pressButton(i,current);
    			Sleep(1000);
    			if(seen[next]==0){
    				seen[next]=seen[current]+1;
    				border.push(next);
    			}
    		}
    	}
    	for(map<State,size_t>::iterator i=seen.begin();i!=seen.end();++i)
    		cout<<i->first<<' '<<i->second-1<<endl;
    	cout<<seen.size()<<endl;
    }
    

    beachte vor allem mal den fall 10110 2!



  • hey, das ist doch schonmal gut. 🙂

    Irgendwie krieg ich meine Lösung grad nicht zu laufen 😞



  • volkard schrieb:

    beachte vor allem mal den fall 10110 2!

    Ja gerade das hat bei mir net funktioniert, jetzt tut es, aber 😞 könnte besser sein

    bin grade mal bei O(n²)



  • Wenn man in volkards Lösung statt std::map<State, size_t> ne std::map<State, std::vector<size_t> > verwendet und sich den Weg da reinspeichert, dann hat man ne Lösung des kompletten Problems.

    MfG Jester


Anmelden zum Antworten