Results 1 to 13 of 13

Thread: Mastermind - Testen der Gewinnstrategie

  1. #1
    Master
    Join Date
    Nov 2010
    Posts
    171
    Thanks
    146
    Thanked 33 Times in 21 Posts

    Mastermind - Testen der Gewinnstrategie

    ich glaub jetzt eine funktionierende Gewinnstrategie gefunden zu haben und bin am überlegen, wie ich die jetzt möglichst effizient in einem größeren Ausmaß testen könnte. Dazu würde ich jetzt gern wissen, in welche Richtung ich da etwas probieren soll. Meine Ideen bisher:


    • Server und Client modifizieren, sodass sie nicht mehr automatisch beendet werden, sondern immer ein neues Spiel beginnen, wobei die Geheimsequenz von einem Textfile eingelesen wird
    • Das ganze mit einem Shell-Script immer wieder aufrufen


    Gibts dazu vielleicht Tipps, was hier am praktikabelsten ist?

  2. #2
    Principal
    Join Date
    Nov 2010
    Posts
    54
    Thanks
    8
    Thanked 8 Times in 7 Posts
    Ich habs mit einem Shellscript gelöst:

    Code:
    #!/bin/bash
    
    color[0]=b
    color[1]=d
    color[2]=g
    color[3]=o
    color[4]=r
    color[5]=s
    color[6]=v
    color[7]=w
    
    for k in {1..10}
    do
            for i in {1..100}
            do
                    ./server 4242 ${color[$RANDOM % 8]}${color[$RANDOM % 8]}${color[$RANDOM % 8]}${color[$RANDOM % 8]}${color[$RANDOM % 8]} >> /dev/null &
                    sleep 0
                    ./client localhost 4242 >> client_out_${k}
            done
    
            cat client_out_${k} | awk '{ SUM += $1 } END { print SUM/NR }' >> avg
            rm client_out_${k}
    done
    
    cat avg | awk '{ SUM += $1 } END { print SUM/NR }' >> avg
    Der Durchschnitt von 10x100 Durchläufen wird berechnet und in avg gespeichert, anschließend wird an avg noch der Durchschnitt aller 10 Durchläufe angefügt.
    sleep 0 hab ich eingebaut da ich keine Möglichkeit kenn weniger als eine Sekunde zu schlafen, und meistens reicht die Zeit die sleep 0 benötigt aus, damit der Server gestartet ist bevor sich der Client verbindet.

    Geht sicherlich eleganter, bin kein Shell-Guru

  3. The Following User Says Thank You to (pi) For This Useful Post:


  4. #3
    Master
    Join Date
    Nov 2010
    Posts
    171
    Thanks
    146
    Thanked 33 Times in 21 Posts
    Quote Originally Posted by (pi) View Post
    Ich habs mit einem Shellscript gelöst:
    vielen Dank für dein Script, habs natürlich gleich ausprobiert, allerdings da folgende Schwierigkeiten damit:

    Code:
    test.sh: 3: color[0]=b: not found
    test.sh: 4: color[1]=d: not found
    test.sh: 5: color[2]=g: not found
    test.sh: 6: color[3]=o: not found
    test.sh: 7: color[4]=r: not found
    test.sh: 8: color[5]=s: not found
    test.sh: 9: color[6]=v: not found
    test.sh: 10: color[7]=w: not found
    test.sh: 23: Bad substitution
    ./client: socket() failed
    awk: fatal: division by zero attempted
    awk: fatal: division by zero attempted
    hab leider noch keine Ahnung von Shell Scripts, darum noch keine Idee, wo ich hier anfangen soll Fehler zu suchen.

  5. #4
    Principal
    Join Date
    Nov 2010
    Posts
    54
    Thanks
    8
    Thanked 8 Times in 7 Posts
    Ich glaub du verwendest dash und nicht bash (dash ist afaik jetzt Standard bei Ubuntu, ich nehm an du benutzt Ubuntu?), das ist einfach eine andere Shell. Versuch mal "bash test.sh".

  6. The Following User Says Thank You to (pi) For This Useful Post:


  7. #5
    Principal
    Join Date
    May 2010
    Location
    Wien
    Posts
    59
    Thanks
    9
    Thanked 11 Times in 8 Posts
    Achtung, blöde Frage im Anflug! :P
    Bei meiner Strategie hab ich schon beim "manuellen Testen" eine Kombination gefunden, die mein Client nicht errät, also nach 35 Runden verliert. Damit werd ich womöglich keine Bonuspunkte kriegen... aber ich darf es an sich so abgeben? Oder muss der Client in jedem "worst case" gewinnen?

    mfG, Christoph.

  8. #6
    Dipl.Ing Ravu al Hemio's Avatar
    Join Date
    Dec 2009
    Location
    einmal TU, immer TU
    Posts
    1,380
    Thanks
    81
    Thanked 619 Times in 445 Posts
    Du verspielst damit die Bonuspunkte, aber als reguläre Abgabe taugt's noch immer.

    EDIT: Falls sich deine Lösungsstrategie deterministisch verhält (bei jeder Kombination jeweils immer dieselbe Vorgehensweise), kannst du folgendes, naives Shellscript zum Durchtesten aller Möglichkeiten verwenden:
    Code:
    #!/bin/sh
    
    colors="b d g o r s v w"
    
    client_output_file="test_client_output"
    fails_file="test_fails"
    avgs_file="test_avgs"
    port=4242
    
    for c1 in $colors
    do
    	for c2 in $colors
    	do
    		for c3 in $colors
    		do
    			for c4 in $colors
    			do
    				for c5 in $colors
    				do
    					colorcombo="$c1$c2$c3$c4$c5"
    
    					./server "$port" "$colorcombo" > /dev/null &
    					serverpid="$!"
    
    					sleep 0.2
    
    					clientoutput="`./client localhost "$port"`"
    
    					if [ "$?" -eq 3 ]
    					then
    						# client has failed this combination
    						echo "$colorcombo" >> "$fails_file"
    					else
    						echo "$colorcombo: $clientoutput" >> "$client_output_file"
    					fi
    
    					# client has exit; kill server just in case
    					kill "$serverpid" 2>/dev/null
    				done
    			done
    		done
    	done
    done
    
    # calculate average (thanks to (pi))
    awk '{ SUM += $2 } END { print SUM/NR }' "$client_output_file" >> "$avgs_file"
    Vorsicht: es nimmt an, dass der Client jeweils nur die Anzahl benötigter Runden ausgibt. Außerdem wird nur der Durchschnitt der Versuche bei erratenen Kombinationen berechnet.
    Last edited by Ravu al Hemio; 04-04-2012 at 19:28.
    ~~ Ondra „Ravu al Hemio“ Hošek
    not an architect

    Tutor außer Dienst · OOP · OS · PK · PP

  9. The Following 2 Users Say Thank You to Ravu al Hemio For This Useful Post:


  10. #7
    Super Moderator Kampi's Avatar
    Join Date
    Feb 2002
    Location
    Elysium
    Posts
    2,161
    Thanks
    256
    Thanked 619 Times in 348 Posts
    Quote Originally Posted by (pi) View Post
    sleep 0 hab ich eingebaut da ich keine Möglichkeit kenn weniger als eine Sekunde zu schlafen,
    tja, dabei war die loesung (zumindest auf den mir bekannten gnu/linux distris) nur ein "man sleep" entfernt... "sleep 0.5". manche unserer lieben bsd-freunde sind natuerlich wie immer jahre hinter her . du koenntest aber auch zb mit "pgrep" schauen ob ein server laeuft.
    Quote Originally Posted by (pi) View Post
    Ich glaub du verwendest dash und nicht bash (dash ist afaik jetzt Standard bei Ubuntu, ich nehm an du benutzt Ubuntu?), das ist einfach eine andere Shell.
    egal. genau dafuer ist ja der shebang da.
    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  11. The Following User Says Thank You to Kampi For This Useful Post:


  12. #8
    Principal
    Join Date
    Nov 2010
    Posts
    54
    Thanks
    8
    Thanked 8 Times in 7 Posts
    Quote Originally Posted by Kampi View Post
    tja, dabei war die loesung (zumindest auf den mir bekannten gnu/linux distris) nur ein "man sleep" entfernt... "sleep 0.5".
    Stimmt, ich hab einfach mal nach "Pause for NUMBER seconds." zu lesen aufgehört und sleep 0 ausprobiert :P

    Quote Originally Posted by Kampi View Post
    egal. genau dafuer ist ja der shebang da.
    Dachte ich mir auch, als ich allerdings das Script per dash aufgerufen hab, hab ich dieselben Fehlermeldungen bekommen - drum hab ich angenommen dass es trotzdem über dash gelaufen ist.

  13. #9
    Super Moderator Kampi's Avatar
    Join Date
    Feb 2002
    Location
    Elysium
    Posts
    2,161
    Thanks
    256
    Thanked 619 Times in 348 Posts
    Quote Originally Posted by (pi) View Post
    Dachte ich mir auch, als ich allerdings das Script per dash aufgerufen hab, hab ich dieselben Fehlermeldungen bekommen.
    da ist aber ein gewaltiger unterschied ob du in der dash bist und das script ausfuehrst, oder ob du es dem programm dash auf der commandline mit gibst:
    Code:
    ~ % cat test.sh
    #!/bin/bash
    
    color[0]=b
    ~ % echo $SHELL
    /bin/zsh
    ~ % ./test.sh # alles ok, bash uebernimmt
    ~ % dash
    $ ./test.sh # alles ok, bash uebernimmt
    $  exit # back to zsh
    ~ % dash ./test.sh # dash uebernimmt, und bei der dash kommt nie was gutes raus
    ./test.sh: 3: color[0]=b: not found
    127  ~ %
    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  14. #10
    Master
    Join Date
    Nov 2010
    Posts
    171
    Thanks
    146
    Thanked 33 Times in 21 Posts
    Quote Originally Posted by (pi) View Post
    Ich glaub du verwendest dash und nicht bash (dash ist afaik jetzt Standard bei Ubuntu, ich nehm an du benutzt Ubuntu?), das ist einfach eine andere Shell. Versuch mal "bash test.sh".
    ähm, tja, du hast natürlich recht, danke!

  15. #11
    Super Moderator Kampi's Avatar
    Join Date
    Feb 2002
    Location
    Elysium
    Posts
    2,161
    Thanks
    256
    Thanked 619 Times in 348 Posts
    Quote Originally Posted by testsieger View Post
    ähm, tja, du hast natürlich recht, danke!
    das wuerde mich jetzt aber schon interessieren... wie hast du das script aufgerufen als es _nicht_ funktioniert hat?
    *) in der dash mit "./test.sh"?
    *) in der dash mit "dash ./test.sh"?
    *) in der dash mit "sh ./test.sh"?
    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  16. #12
    Master
    Join Date
    Nov 2010
    Posts
    171
    Thanks
    146
    Thanked 33 Times in 21 Posts
    Quote Originally Posted by Kampi View Post
    das wuerde mich jetzt aber schon interessieren... wie hast du das script aufgerufen als es _nicht_ funktioniert hat?
    *) in der dash mit "./test.sh"?
    *) in der dash mit "dash ./test.sh"?
    *) in der dash mit "sh ./test.sh"?
    ursprünglich hab ich sh ./test.sh probiert, und funkioniert hats dann mit bash ./test.sh

  17. The Following User Says Thank You to testsieger For This Useful Post:


  18. #13
    Super Moderator Kampi's Avatar
    Join Date
    Feb 2002
    Location
    Elysium
    Posts
    2,161
    Thanks
    256
    Thanked 619 Times in 348 Posts
    Quote Originally Posted by testsieger View Post
    ursprünglich hab ich sh ./test.sh probiert, und funkioniert hats dann mit bash ./test.sh
    alles klar! die "sh" linkt AFAIK auf die dash und dann funktionierts nicht. haettest du "chmod +x test.sh && ./test.sh" gemacht, haette die bash (wegen dem shebang) uebernommen und es haette funktioniert.
    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  19. The Following User Says Thank You to Kampi For This Useful Post:


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •