Announcement

Collapse
No announcement yet.

Mastermind - Testen der Gewinnstrategie

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new 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
    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

    Comment


    • #3
      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.

      Comment


      • #4
        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".

        Comment


        • #5
          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.

          Comment


          • #6
            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, 18:28.
            ~~ Ondra „Ravu al Hemio“ Hošek
            I know what PC LOAD LETTER means

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

            Comment


            • #7
              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.
              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.

              Comment


              • #8
                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

                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.

                Comment


                • #9
                  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.

                  Comment


                  • #10
                    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!

                    Comment


                    • #11
                      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.

                      Comment


                      • #12
                        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

                        Comment


                        • #13
                          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.

                          Comment

                          Working...
                          X