Programmieraufgabe zur Nacht

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #61
    So, umgeschrieben, und nun findet die Funktion irgendwann aufjedenfall eine Formel, die korrekt auflöst. Wird nur nicht unbedingt die kürzeste sein. Hab das mit der Klammerung irgendwie stark unterschätzt:

    PHP-Code:


    <?php

        
    // Testcase = (1*2)-(2*3)+(4-5)-(5+6)
        
    $sTest '(5*6)+(7*8)+(4-5)-(9+10)';
        eval(
    '$iCaseResult = '$sTest.';');
        echo 
    $sTest ."="$iCaseResult;
        echo 
    "<br />";
        
        echo 
    nerdize(array(7,9,63,567));

        function 
    nerdize($aList) {
            
    // Liste kopieren
            
    $aListCopy $aList;
        
            
    // Hilfsfunktion in Funktion deklarieren (JA DAS GEHT <img src="images/smilies/wink.gif" border="0" alt="">)
            
    function setMatrixElement($iIndex, &$aMatrix) {
                
    // Wenn die Operation eine Division ist, und wir nicht beim
                // ersten Element sind, wird das Vorgängerelement erhöht, und
                // das aktuelle wieder auf + gesetzt
                
    if($aMatrix[$iIndex] == '/' AND $iIndex != 0) {
                    
    $aMatrix[$iIndex] = '+';
                    
    setMatrixElement($iIndex-1, &$aMatrix);
                } else {
                    
    // Andernfalls wird das Element einfach auf den nächsten Operator gesetzt
                    
    switch($aMatrix[$iIndex]) {
                        case 
    '+':
                            
    $aMatrix[$iIndex] = '-';
                            break;

                        case 
    '-':
                            
    $aMatrix[$iIndex] = '*';
                            break;

                        case 
    '*':
                            
    $aMatrix[$iIndex] = '/';
                            break;
                    }
                }
            }
        
            
    // Integrität des Array prüfen
            
    if(
                    !
    is_array($aList)
                    OR
                    
    count($aList) <= 1
                
    ) {
                
    // Zu wenig Elemente
                
    return false;
            }

            foreach(
    $aList as $mIndex => $mItem) {
                if(!
    is_numeric($mItem)) {
                    
    // Nicht numerisch
                    
    return false;
                } else {
                    
    // Auf int casten, Dezimalzahlen fuck off
                    
    $aList[$mIndex] = (int) $mItem;
                }
            }

            
    // Ergebnis entfernen und vorhalten
            
    $iZielErgebnis array_pop($aListCopy);
            
    $iTrash array_pop($aList);

            
    // Rechenoperationen:
            // + - * /
            
    $iOperatoren 4;

            
    // Durchlaufen und testen <img src="images/smilies/wink.gif" border="0" alt="">
            // Wir machen den Durchlauf zweimal, und versuchen beim zweiten mal Klammern
            // mit einzubeziehen
            
            // Scheiß auf Klammerung. Wir bauen uns die verfügbaren Zahlen hinten dran,
            // wenn das Beste Ergebnis kleiner ist, als das gewünschte Ergebnis! Das gibt
            // dann zwar lange Formeln, aber wenigstens das richtige Ergebnis - irgendwann
            
    $bPhilsStone false;
            
    $iRounds 0;
            while(!
    $bPhilsStone) {
                
    // Wenn die Lösung nicht gefunden, Anzahl der zur Verfügung stehenden Zahlen
                // verändern
                
    if($iRound 0) {
                    
    // Das war mehr als der erste Durchgang
                    // Wir nehmen uns die Zahl, dessen Index der Durchlaufnummer entspricht minus eins
                    
    $aList[] = $aList[$iRound-1];
                }
                
                
    // Anzahl Elemente
                
    $iOperationen count($aList) - 1;
        
                
    // Maximale Durchgänge ermitteln
                
    $iMaxRunden pow($iOperatoren$iOperationen);
                
                
    // Matrix erstellen
                
    $aMatrix = array();
                for(
    $i 0$i $iOperationen$i++) {
                    
    $aMatrix[$i] = '+';
                }
                
                for(
    $i 0$i $iMaxRunden$i++) {
                    
    // Formel erzeugen
                    
    $sFormel '';
                    foreach(
    $aList as $iIndex => $iZahl) {
                        
    // Zahl
                        
    $sFormel.= $iZahl;
        
                        
    // Operator
                        
    if(isset($aMatrix[$iIndex])) {
                            
    $sFormel.= $aMatrix[$iIndex];
                        }
                    }
        
                    
    // Formel evaluieren
                    
    eval(
                        
    '
                            $iErgebnis = '
    $sFormel.';
                        '
                    
    );
        
                    if(
    $bKlammern) {
                        
    // Klammerung
                    
    } else {
                        
    // Hatten wir schonmal ein Ergebnis?
                        
    if(isset($sBesteFormel)) {
                            
    // Ja
                            // Aktuelle Differenz ermitteln
                            
    $iDifferenz abs(($iErgebnis $iZielErgebnis));
                            if(
    $iDifferenz == OR $iDifferenz $iBesteDifferenz) {
                                
    $sBesteFormel $sFormel;
                                
    $iBesteDifferenz abs(($iErgebnis $iZielErgebnis));
                                
    $iBestesErgebnis $iErgebnis;
                            }
                        } else {
                            
    // Nein
                            // Speichern
                            
    $sBesteFormel $sFormel;
                            
    $iBesteDifferenz abs(($iErgebnis $iZielErgebnis));
                            
    $iBestesErgebnis $iErgebnis;
                        }
                    }
        
                    
    // Matrix für den nächsten Durchlauf modifizieren
                    
    setMatrixElement(count($aMatrix) - 1, &$aMatrix);
                }
                
                if(
    $iBestesErgebnis == $iZielErgebnis) {
                    
    $bPhilsStone true;
                } else {
                    
    $iRound++;
                    
    flush();
                }
              }

            return 
    'Beste Formel: '$sBesteFormel.'='$iBestesErgebnis;
        }

    ?>
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #62
      Los, Kür den Gewinner. Falls ich Gewinne, hab ich ne tolle Aufgabe
      [FONT="Helvetica"]twitter.com/unset[/FONT]

      Shitstorm Podcast – Wöchentliches Auskotzen

      Kommentar


      • #63
        Ich bin gespannt, will die Aufgabe wissen und auch mal hier mitmachen =)

        Kommentar


        • #64
          OffTopic:
          @server-hoster: Deine Serverzeit ist ja noch ferner ab vom schuss als die des Forums!

          Kommentar


          • #65
            jo, is mri auch grad aufgefallen^^ mail an hetzner support is draußen^^ hab die extra vor der installation von debian (vorgestern) gefragt "ja, muss ich da was umstellen" Antwort: "Nein, das haben wir schon angepasst" -.- Wenn man sich auf jemanden verlässt^^

            Aber ich würd sagen: Wirküren die seite zur Informativsten Seite des Monats :-P

            _______

            edit: so besser?^^

            Kommentar


            • #66
              / Vote 4 unset


              Will auch bei einer Aufgabe mitmachen =)

              Kommentar


              • #67
                Nagut, entgegen der vorherigen Ankündigung werde ich nicht mehr bis morgen früh warten. Ich beginne jetzt damit, die Lösungen zu testen und in einer Stunde, als ca. 12 Uhr gebe ich den Gewinner bekannt. Bis dahin können noch Lösungen gepostet werden und werden noch berücksichtigt.

                Kommentar


                • #68
                  ich die uhr in meinem server gestellt^^

                  Kommentar


                  • #69
                    Original geschrieben von Bueddl
                    ich die uhr in meinem server gestellt^^
                    Große Leistung als angehender Hoster.

                    Kommentar


                    • #70
                      danke danke^^ hab ich aber nti viel mit am hut^^ ich hab nur mit geholfen eingerichten und etwas getestet^^

                      Kommentar


                      • #71
                        Original geschrieben von Schanz
                        / Vote 4 unset
                        allein das "// Hilfsfunktion in Funktion deklarieren (JA DAS GEHT ..." wäre für mich schon ein ausschlusskriterium

                        gibt es auch ein konjunktivpreis?

                        also ich hätte einen genetischen algorithmus drauf angesetzt, ist das erste, was mir bei der aufgabenstellung eingefallen ist.
                        nur habe ich leider nicht so viel zeit wie ihr

                        Kommentar


                        • #72
                          Der Sieger steht fest. Es ist unset!
                          Herzlichen Glückwunsch. Die Wandermedaille geht zurück an den Stifter.

                          Hier die genauen Bewertungen mit Anzahl Fehler, min/max/avg Abweichung vom Ergebnis, min/max/avg Länge der Formeln.

                          1. unset: 0 Fehler, 0/0/0 Abweichung, 3/16/8.86 Länge
                          2. TheFish511: 0 Fehler, 0/1/0.43 Abweichung, 7/245/78.43 Länge
                          3. eintrachtemil: 0 Fehler, 0/0/0 Abweichung, 23/10205/1995.57 Länge
                          4. PHP-Desaster: 0 Fehler, 0/567/97.28 Abweichung, 0/12/4.57 Länge

                          Fish ist auf Platz 2 obwohl seine Lösung nicht immer exakt ist. Mit einer durchschnittlichen Formellänge von 2000 Zeichen wird Emil das hoffentlich verzeihen.



                          So Jungs, auf zur nächsten Runde. unset, lass hören!
                          Zuletzt geändert von onemorenerd; 04.07.2008, 01:06.

                          Kommentar


                          • #73
                            Mit ein paar Minuten Aufwand auf dem Treppchen - optimal!

                            Und sehr subjektiv betrachtet finde ich meine Formeln irgendwie schön. Würden sich sogar für ne Tapete eignen
                            Simploo CMS - das einfache Webseiten-Bearbeitungsprogramm

                            Kommentar


                            • #74
                              4. PHP-Desaster: 0 Fehler, 0/567/97.28 Abweichung, 0/12/4.57 Länge
                              Länge 0 und keine Fehler? Bist du dir da sicher?
                              Kannst du die Testcases auch einmal veröffentlichen?

                              Kommentar


                              • #75
                                Die Testcases waren
                                1,2,3
                                2,3
                                5,9,3,4,2
                                1,2,3,4,5,10,1
                                121,13,3,11,1,104
                                7,28,3,14,13
                                63,9,7,567

                                Beim letzten Case gibt dein Script nur "=" aus. Das ist natürlich ein Fehler, da nicht alle Zahlen untergebracht wurden. Danke für den Hinweis.
                                Ich habe die Testroutine korrigiert, aber es ändert sich nichts an der Platzierung. Die Ergebnisse für die anderen Teilnehmer sind unverändert und deine Bewertung sieht so aus:
                                1 Fehler, 0/5/1.85 min/max/avg Abweichung, 1/13/6.43 min/max/avg Länge

                                Kommentar

                                Lädt...
                                X