Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Programmieraufgabe zur Nacht [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Programmieraufgabe zur Nacht


Seiten : [1] 2

 
unset
01-07-2008, 23:27 
 
Hallo,

neulich, beim herumalbern in der Mittagspause, kam mir der Gedanke, was wohl für ein Tag wäre, wenn man ständig einen Tag in der Woche vergessen hätte. Den lustigen "Bummerstag" zwischen Dienstag und Mittwoch. Vielleicht hätte man Glück, und es wäre schon Wochenende. Kurzes aber schallendes Gelächter, und die Sache war vergessen. Aber da heute in Köln Schienenchaos herrschte, kam mir eine Idee: Der Bummerstag wurde wiederentdeckt und zum 1.1.1970 eingeführt. Schreibe eine Funktion, die aus einem übergebenen Timestamp den dazugehörigen Wochentag unter berücksichtigung des Bummerstags berechnet.

Der schönste/kreativste Code wird mit einer eigenst gemalten Medaille geehrt. :)

 
Abraxax
02-07-2008, 00:04 
 
Original geschrieben von unset
Der schönste/kreativste Code wird mit einer eigenst gemalten Medaille geehrt. :) du bist krank ... :D

kein wunder, bei zu wenig schlaf. *gg*

 
Flip7
02-07-2008, 02:22 
 
Informatikstudenten haben doch nachts Zeit :-D


<?php


/**
* Rechnet mit dem Bummerstag.
*/
class BummersDate
{

/**
* Meine Woche sieht so aus.
*/
private static $my_week = array(
"Montag", /*0*/
"Dienstag", /*1*/
"Bummerstag", /*2*/
"Mittwoch", /*3*/
"Donnerstag", /*4*/
"Freitag", /*5*/
"Samstag", /*6*/
"Sonntag" /*7*/
);

/**
* R&uuml;ckgabe der {@link BummersDate::weekday()} Funktion.
*/
private static $weekday_output = "Heute wäre %s!";

/**
* Gibt heutigen Tag auf deutsch zur&uuml;ck mit
* Ber&uuml;cksichtigung des Bummerstages.
*
* @param int der Zeitstempel
* @return string theoretischer heutiger Tag auf deutsch
*/
public static function weekday($timestamp)
{

//Montag, Dienstag, Bummerstag, Mittwoch,
//Donnerstag, Freitag, Samstag, Sonntag
$days_per_week = count(self::$my_week);

//Sekunden pro Tag
$sec_per_day = 60 * 60 * 24;

//Vergangene Tage (seit 1.1.1970)
$days = (int)($timestamp / $sec_per_day);

//Heutige Tag, Montag = 0, Dienstag = 1, ...
$today = $days % $days_per_week;

//Modulo Rechnung => keine Warnung für falschen Index
assert($today < $days_per_week);

//Wochentag ausgeben
return sprintf(self::$weekday_output, self::$my_week[$today]);

}
}


echo BummersDate::weekday(time());

?>


Ausgabe:
Heute wäre Samstag!

UND, ja es wäre quasi Wochenende ;) !

greetz Flip

 
onemorenerd
02-07-2008, 06:22 
 
echo(($i=eval('for($l=date("z")+date("w",0),$i=date("Y")-1;$i>=date("Y",0);$i--,$l+=date("z",mktime(0,0,0,12,31,$i))+1);
return$l;')%8)==3?'Bumsday':$i<3?date('l'):date('l',mktime(0,0,0,1,date('w',0)+$i-1,date('Y',0))));

:dontknow:

Vielleicht nicht korrekt, aber dafür kreativ. Braucht nur date() und mktime(), das eval() ist nur Zucker.

 
combie
02-07-2008, 10:44 
 
Nein!
Heute ist kein Wochenende!

$woche = array( "Sonntag",
"Montag",
"Dienstag",
"Bummerstag",
"Mittwoch",
"Donnerstag",
"Freitag",
"Samstag",
);

$starttag = date('w',mktime(0,0,1,1,1,1970)); // offset berechnen
$eintag = 24*60*60;
$tage = ceil(time() / $eintag); // Tage seit dem 1.1.1970
$tage += $starttag; // der 1.1.1970 war KEIN Sonntag
$wochentag = $tage % count($woche);

echo $woche[$wochentag];




@Flip7
Du hast leider 3 fette Böcke drin:
1. Die Woche fängt mit Sonntag an (in PHP)
2. (int) rundet ab! deswegen werden angefange Tage abgeschnitten. Also berechnest du Gestern
3. der 1.1.1970 war weder ein Sonntag, noch ein Montag

 
dunixphp
02-07-2008, 11:04 
 
ihr habt echt Zeit :)

 
unset
02-07-2008, 11:15 
 
Immer noch sinnvoller, als das 200. Clanscript zu schreiben ;)

 
Wyveres
02-07-2008, 11:22 
 
also laut dem Script von combie währe heute also bummerstag?

obwohl ich das für eine ziemlich absurde idee halte, Witzig ist es :D

vieleicht nochmehr solcher fun denksport aufgaben ^^

 
unset
02-07-2008, 11:46 
 
Die darf sich der Gewinner ausdenken, der um 23:30 gekürt wird ;)

 
MelloPie
02-07-2008, 12:16 
 
Ich hab da mal ne wichtige Frage: haben wir am Bummerstag frei oder is malochen angesagt????

 
unset
02-07-2008, 12:20 
 
Das ist natürlich ein ganz normaler Wochentag. ;)

 
MelloPie
02-07-2008, 15:30 
 
Son Mist...

 
onemorenerd
02-07-2008, 15:44 
 
Wer schreibt jetzt eigentlich die Genesis um? Irgendwas muß Gott doch am Bummerstag erschaffen haben oder hat er sich etwa 'ne Pause gegönnt? "Und Gott sprach: Heute mach ich mal nichts. Da machte Gott nichts. Und es geschah nichts. Und Gott sah, dass es gut war. Da ward aus Abend und Morgen der vierte Tag."

 
combie
02-07-2008, 16:14 
 
Nix wichtiges hat der da gemacht...
Nur LSD erfunden und sofort ausprobiert.
Siehe: http://www.dict.cc/englisch-deutsch/bummer.html

 
Abraxax
02-07-2008, 21:52 
 
*move*

ich hab' den thread mal nach OOO verschoben ...

ihr seid ja alle krank ..... :D

 
unset
02-07-2008, 23:24 
 
Ok, ich denke, es kommt nix mehr rein. Herzlichen Glückwunsch onemorenerd, hier ist deine Medaille http://sandbox.devtimes.de/store/medaille.gif, und du bist dran, mit der nächsten Aufgabe ;)

 
onemorenerd
03-07-2008, 02:28 
 
:danke:

Meine Aufgabe ist eher was für Knobler.

Gegeben sei eine Liste (Array) mit beliebig vielen natürlichen Zahlen (ohne 0). Das letzte Element der Liste ist das Ergebnis einer Berechnung der anderen Listenelemente mit den Grundoperationen +, -, * und /.
Gesucht ist eine Formel, die jedes Listenelement 1...n-1 mindestens einmal enthält und mit den Grundoperationen so anordnet, dass das Ergebnis der Formel das Listenelement n ist oder zumindest so gut wie möglich annähert.

Ein Beispiel:
Eingabe 2,56,10,4711,90
Ausgabe (4711 / 56) + 10 - 2 = 92.125

Es gewinnt die Lösung mit der besten Annäherung an das Ergebnis und der kürzesten Formel.

 
combie
03-07-2008, 10:36 
 
// zahlen = 34,33,23,4,27

echo (34-33)*23+4;

 
unset
03-07-2008, 11:18 
 
Liste: 1,2,3
Formel: 1+2=3


Ich glaube aber auch, die Aufgabenstellung nicht ganz verstanden zu haben ;)

 
Griecherus
03-07-2008, 11:54 
 
@unset: Meinem Verständnis der Aufgabenstellung nach müsstest du damit gewonnen haben ;)

Grüße

 
unset
03-07-2008, 12:03 
 
Nein ...

Liste: 1,1
Formel: 1=1

:D

 
Griecherus
03-07-2008, 12:32 
 
Da ist jetzt aber keine einzige Operation mehr vorhanden. Setzen - 6! :D

 
onemorenerd
03-07-2008, 12:32 
 
Hm, ist die Aufgabe wirklich so unverständlich? Dann versuche ich es nochmal.

Es gilt ein Script zu schreiben, dem man z.B. als GET-Parameter ?in=2,56,10,4711,90 übergibt. Die letzte Zahl in dieser Reihe ist das Ergebnis einer Berechnung aus den anderen Zahlen und den Grundrechenoperationen.

Das Script soll versuchen, aus der Eingabe die ursprüngliche Berechnung zu rekonstruieren. Von dieser Berechnung ist bekannt, dass sie beliebig oft die Zeichen +, -, *, /, (, ), außerdem jede der Zahlen aus der Eingabe mindestens einmal, jedoch die letzte Zahl der Eingabe genau einmal und genau ein = enthielt.

Einige Beispiele, zuerst ein ganz einfaches:
1,2,3 => Ausgabe "1+2=3"
Das nächste Beispiel zeigt, dass jede Zahl (außer die letzte, die ist ja das Ergbnis) beliebig oft verwendet werden kann:
2,3 => Ausgabe "2+2/2=3"
Im dritten Beispiel kommen Klammern vor:
5,9,3,4,2 => Ausgabe "5+9-(3*4)=2"

Ich werde gleich noch den Code posten, mit dem ich die Lösungsvorschläge teste und bewerte. Sobald ich ihn fertig habe. ;)
Spätestens dann sollte jeder die Aufgabe verstehen können.

 
unset
03-07-2008, 12:35 
 
Autsch. Und dafür Zeit bis Morgen früh?

 
combie
03-07-2008, 12:51 
 
Das ist doch ***** !!!

1. Das setzen der Klammern
2. Die Mehrfachverwendung der Zahlen

Treiben Rechenzeit ins Unermessliche!
Die Anzahl möglicher Kombinationen ist unbegrenzt.
Permanent muß man auf eine div durch null aufpassen.

 
eintrachtemil
03-07-2008, 13:30 
 
Quick & Dirty. Aber ohne Nährung, immer mit dem exakten Ergebnis nach den Vorgaben :)


<?php
$zahlen = explode(',', $_GET['in']);
$ergebnis = $zahlen[count($zahlen)-1];

$reihe = implode(' + ', array_splice($zahlen, 0, count($zahlen)-1));

$berechnung = array();
for($i = 1; $i <= $ergebnis; $i++){
$berechnung[] = "($reihe) / ($reihe)";
}

echo implode(' + ', $berechnung).' = '.$ergebnis;
?>

 
onemorenerd
03-07-2008, 13:53 
 
Hier die Testroutine. Ich werde mir natürlich verschiedene Testformeln ausdenken. ;)
Beim Aufruf eurer Lösung komme ich euch entgegen. Ihr müsst die Eingabe nicht über GET holen. Ich schau mir euren Code an und fummel mir das zurecht.
<?php
header('Content-Type: text/plain');

// Testcase, von mir ausgedacht.
$formel = '5+9-(3*4)';
$ergebnis = eval('return '.$formel.';');

echo "Testcase : $formel=$ergebnis\n\n";


// Eingabe für eure Scripte vorbereiten.
$zahlen = preg_split("/\+|\-|\*|\/|\(|\)|=/", $formel, -1, PREG_SPLIT_NO_EMPTY);
$zahlen = array_unique($zahlen);
shuffle($zahlen);
$eingabe = implode(',', $zahlen).','.$ergebnis;

echo "Eingabe : $eingabe\n\n";


// Aufruf eures Scripts. Whitespace wird aus der Ausgabe entfernt.
$ausgabe = file_get_contents('http://localhost/deinScript.php?in='.$eingabe);
$ausgabe = str_replace(array(' ', "\t", "\r", "\n"), '', $ausgabe);

echo "Ausgabe : $ausgabe\n\n";


// Ausgabe in Formel und Ergebnis zerlegen.
$teile = explode('=', $ausgabe);

// Prüfe Bedingung "genau ein =".
if (count($teile) !== 2)
die('FEHLER: Nicht genau ein "=".');

// Prüfe Bedingung "jede Zahl mindestens einmal".
$zahlen_ausgabe = preg_split("/\+|\-|\*|\/|\(|\)|=/", $teile[0], -1, PREG_SPLIT_NO_EMPTY);
if (count(array_diff($zahlen_ausgabe, $zahlen)) !== 0)
die('FEHLER: Nicht jede Zahl der Eingabe mindestens einmal verwendet oder unerlaubte Zeichen.');

// Prüfe Korrektheit der Lösung. Rundung auf 2 Nachkommastellen.
$ergebnis_ausgabe = round(eval('return '.$teile[0].';'), 2);
if ($ergebnis_ausgabe !== round($teile[1], 2))
die('FEHLER: Ausgabe ist nicht korrekt.');

echo "Genauigkeit: ".($ergebnis - $ergebnis_ausgabe);

?>

 
onemorenerd
03-07-2008, 14:12 
 
Die Nacht ist übrigens schon vorbei. Also verlängern wir mal bis ... keine weiteren Lösungsvorschläge mehr zu erwarten sind.

Wegen Division durch Null muss niemand aufpassen. Die Eingabe besteht aus natürlichen Zahlen ohne 0.
Und ja, es stimmt, dass die Anzahl möglicher Lösungen i.A. unbegrenzt ist. Aber es sollen ja auch nicht alle sondern nur eine Lösung bestimmt werden.

Original geschrieben von combie
1. Das setzen der Klammern
2. Die Mehrfachverwendung der Zahlen

Treiben Rechenzeit ins Unermessliche!

Dann hast du den falschen Ansatz. Hier ist ein Lösung mit linearer Komplexität. ;)
for ($i = 1; $i < end($in); $i++)
$out .= '+'.$in[0].'/'.$in[0];
}
for ($i = 1; $i < count($in)-1; $i++) {
$out .= '+('.$in[$i].'-'.$in[$i].')';
}
echo trim($out, '+').'='.end($in);

Vielleicht ist der Code jetzt nicht ganz korrekt. Der Ansatz ist jedenfalls dieser:
1,2,3 => Ausgabe "1/1+1/1+1/1+(2-2)=3"
2,3 => Ausgabe "2/2+2/2+2/2=3"
5,9,3,4,2 => Ausgabe "5/5+5/5+(9-9)+(3-3)+(4-4)=2"

Diese Lösung ist zwar wunderschön linear in ihrer Laufzeit, aber leider auch in der Länge der Ausgabe, so dass man damit sicher keinen Blumentopf gewinnt. Aber es ist bewiesen, dass es geht. Und es ist auch nicht besonders schwierig.

 
unset
03-07-2008, 14:27 
 
Ist ja doof, wenn du deine Aufgabe postest, wenn Leute die Arbeiten müssen schon im Bettchen sind, und die Lösung dann erwartest, wenn Leute die Arbeiten müssen ... arbeiten.

Poste mal ne Reihe von Testcases. Ich hab da ne Idee, die werde ich mir zuhause mal zusammenfrickeln ;)

Wobei das echt ne harte Nuss ist. Wenn man nicht grade einen extrem großen Algorithmus zusammenschreiben will, muss man sich auf eine der beiden Kriterien konzentrieren: Exaktes Ergebnis oder kurze Formel. :(

 
eintrachtemil
03-07-2008, 14:33 
 
...und der kürzesten Formel.
Shit, das habe ich ganz überlesen:)

 
onemorenerd
03-07-2008, 14:36 
 
Ich konnte halt letzte Nacht nicht früher hier reinschauen und das Ausdenken der Aufgabe hat auch noch eine Weile gedauert. Heute morgen hat dann der Server rumgemuckt. Aber wie gesagt gibt es kein Zeitlimit. Wer Angst hat, vom plötzlichen Ende überrascht zu werden, kann ja kurz bekannt geben, dass er an der Aufgabe sitzt. Dann hab ich eine Übersicht und warte bis alle Lösungen da sind.
Ansonsten kündige ich einfach irgendwann (nicht vor morgen früh) an, dass ich in einer Stunde den Gewinner küre. Wer in dieser Stunde noch eine Lösung bringt, ist mit im Rennen.

Hier noch ein paar Testfälle, die letzte Zahl ist wieder das Ergebnis:
1,2,3,4,5,10,1 => 1*(2-3)+4*5/10=1
1,3,11,13,121,104 => ((121-13)*3-(11+1))/3=104
3,7,14,28,13 => 7+(3/14)*28=13
7,9,63,567 => (63/7)*9*7=567

weitere Testfälle hinzugefügt

 
case
03-07-2008, 15:28 
 
mensch ist das unfair...

ich habe auch schon richtig lust darauf, mich da mal dran zu setzen aber ich muss noch soooo lange arbeiten :mad:

 
PHP-Desaster
03-07-2008, 15:37 
 
Bin auf der Arbeit, aber habe mal kurz die Mittagspause genutzt und das hier zusammengeknüppelt:
<?php

function OneMoreNerd( $input, $max=1000, &$iteration=0, $delta=5 ) {
if( is_string( $input ) ) {
$input = explode( ',', $input );
}

$result = array_pop( $input );
$n = count( $input );
$operators = array( '+', '-', '*', '/' );
$intervalBottom = $result - $delta;
$intervalTop = $result + $delta;

do {
$try = '';

for( $i=0; $i<$n-1; $i++ ) {
$try .= $input[$i];
$try .= $operators[rand( 0, count( $operators )-1 )];
}
$try .= end( $input );
if( ($iteration++)>$max ) {
return( null );
}

$tryRes = eval( 'return '.$try.';' );
}
while( $tryRes < $intervalBottom || $tryRes > $intervalTop );

return( $try );
}

$iteration = 0;
$result = OneMoreNerd( $argv[1], $argv[2], $iteration, $argv[3] );
if( is_null( $result ) ) {
echo 'found no solutions';
}
else {
echo 'found '.$result.' after '.$iteration.' iterations';
}

?>Verwendet keine Klammersetzung und ich nutze jede Ziffer nur einmal, ist also noch keine hübsche Lösung. Will das aber trotzdem schon mal loswerden ;)

 
combie
03-07-2008, 15:59 
 
Es kann sich sehr wohl eine Division durch null ergeben!

4/(3-3)

 
PHP-Desaster
03-07-2008, 16:06 
 
Es kann sich sehr wohl eine Division durch null ergeben!

4/(3-3)Richtig. Aber bei einer Division durch Null wird "lediglich" eine Warnung ausgelöst, die kannst du in diesem Falle ausnahmsweise ignorieren ;)

 
onemorenerd
03-07-2008, 16:09 
 
PHP-Desasters Funktion produziert für die selbe Eingabe unterschiedliche Ergebnisse.

Das ist nicht schlimm, kein Fehler. Aber ich werde die Testroutine so umschreiben, dass sie eure Lösungen für jede Eingabe mehrmals aufruft und so eine mittlere Genauigkeit feststellt. Außerdem werde ich die maximal Abweichung in die Bewertung mit einbeziehen.

@PHP-Desaster: Deine Formeln sind erstaunlich kurz. Respekt. Um das korrekte Ergebnis zu bekommen, müsste ich $max auf unendlich und $delta auf 0 setzen. Allerdings gibt es schon bei $delta = 1 überhaupt kein Ergebnis mehr (ich habs ca. 100 mal probiert). :(
Für die Bewertung dieser Lösung werde ich übrigens die Defaults der Parameter verwenden, also 1000 und 5.

 
TheFish511
03-07-2008, 16:39 
 
Ok, dann mach ich auch mal mit. Wollte eigentlich eine Funktion(bzw. Funktionen) schreiben, die viel mehr Varianten durchspielen, aber keine Lust. :D
Solange die Zahlen nicht zu groß werden, bzw. solange es eine kleine Zahl gibt, ist es recht genau und schnell.


class math
{
public $ergebnis = 0;
public $rechnung;
public function oneMoreNerd()
{
$zahlen = func_get_args();
$erg = array_pop($zahlen);
$min = min($zahlen);
$this->calc($min, $erg);
for ($i = 0; $i < count($zahlen); $i++)
$this->rechnung .= '(' . $zahlen[$i] . ' - ' . $zahlen[$i] . ')';
}

private function calc($min, $erg)
{
if ($this->ergebnis < $erg) {
$maximum = $this->ergebnis + $min - $erg;
$minimum = $this->ergebnis - $erg;
$maximum < 0 ? $maximum *= -1 : $maximum;
$minimum < 0 ? $minimum *= -1 : $minimum;
if ($maximum < $minimum) {
$this->ergebnis += $min;
$this->rechnung .= $min . ' + ';
$this->calc($min, $erg);
}
}
}
}

$m = new math();
$m->oneMoreNerd(4, 6, 5);
echo $m->rechnung . ' = ' . $m->ergebnis;

 
unset
03-07-2008, 16:58 
 
In 12 Minuten nach der Raucherpause runtergeballert. Die Klammerung habe ich noch nicht berücksichtigt, das mache ich dann zuhause. Ich hab mich extra in Pause gebucht ;)


<?php

// Testcase = ((8*16)/(5-1))*3 = 96

echo nerdize(array(1, 4, 3, 8, 16, 96));

function nerdize($aList) {
// Liste kopieren
$aListCopy = $aList;

// Hilfsfunktion in Funktion deklarieren (JA DAS GEHT ;))
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;

// 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] = '+';
}

// Durchlaufen und testen ;)
// Wir machen den Durchlauf zweimal, und versuchen beim zweiten mal Klammern
// mit einzubeziehen
$bKlammern = false;
for($i = 0; $i < 2; $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 == 0 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);
}

// Das nächste (und letzte mal) mit Klammersetzung
$bKlammern = true;
}

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

?>

 
onemorenerd
03-07-2008, 17:01 
 
@TheFish511: Dein $m->rechnung läßt sich nicht eval'n. Bisher 0 Punkte. Aber es ist noch viel Zeit um es zu verbessern. ;)

 
onemorenerd
03-07-2008, 17:07 
 
@unset: Wow, extrem kurze Formeln! Leider nicht immer exakt. Bei 7,9,63,567 kommst du auf 574.

 
unset
03-07-2008, 17:10 
 
Die Funktion gibt auch nur die beste gefundene Formel aus. Im Grunde Bruteforce ich die Operationen zwischen den übergebenen Werten ;)

 
combie
03-07-2008, 17:14 
 
Original geschrieben von PHP-Desaster
Richtig. Aber bei einer Division durch Null wird "lediglich" eine Warnung ausgelöst, die kannst du in diesem Falle ausnahmsweise ignorieren ;)
Achso, es dreht sich gar nicht um mathematisch korrekte Ergebnisse....
Dann ist die Aufgabe ja einfach zu lösen.

Dann wird mir auch klar, wieso die erste Medallie .......

 
unset
03-07-2008, 17:15 
 
Ich denke eine Formel, die durch 0 teilt, wird nicht gewertet ... obwohl Sie auch gar kein Ergebnis auswerfen dürfte.

 
onemorenerd
03-07-2008, 17:43 
 
Original geschrieben von combie
Achso, es dreht sich gar nicht um mathematisch korrekte Ergebnisse....
Was nicht mathematisch korrekt ist, kann ich nicht eval'n. Das gilt übrigens auch für die Division durch Null. Was sich nicht eval'n läßt, wird mit 0 Punkten bewertet.

Dann wird mir auch klar, wieso die erste Medallie .......
... an mich ging? Ich war selbst überrascht, zumal eine Funktion erwartet wurde, die einen Timestamp bekommt. Aber ich kann zumindest nachträglich zeigen, dass meine Lösung mit wenigen Änderungen korrekt ist. Dazu packe ich sie in eine Funktion und setze bei jedem date(), das bisher keinen 2. Parameter hatte den Funktionsparameter ein. Aus dem echo wird ein return und fertig.
function getDay($t) {
return(($i=eval('for($l=date("z",$t)
+date("w",0),$i=date("Y",$t)-1;$i>=date("Y",0);
$i--,$l+=date("z",mktime(0,0,0,12,31,$i))+1);
return$l;')%8)==3?'Bumsday':$i<3?date('l',$t):
date('l',mktime(0,0,0,1,date('w',0)+$i-1,date('Y',0))));
}
Das gibt es auch in lesbar.
function getDay($t) {
// Tage des angebrochenen Jahres
// + Offset des 1.1.1970 (war ein Donnerstag)
$l = date("z", $t) + date("w", 0);

// + Tage aller Jahre von 71 bis heute
// (date berücksichtigt Schaltjahre)
for ($i = date("Y", $t) - 1; $i >= date("Y", 0); $i--)
$l+=date("z", mktime(0, 0, 0, 12, 31, $i)) + 1;

return (
($i = $l % 8) == 3
? 'Bumsday'
: $i < 3
? date('l', $t)
: date('l', mktime(0, 0, 0, 1, date('w', 0) + $i - 1, date('Y', 0)))
);
}
Da fehlt jetzt das eval(), aber ansonsten ist es genau der selbe Code, nur etwas hin und her geschoben.

 
TheFish511
03-07-2008, 17:49 
 
Darf man mathematisch korrekte Umformungen verwenden? Also darf man statt 6+6+6, 3*6 ausgeben?

 
case
03-07-2008, 17:52 
 
Original geschrieben von onemorenerd

Das gibt es auch in lesbar.


Nein, Trinitätsoperatoren sind generell nicht lesbar ;)

 
unset
03-07-2008, 17:53 
 
So wie ich die Regeln interpretiere, darf man das nicht, wenn die Liste aus 6 und 18 besteht. (Übrigens merke ich grade, dass meine Funktion hier versagen würde ;))

 
onemorenerd
03-07-2008, 18:18 
 
Naja du darfst natürlich umformen, wenns hilft. Aber du musst halt trotzdem die Testroutine bestehen und die akzeptiert nur Zahlen, die in der Eingabe vorkamen. Wenn du dir die 3 aus dem Hut zauberst, hast du verloren.

 
TheFish511
03-07-2008, 18:28 
 
Hmm, ok dann brauch ich gar nicht weiter machen. Auch gut.:)

 
UzumakiNaruto
03-07-2008, 18:37 
 
hat euch schonmal einer gesagt das ihr krank seit? egal in welcher hinsicht ... solche sätze wie "in 12 minuten nach der raucherpause runtergeballert" sind nicht mehr normal.

in 12 minuten hätte ich sicherlich 30 mal neu begonnen und am ende nur ein <?php ?> gehabt.

naja .. jetzt weiß ich auf jedenfall wie blöd ich doch in sachen programmierung bin ... danke :D

 
Kropff
03-07-2008, 19:40 
 
Original geschrieben von UzumakiNaruto
naja .. jetzt weiß ich auf jedenfall wie blöd ich doch in sachen programmierung bin ... danke :D
dafür hast du ein privatleben :D

und möglicherweise auch nicht die entsprechende ausbildung :)

peter

 
UzumakiNaruto
03-07-2008, 19:46 
 
Original geschrieben von Kropff
dafür hast du ein privatleben :D

und möglicherweise auch nicht die entsprechende ausbildung :)

peter

nein .. fachinformatiker / systemintegration geht ein wenig an der programmierung vorbei .. dafür kenne ich mich umso besser mit pcs/server aus

 
TobiaZ
03-07-2008, 19:48 
 
dafür hast du ein privatleben Das hat der unset auch. Ist nur die frage, wie das mit den sozialen Kontakten abläuft... *duck* und *weg* :D

 
Kropff
03-07-2008, 20:10 
 
wie das mit den sozialen Kontakten abläuft
genau das meine ich. schau dir tobiaz an, der hängt zu jeder tages- und nachtzeit hier im forum herum :D

peter

 
UzumakiNaruto
03-07-2008, 20:15 
 
Original geschrieben von Kropff
genau das meine ich. schau dir tobiaz an, der hängt zu jeder tages- und nachtzeit hier im forum herum :D

peter

ach .. der hat sich mal ein wochende rangesetzt und ein php bot geschrieben ... der liegt sicherlich unter irgendeiner palme und lässt es sich gut gehen :D

 
Kropff
03-07-2008, 20:20 
 
der liegt sicherlich unter irgendeiner palme und lässt es sich gut gehen
mit einem notebook auf dem bauch? mit einem wlan-anschluss in der karibik? selbst wenn das stimmte (was es nicht tut), könnte man so was privatleben nennen? :D

peter

 
TobiaZ
03-07-2008, 20:21 
 
Kennste Klausurphase. Jeden Tag eine. Da bleibt einem nur Tag und Nacht. ;)

 
Kropff
03-07-2008, 20:32 
 
Original geschrieben von TobiaZ
Kennste Klausurphase. Jeden Tag eine. Da bleibt einem nur Tag und Nacht. ;)
und warum bist trotzdem ständig hier im forum? das beeinträchtigt den lernerfolg doch ganz erheblich. :)

peter

 
unset
03-07-2008, 20:33 
 
Also, wer mich persönlich kennt, der weiß was für ein Privatleben ich habe. Das übersteigt an Intesität locker einen Großteil der Normalsterblichen ;)

Ich muss bei meiner Lösung aber auch gestehen, dass ich die über ein paar Stunden im Kopf geformt habe ;)

 
TheFish511
03-07-2008, 20:33 
 
naja .. jetzt weiß ich auf jedenfall wie blöd ich doch in sachen programmierung bin ... danke

Naja, ich finde die Aufgabe auch ein bisschen groß für einen Tag. Ich meine, unset's Lösung find' ich enorm gut, aber wenn man mal nur kleine Zahlen übergibt, aber dafür ein großes Ergebnis, dann geht damit auch nichts.
Man müsste eigentlich "nur" eine Funktion schreiben, die alle Möglichkeiten ausprobiert, bis ein gutes Ergebniss gefunden wurde. Da man aber jede Zahl öfters verwenden darf und auch klammern setzen kann, wird das aber, wie ich finde, etwas zu viel für einen Tag. Aber es soll ja auch nicht perfekt sein.

Naja, damit ich vlt. mehr als 0 Punkte hab. :D

class math
{
public $ergebnis = 0;
public $rechnung;
public function oneMoreNerd()
{
$zahlen = func_get_args();
$erg = array_pop($zahlen);
$min = min($zahlen);
$this->calc($min, $erg);
for ($i = 0; $i < count($zahlen); $i++)
$this->rechnung .= '(' . $zahlen[$i] . ' - ' . $zahlen[$i] . ') + ';
$this->rechnung = substr($this->rechnung, 0, -2);
}

private function calc($min, $erg)
{
if ($this->ergebnis < $erg) {
$maximum = $this->ergebnis + $min - $erg;
$minimum = $this->ergebnis - $erg;
$maximum < 0 ? $maximum *= -1 : $maximum;
$minimum < 0 ? $minimum *= -1 : $minimum;
if ($maximum < $minimum) {
$this->ergebnis += $min;
$this->rechnung .= $min . ' + ';
$this->calc($min, $erg);
}
}
}
}

$m = new math();
$m->oneMoreNerd(11,27,52,24);
echo $m->rechnung . ' = ' . $m->ergebnis;
eval("\$m->rechnung = \"$m->rechnung\";");

 
unset
03-07-2008, 21:07 
 
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

// 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 == 0 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;
}

?>

 
unset
03-07-2008, 21:31 
 
Los, Kür den Gewinner. Falls ich Gewinne, hab ich ne tolle Aufgabe :D

 
Bueddl
03-07-2008, 22:12 
 
Ich bin gespannt, will die Aufgabe wissen und auch mal hier mitmachen =)

 
TobiaZ
03-07-2008, 22:37 
 
@server-hoster: Deine Serverzeit ist ja noch ferner ab vom schuss als die des Forums! :D

 
Bueddl
03-07-2008, 22:41 
 
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?^^

 
Schanz
03-07-2008, 22:54 
 
/ Vote 4 unset :D


Will auch bei einer Aufgabe mitmachen =)

 
onemorenerd
03-07-2008, 22:58 
 
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.

 
Bueddl
03-07-2008, 23:02 
 
ich die uhr in meinem server gestellt^^

 
TobiaZ
03-07-2008, 23:09 
 
Original geschrieben von Bueddl
ich die uhr in meinem server gestellt^^ Große Leistung als angehender Hoster. ;) :respekt: :D

 
Bueddl
03-07-2008, 23:21 
 
danke danke^^ hab ich aber nti viel mit am hut^^ ich hab nur mit geholfen eingerichten und etwas getestet^^

 
3DMax
04-07-2008, 00:27 
 
Original geschrieben von Schanz
/ Vote 4 unset :D
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 :D

 
onemorenerd
04-07-2008, 01:03 
 
Der Sieger steht fest. Es ist unset!
Herzlichen Glückwunsch. Die Wandermedaille geht zurück an den Stifter. http://sandbox.devtimes.de/store/medaille.gif

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!

 
eintrachtemil
04-07-2008, 08:55 
 
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;)

 
PHP-Desaster
04-07-2008, 09:23 
 
4. PHP-Desaster: 0 Fehler, 0/567/97.28 Abweichung, 0/12/4.57 LängeLänge 0 und keine Fehler? Bist du dir da sicher?
Kannst du die Testcases auch einmal veröffentlichen?

 
onemorenerd
04-07-2008, 09:56 
 
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

 
unset
04-07-2008, 10:55 
 
Original geschrieben von 3DMax
allein das "// Hilfsfunktion in Funktion deklarieren (JA DAS GEHT ..." wäre für mich schon ein ausschlusskriterium ;)
Ach und warum?

Edit: Die Aufgabe kommt irgendwann im Laufe des Tages, erfordert ein bischen vorarbeit.

 
Bueddl
04-07-2008, 11:44 
 
jaaaaaaaaaaaaaaaaaa, will mitmachen^^ ;-)

 
3DMax
04-07-2008, 14:21 
 
Original geschrieben von unset
Ach und warum?
weil das nicht nur unschön und unübersichtlich ist, sondern vor allem, weil sich dadurch die äußere funktion nur einmal aufrufen lässt.

 
case
04-07-2008, 14:36 
 
huch, jetzt bin ich aber auch überrascht... ich habe es gerade auch nochmal ausprobiert....

ich war der Meinung, dass solche Hilfsfunktionen nur in der Funktion benutzbar sind und danach wieder "weg" sind....

aber irgendwie stimmt es, dass dann ein Fatal error: Cannot redeclare kommt...

komisch, war das mal anders oder habe ich irgendwas verwechselt? :confused:

also ich habe auch mal probiert in einer privaten methode eine solche hilfsfunktion zu deklarieren und da genau das gleiche, die Hilfsfunktion ist auch von außerhalb der Klasse aufrufbar

 
onemorenerd
04-07-2008, 14:45 
 
Ach naja. Das hier ist ja kein Schönheitswettbewerb. Bei Punktegleichstand hätte ich mir den Code genauer angesehen. Aber dann hätte die Idee den Ausschlag gegeben und nicht die Details der Implementierung.
Es war schließlich nicht verlangt, dass man mehr als eine Eingabe verarbeiten muss. Im Gegenteil.

3DMax, da du einen genetischen Algorithmus umgesetzt hättest, gehst du wohl davon aus, dass man keine beste Lösung für das Formelproblem berechnen kann, zumindest nicht effizient. Kannst du das begründen? Oder hat sich sonst jemand Gedanken über die Lösbarkeit gemacht? Würde mich mal interessieren ... wo wir doch jetzt alle rumidlen bis unset uns wieder Futter gibt. :)

 
onemorenerd
04-07-2008, 14:51 
 
@case: Im Handbuch steht "All functions and classes in PHP have the global scope - they can be called outside a function even if they were defined inside and vice versa."

Egal ob du in einer Funktion oder in einer Methode eine Funktion deklarierst, sie wird immer global sein. Denn auch in einer Methode deklarierst du eine Funktion und eben keine Methode der Klasse.

 
unset
04-07-2008, 14:56 
 
Ist euch aufgefallen, dass seit Beginn unseres kleinen Contest die reguläre Fragefrequenz im Forum rapide abgenommen hat? ;)

 
case
04-07-2008, 14:58 
 
Ja, das ist mir (nun) auch klar....

Ich war nur der Meinung, dass man quasi auch private Funktionen deklarieren kann, die nur aus einem bestimmten Gültigkeitsbereich heraus aufrufbar sind, wie es auch bei anderen Programmiersprachen ist....


@unset: Ja, mir ist es auf jeden Fall aufgefallen

 
onemorenerd
04-07-2008, 15:05 
 
Mir ist es auch aufgefallen. Woran das wohl liegt?
Wenn wir so weitermachen, wirds bald keine Browsergames mehr geben. :eek:

 
3DMax
04-07-2008, 15:15 
 
Original geschrieben von onemorenerd
3DMax, da du einen genetischen Algorithmus umgesetzt hättest, gehst du wohl davon aus, dass man keine beste Lösung für das Formelproblem berechnen kann, zumindest nicht effizient. Kannst du das begründen?
also mathematisch kann ich es dir nicht begründen, eher rein intuitiv. das problem erinnert stark an das rucksackproblem und das ist bekanntlich np-vollständig.
ich hatte auch irgendwie keine idee, wie man den algorithmus formulieren sollte, mit einem genetischen algorithmus wäre es relativ einfach. fitnessfunktion (differenz und formellänge), mutation (ziffern doppelt belegen, variable klammernsetzung) und der evolution freien lauf lassen.

während des studiums habe ich soetwas für den Stimulus-Response Agent (http://www.ryerson.ca/~dgrimsha/courses/cps720/SRAgents.html) in java umgesetzt. ich war erstaunt, wie schnell eine passende belegung gefunden wurde.

 
unset
04-07-2008, 16:12 
 
So, eine Aufgabe für die Kryptofreunde unter euch.

Es handelt sich um einen Hash-Algorithmus, den es zu knacken gilt. Die Ausgaben der Funktion sind hier zu finden: http://sandbox.devtimes.de/hash.php?string=hallo

Das Script verarbeitet den GET-Parameter "string".

Es gilt herauszufinden, wie der Algorithmus funktioniert. Ihr habt dafür bis Montag Morgen 9 Uhr Zeit. Sollte bis Morgen Mittag noch wirklich niemand eine Lösung gefunden haben, werde ich ein paar Tipps und Hinweise zur Arbeitsweise posten.

Ich freue mich auf eure Ergebnisse. Lösungswege bekommen Extrapunkte ;)

 
Bueddl
04-07-2008, 17:01 
 
also wenns nur auf 9 ziffern maximal begrenzt wär wärs einfach...^^
aber so isses ja echt kompliziert. ;-)

 
Bueddl
04-07-2008, 17:06 
 
ok, ich glaub ich habs :) code gibts gleich, habs erstmal rein theoretisch im kopf + blatt paper geamcht. schreib es jetzt und teste es dann =)

____________

edit: wofür ferien alles gut sind, dabei wollt ich mich doch eigentlich nur über die themen vom mathe lk informieren, jezz bin ich hier gelandet :-P

 
unset
04-07-2008, 17:07 
 
Ok, die ersten automatisierten Abfragen trudeln ein ;)

 
Bueddl
04-07-2008, 17:08 
 
oh, hab ich das falsch verstanden? sollte man das automatisiert lösen oder sien kopf anstrengen? oder is des egal wie?

 
unset
04-07-2008, 17:09 
 
Mir ist das egal, WIE der Algorhitmus zurückgerechnet wird, Hauptsache die Lösung liefert die selben Ergebnisse.

 
Bueddl
04-07-2008, 17:11 
 
ok^^ dann mach ich mal wieder, hoffe, das ich in 5 mins fertig bin =)

 
unset
04-07-2008, 17:12 
 
Nicht hetzen, du hast bis Montag Zeit ;)

 
Bueddl
04-07-2008, 17:16 
 
ok^^ das lief doch anderst als erwartet^^ nochmal drüber nachdenken...

 
Schanz
04-07-2008, 17:26 
 
Die Automatisierten Anfragen kamen von mir...

Also bis zu 9 Zeichen bekomme ich es hin (ist ja auch keine Kunst)
Habe hierzu 2 funktionen (noch etwas primitiv)
Bin grade am herausfinden wie du strings über 9 zeichen pharsen tust.

function signToCryptedNo($sign)
{
$ascii = ord($sign);

$code = ($ascii/9);

// Wenn die Zahl keine Nachkommastellen besitzt dann ist der Code eine "9"
if(is_int($code))
{
$nach = "9";
} else {
list($vor, $nach) = explode(".", $code);
}

return substr($nach, 0, 1);
}

function cryptString($str)
{
if(strlen($str) > 9) die("Error! Words > 9 signs are not possible to crypt yet!");

$cplstring = "";
// Der String wird 9x wiederholt. Das ist fuer den Fall das der String nur ein Zeichen hat. (In der Schleife werden nur die ersten 9 Zeichen durch die Funktion geschickt)
$str = str_repeat($str, 9);

for($i=0;$i<=8;$i++)
{
$chr = substr($str, $i, 1);
$cplstring .= signToCryptedNo($chr);
}

return $cplstring;
}

Das hier war die Automatische Abfrage:


<table border="0">
<tr>
<th>DEC</th>
<th>Char</th>
<th>Unknown algo</th>
<th>My algo</th>
</tr>
<?php
for($i=0;$i<=127;$i++)
{
$codesign = file("http://sandbox.devtimes.de/hash.php?string=".urlencode(chr($i)));

echo "\t<tr>\n";
echo "\t\t<td>".$i."</td>\n";
echo "\t\t<td>&nbsp;".chr($i)."&nbsp;</td>\n";
echo "\t\t<td>".trim(strip_tags($codesign[9]))."</td>\n";
echo "\t\t<td>".signToCryptedNo(chr($i))."</td>\n";
echo "\t</tr>\n\n";
}
?>
</table>


// Edit:
Die Tabelle könnt ihr euch hier ansehen:
http://www.l0ol.de/bold/aold/algo.html

 
Blackgreetz
04-07-2008, 17:26 
 
Original geschrieben von Bueddl
ok^^ das lief doch anderst als erwartet^^ nochmal drüber nachdenken...

Ist leider keine einfache Paarbildung^^

Dacht auch erst einfach, aber da treten Unregelmäßigkeiten auf ... was hast du da nur gemacht unset ^^

 
unset
04-07-2008, 17:30 
 
Sehr naher Einschlag. Respekt. Bin gespannt, ob du weiter kommst ;)

 
Bueddl
04-07-2008, 17:40 
 
Hm, also ich hatte das ja auch schon, bis zu 9 Zeichen im Input wird einfach so umgerechnet, aber dannach is echt net so einfach, hatte zuerst folgendes:

Stelle des Input | Modifiziert Stelle Output
------------------------------------------------------
0 | 0 und 5
1 | 0 und 5
2 | 1 und 6
3 | 1 und 6
4 | 2 und 7
5 | 2 und 7
6 | 3 und 8
7 | 3 und 8
8 | 4
9 | 4
------------------

aber da is noch n gewaltiger fehler drinn....

 
Blackgreetz
04-07-2008, 18:31 
 
Lösung kommt ^^...

Edit: Du wolltest es nachgebaut haben? Nicht entschlüsselt oder?

 
Schanz
04-07-2008, 18:55 
 
Original geschrieben von Blackgreetz
Lösung kommt ^^...

Edit: Du wolltest es nachgebaut haben? Nicht entschlüsselt oder?

Du bekommst 100 Euro von mir wenn du die Zahlen entschlüsseln kannst -.-

 
Bueddl
04-07-2008, 19:00 
 
einen Hash kann man nicht eindeutig zurück entschlüsseln, da , auchtung, ab heir wirds wichtig, das Ergebnis in den meisten fällen weniger Stellen hat , als du mit dem Input String eingegeben hast, logisch führt das zu folgenden, angenommen wir gegben eine 11 Stelligen Text rein, dann haben wir mit allen 255 zeichen des ANSI Zeichensatzes 255^11 mögliche Strings, jetzt ist unser Output "nur" 9 Zeichen lang, die nur 1..9 enthalten, also 9^9 möglichkeiten, du siehst jetzt villeicht, dass da einige doppel Vorkommen MÜSSEN, und das heisst nix anderes als dass du das nicht zurückrechnen kannst.

Ganz abgesehn davon, dass du beim Hashen einen Datenverlust hast.

Wenn das nicht so wäre, wäre Hash der beste Komprimierungsalgorithmus den es gäbe^^

 
Blackgreetz
04-07-2008, 19:07 
 
Naja.. Zahlen entschlüsseln ginge, aber nicht eindeutig.

Ist mir aber kurz nach dem Edit auch aufgefallen^^...
Hatte nur keine Lust mehr zu editieren :)

mfg

 
Schanz
04-07-2008, 19:23 
 
Original geschrieben von Blackgreetz
Naja.. Zahlen entschlüsseln ginge, aber nicht eindeutig.

Ist mir aber kurz nach dem Edit auch aufgefallen^^...
Hatte nur keine Lust mehr zu editieren :)

mfg

Hast du die Lösung? Dann mach ich nämlich bei mir nicht mehr weiter ^^...

// Edit: Hab jetzt auch eine Idee wie es sein könnte...

V An den Poster unter mir (will keinen neuen machen)
Ich weiß das man hashs nicht zurückrechnen kann, deshalb auch die 100 € :D

 
Bueddl
04-07-2008, 19:26 
 
ne leute, zahlen entschlüsseln ist unter den genannten bedingungen, von da oben auch nicht mehr, ganz davon abgesehn, das hier in der funktion die zahlen 0...9 für mehrere inputs benötigt werden, so ist z.B. die output zahl 3 schonmal in f, aber auch in o und x, also schon mal 3 möglichkeine, die eben NICHT eindeutig sind :)

_____

edit: lasst euch doch auch mal was von nem jüngeren gesagt sein^^ Hashs zurückrechnen generell nicht eindeutig möglich^^

_____

edit: du warst ja auch nicht gemeint^^

 
Blackgreetz
04-07-2008, 19:38 
 
Original geschrieben von Schanz
Hast du die Lösung? Dann mach ich nämlich bei mir nicht mehr weiter ^^...

// Edit: Hab jetzt auch eine Idee wie es sein könnte...


Ja.

 
Schanz
04-07-2008, 20:05 
 
Gut ich hab die Lösung auch soweit... Muss sie noch in PHP umsetzen ;)

 
Blackgreetz
04-07-2008, 20:07 
 
Original geschrieben von Schanz
Gut ich hab die Lösung auch soweit... Muss sie noch in PHP umsetzen ;)

Da häng ich gerade ^^...
Bin leider kein PHP-Pro^^

 
Bueddl
04-07-2008, 20:11 
 
*hust* ich hab derweil aufgegeben^^

Warte auf die nächste, für mich machbare, Aufgabe^^

 
TheFish511
04-07-2008, 20:23 
 
edit: lasst euch doch auch mal was von nem jüngeren gesagt sein^^ Hashs zurückrechnen generell nicht eindeutig möglich^^

Du bist nicht der Jüngste hier. ;)

Ich habs kurz für bis zu 9 Zeichen gemacht, wie das darüber hinaus geht, schau ich mir morgen an.

 
TroX
04-07-2008, 20:24 
 
also bis 9 zeichen ists ja einfach, aber dann... keine ahnung mehr :(

 
unset
04-07-2008, 20:27 
 
Ich hab auch nie gesagt, dass die Hashes zurückgerechnet werden sollen, sondern der Algorithmus. Das erstmal für die Besserwisser. Darüberhinaus ist der Algorithmus auch nicht besonders gut.

Kleiner, nicht geplanter Tipp: Ich hab hier schonmal einen Hash-Algorithmus gepostet, der jetzige arbeitet sehr ähnlich. Wenn auch mit ein zwei entscheidenden Unterschieden.

@Schanz: Ich frag mich, wie du die Lösung haben willst, ohne diese implementiert zu haben?! Wie hast du das getestet?

 
Schanz
04-07-2008, 20:31 
 
Original geschrieben von unset
Ich hab auch nie gesagt, dass die Hashes zurückgerechnet werden sollen, sondern der Algorithmus. Das erstmal für die Besserwisser. Darüberhinaus ist der Algorithmus auch nicht besonders gut.

Kleiner, nicht geplanter Tipp: Ich hab hier schonmal einen Hash-Algorithmus gepostet, der jetzige arbeitet sehr ähnlich. Wenn auch mit ein zwei entscheidenden Unterschieden.

@Schanz: Ich frag mich, wie du die Lösung haben willst, ohne diese implementiert zu haben?! Wie hast du das getestet?

Nun ja.. sagen wir mal ich HOFFE die Lösung zu haben... bin aber eigentlich recht zuversichtlich...
WIE ich das dann hinbekommen habe erzähl ich wenn es soweit ist (oder auch nicht)

// Edit: BLAAAAAAAA ich liege KOMPLETT Falsch...
Ich höre auch auf jetzt ^^ Ich komme leider nicht drauf :P Vieleicht setz ich mich heute Nacht nochmal dran .... Vieleicht hilft das was ich habe jemandem weiter:

<?php
if(!isSet($_GET['string']) || empty($_GET['string'])) die();

/*
** Konvertiert ein Zeichen in den Code
** Zuerst wird der ermittelte ASCII Wert des Zeichens durch 9 geteilt!
** Sollte das Ergebniss keine Nachkommastellen haben ist die Code "9", andernfalls traegt der den Wert der 1. Nachkommastelle
*/
function chrToCrypt($chr)
{
$code = ord($chr)/9;
$code = is_int($code) ? "9" : substr($code, (strpos($code, ".")+1), 1);

return $code;
}

/*
** Konvertiert einen String in einen Hash-Code
** Wie genau muesst ihr euch schon selber ansehen
*/
function cryptString($str)
{
// Der String wird alle 9 Zeichen 'geteilt' und in ein Array geschrieben
$splitted = str_split($str, 9);

// Ein String mit 10 Zeichen wuerde 2 Arrays fuellen, das 2. jedoch nur mit einem Zeichen
// Daher wird das letzte Array 'aufgefuellt' und zwar indem der String wiederholt wird
$entry = count($splitted)-1;
$splitted[$entry] = substr(str_repeat($splitted[$entry], 9), 0, 9);

// Nun wird jeder einzelne Buchstabe durch die entsprechende Code Ziffer ersetzt
foreach($splitted as $string)
{
$cplstring = "";

for($i=0;$i<=8;$i++)
{
$chr = substr($string, $i, 1);
$cplstring .= chrToCrypt($chr);
}

$crypted[] = $cplstring;
}



return $crypted;
}

print_r(cryptString($_GET['string']));
?>

 
Blackgreetz
04-07-2008, 20:38 
 
Hallo,

hier ist der Algorithmus:

Testen: http://blacksoul.redio.de/phpr/unsetalgo.php?string=HALLO


<?php
function cryptbis9($string){

$crypted = "";

for($i=0;$i<strlen($string);$i++){

$sign = ord($string{$i}) % 9;
$sign = ($sign == 0) ? 9 : $sign;

$crypted .= $sign;

} // for

if(strlen($crypted) < 9) $crypted = substr(str_repeat($crypted,9),0,9);

return $crypted;

} //cryptbis9

function cryptab10($string){

$crypted = "";

$tupellength = floor((strlen($string) / 9)+1);
if(floor(strlen($string)/$tupellength) < 9){
$addstring = (((9 - floor(strlen($string)/$tupellength)) * $tupellength)-(strlen($string)%$tupellength));
$string .= substr($string,0,$addstring);
} //if


for($i=0;$i<(strlen($string)/$tupellength);$i++){
$zcrypted = 0;
$k = $i*$tupellength;

for($j=0;$j<$tupellength;$j++){
$sign = ord($string{($k+$j)}) % 9;
$sign = ($sign == 0) ? 9 : $sign;

$zcrypted += $sign;
} //for

$zcrypted = $zcrypted % 9;
$zcrypted = ($zcrypted == 0) ? 9 : $zcrypted;

$crypted .= (string) $zcrypted;

} //for

if(strlen($crypted) < 9) $crypted = substr(str_repeat($crypted,9),0,9);

return $crypted;
} //cryptab10


if(isset($_GET['string'])) echo (strlen($_GET['string']) > 9) ? cryptab10($_GET['string']) : cryptbis9($_GET['string']);

?>



@unset: War das nun gefordert, oder hab ich dich falsch verstanden? :rolleyes:

 
Bueddl
04-07-2008, 20:40 
 
@unset, meintest du diesen post aus dem Forum JavaScript:


function hash(Source) {
var HashBase = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
var WorkingSource = Source;
var Hash = '';

var Counter = 0;
while((WorkingSource.length % 32) != 0) {
if(Counter > WorkingSource.length) {
Counter = 0;
}

WorkingSource = WorkingSource + WorkingSource.substr(Counter, 1);

Counter++;
}

while((WorkingSource.length % 32) != 0) {
WorkingSource = WorkingSource.substr(0, WorkingSource.length - 1);
}

var CharsPerPart = WorkingSource.length / 32;
for(var i = 0; i < 32; i++) {
var SubPart = WorkingSource.substr(i*CharsPerPart, CharsPerPart);
var PartCode = 0;
for(var j = 0; j < SubPart.length; j++) {
PartCode = PartCode + HashBase.indexOf(SubPart.substr(j, 1));
}

if(i != 0) {
PartCode = PartCode*i;
}

PartCode = PartCode + HashBase.indexOf(Hash.length, 1) * Source.length;

while(PartCode > HashBase.length) {
PartCode = PartCode - HashBase.length;
}

while(PartCode < 0) {
PartCode++;
}

if(HashBase.substr(PartCode, 1) == 'undefined') {
Hash = Hash + HashBase.substr(i, 1);
} else {
Hash = Hash + HashBase.substr(PartCode, 1);
}
}

return Hash;
}




also den hier? http://www.php-resource.de/forum/showthread.php?s=&threadid=90731&highlight=hash


und wenn das hier fertig ist, also schätzungsweise Monat morgen, kannst du hier dann deinen Code mal posten, würde mich echt mal interressieren =)

 
unset
04-07-2008, 20:55 
 
Herylichen Glueckwunsch Blackgreetz. Da ist mir doch tatsaechlich vor Schreck grade die Festplatte weggeballert - bin grade auf nem live debian. Werde, wenn hier alles wieder geht, meinen Code posten. Zwischenzeitlich kannst du ja die naechste Aufgabe formulieren .. :D

 
Blackgreetz
04-07-2008, 21:07 
 
Was für ein Schreck? :)

Hmm ... ja ... Aufgabe -g-
Ich bin nicht so wirklich kreativ..
Versuch mir bis morgen Mittag was auszudenken, ansonsten sag ich bescheid, dass jmd. anderes kann^^..

mfg

 
unset
04-07-2008, 21:19 
 
Nenene, so geht das nicht. Du musst dir schon selbst was ausdenken!

Ach ja, hier meine Implementation:


<?php

function hashMe($sToHash) {
if(strlen($sToHash) == 0) {
return false;
}

if(strlen($sToHash) < 9) {
// Weniger als 9 Zeichen
$iRound = 0;
while(strlen($sToHash) < 9) {
$sToHash.= $sToHash[$iRound];
$iRound++;
}
} elseif(strlen($sToHash) == 9) {
// Genau 9 Zeichen
} elseif(strlen($sToHash) > 9) {
// Mehr als 9 Zeichen
$iRest = strlen($sToHash) % 9;
$iToFill = 9 - $iRest;
for($i = 0; $i < $iToFill; $i++) {
$sToHash.= $sToHash[$i];
}
}

// Chunk-Size
$iChunkSize = strlen($sToHash) / 9;

// Wieviel Chunks haben wir
$iChunkCount = strlen($sToHash) / $iChunkSize;

// Chunks berechnen
for($i = 0; $i < $iChunkCount; $i++) {
// Chunk holen
$sChunk = substr($sToHash, $i * $iChunkSize, $iChunkSize);
$iDigit = 0;

// Direkten Chunkwert ermitteln
for($j = 0; $j < strlen($sChunk); $j++) {
$iDigit = $iDigit + ord($sChunk[$j]);
}

while($iDigit >= 10) {
$iDigit = quersumme($iDigit);
}

// Speichern
$iHash.= $iDigit;
unset($iDigit);
}

// Ausgeben
return $iHash;
}

function quersumme($iZahl) {
$sZahl = (string) $iZahl;
for($i = 0; $i < strlen($sZahl); $i++) {
$iOutput = $iOutput + (int) $sZahl[$i];
}
return $iOutput;
}

?>

 
PHP-Desaster
04-07-2008, 21:20 
 
Ging es jetzt nur um das Knacken des Algos? Schade, war leider abwesend. Gucke mir Blackgreetz's Lösung nicht an, vielleicht mach ich's ja noch mal aus Langeweile ;)
Aber her mit der nächsten Aufgabe ^^

 
TheFish511
04-07-2008, 21:49 
 
Menno, da ist einmal nen Freund da und man hat nicht so viel Zeit zum coden und schon ist die schöne Aufgabe gelöst, bevor man richtig anfangen kann. :D
Naja, her mit der nächsten Aufgabe^^

 
Bueddl
04-07-2008, 22:25 
 
danke für deinen code unset, denke mal werde ihn villeicht etwas Modufizierunund nutzen =) (muss ich dir dann iwas wie ne Lizensgebühr zahlen ;) )

Lg,
Bueddl

 
Blackgreetz
04-07-2008, 22:36 
 
Original geschrieben von Bueddl
(muss ich dir dann iwas wie ne Lizensgebühr zahlen ;)

Dann nimm lieber meins. Unset hat seine Ausbildung und verdient Geld. Ich bin Schüler und brauch Geld :D

mfg

 
unset
04-07-2008, 23:03 
 
Alles hier gepostete von mir ist Beerware.

 
Bueddl
05-07-2008, 00:08 
 
hmm, ok also n bierchen auf dich trinken is mir zu öde, ich schick dir n bierdeckel :P (wikipedia^^)

 
Blackgreetz
05-07-2008, 02:12 
 
Okay, hier meine Aufgabe:

Da ich sehr unkreativ bin, habe ich mich mit 2 Freunden zusammengesetzt und uns gedanken über einen Algorithmus gemacht.

Wie der ganze Algortihmus aussieht und auf was er beruht, müsst ihr indirekt mit rausfinden.

Was will ich haben?

http://blacksoul.111mb.de/phpr/cryptbg.php?string=Hallo

Ich möchte, dass ihr das verschlüsselte Wort entschlüsselt :) (allgemein gesehen natürlich)
Also die Verschlüsselung wieder rückgäng macht.

Wichtig: Es sind nur Buchstaben von a-z erlaubt (groß oder klein Spiel keine Rolle)...

Ich denke mir zumindest, dass es recht schwer ist. :)
Werde dann Morgen(Sonntag) wohl ein Tipp geben, auf was der ganze Algorithmus beruht.

Viel Spaß.
Ihr werdet nicht drauf kommen (von euch aus).. :rocks:

ps: Uns ist nichts besseres eingefallen :/

 
unset
05-07-2008, 07:32 
 
Das ist nun wirklich nicht kreativ :(

 
TroX
05-07-2008, 08:27 
 
Original geschrieben von Blackgreetz [/B]

schon komisch, dass dein Algo nichts zurückgibt, wenn man einfach nur z übergibt ;)

 
Bueddl
05-07-2008, 09:15 
 
ma im ernst, ich dneke, dass das hier bisher so gut ar, weil es jedesmal was NEUES war und nich das gleiche, denke mal, bei dem schwierigkeitsgrad hat man nach dem ersten mal wieder lust auf was neues, nich das geiche :) Denk dir doch bitte was neues aus :-P

Lg,
Bueddl

 
Blackgreetz
05-07-2008, 10:58 
 
Hab ich doch gesagt :/

Ich meine, was er zur verschlüsselung nutzt ist "recht" kreativ.
Weißt man das, ist es auch kaum ein Problem den zu entschlüsseln...

@Trox: Danke. Da hab ich noch nen Fehler drin gehabt..

Ich hatte vorne rein gesagt, dass ich unkreativ bin bei sowas..., aber hier meinte jmd., dass man es nicht abgeben darf^^

Von mir aus kann ich euch sagen, auf welcher mathematischen Grundlage es liegt, damit es schnell gelöst werden kann^^..

mfg

 
Bueddl
05-07-2008, 11:47 
 
hmm, najut^^ wird bestimmt trotzdem interressant, aber an den gewinner: bitte nich noch mehr krypto dings zugs da^^ erst frühestens nach ner anderen aufgabe wieder :-P

Lg,
Bueddl

 
TobiaZ
05-07-2008, 12:49 
 
@bueddl, wie wäre es, wenn du mal gewinnst. immerhin bist du bei der letzten aufgabe frühzeitig ausgestiegen. Für dich ist die Aufgabe ja somit neu.

(sagt der neutrale Beobachter. ;) )

 
Bueddl
05-07-2008, 14:11 
 
Hehe, recht hast du ;-)

Ich überleg mal, wenn ich n Ansatz finde, dann mal sehn, an sonsten: is es mir zu kompliziert :-P

Lg,
Bueddl

 
Blackgreetz
05-07-2008, 18:39 
 
Hat schon jmd. was gefunden?^^

Ansonsten würde ich einen ultimativen Tipp geben^^...

mfg

 
Bueddl
05-07-2008, 18:48 
 
tipp bitte :D

 
Kropff
05-07-2008, 18:50 
 
sagt mal. habt ihr eigentlich nichts besseres zu tun? es ist samstag abend! befummelt eure freundin/frau, euren freund/mann, geht mit eurem hund spazieren, oder schreibt tutorials (so wie ich gerade) :)

peter

 
Blackgreetz
05-07-2008, 19:02 
 
Original geschrieben von Kropff
sagt mal. habt ihr eigentlich nichts besseres zu tun?

Doch. Einkaufen gehen, was ich gleich tun werde..
Frau/Freundin/Hund gibbet leider nicht und Tutorials schreibe ich nicht (mehr)..

Wenn sich noch 2 andere finden, die den Tipp heut noch haben wollen, dann stell ich ihn rein. Ansonsten morgen vormittag^^...

mfg

 
UzumakiNaruto
05-07-2008, 19:16 
 
Original geschrieben von Blackgreetz
Doch. Einkaufen gehen, was ich gleich tun werde..
Frau/Freundin/Hund gibbet leider nicht und Tutorials schreibe ich nicht (mehr)..

Wenn sich noch 2 andere finden, die den Tipp heut noch haben wollen, dann stell ich ihn rein. Ansonsten morgen vormittag^^...

mfg

hund kann ich dir geben .. habe noch 3 welpen hier rumflitzen :D
natürlich hätte ich gerne den tipp ;)

 
Schanz
05-07-2008, 19:58 
 
Bitte den Tipp noch nicht geben, habe mich eben drangesetzt und ich glaube ich habs auch schon... Wenn ichs nicht innerhalb von 15 Minuten bestätige dann kannst du den Tipp geben...

// Edit: Also falls die Eingabe von "aaaaaaaaa" ein gewolltes Ergebnis ausspuckt: Dann her mit dem Tipp...

Ansonsten seh ich das als Fehler an und denke habe die Lösung *umsetzt*

// Edit2: Crypting geht... Da die Aufgabe aber decrypt war mach ich das auch noch...

// Edit3: K, Code ist fertig... Werde ihn gleich zusammen mit einer Demo posten (etwas überarbeitet und kommentiert)

 
Blackgreetz
05-07-2008, 20:50 
 
Das Ergebnis ist gewollt...

Da ich jetzt nicht weiß, wie weit du bist, geb ich nur einen "halben" Tipp..

Der ganze beruht auf einer mathematischen Folge. Name wäre der richtige Tipp.

Es sind allerdings bei bestimmten Sachen fluktuationen :) (fällt eventuell bei deinem "aaaaaaaaa" auf ..)

mfg

 
Schanz
05-07-2008, 21:15 
 
So....

1. Script ist hier zum testen:
http://www.l0ol.de/bold/aold/algo.php?string=bdbfdfdhf

2. Decrypt:
http://www.l0ol.de/bold/aold/algo.php?string=cediinqcn&action=decrypt

3. Mein Script liefert nur teilweise richtige Ergebnisse (z.B. der String "bdbfdfdhf" wird richtig ver UND entschluesselt. Der String "aaaaaaaa" aber nicht, da kapier ich den Logik nicht ganz)

Wie ICH es gemacht habe erkläre ich unten... Hier erstmal der Code:

<?php
error_reporting(E_ALL);
// Validsigns = Array mit allen Buchstaben, wird spaeter benoetigt um bsp. fuer den Wert "0" -> "a" auszugeben, und fuer den Wert "4" -> "e" usw...
// Validsigns2 = Das selbe Array allerdings liefert es fuer den Wert "a" -> "0", und fuer den Wert "e" -> "4" usw...
$validsigns = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");
$validsigns2 = array_flip($validsigns);

// 1. If = Scriptabbruch wenn kein String uebergeben wurde
// 2. If = Scriptabbruch wenn der String Zeichen enthaelt die keine Buchstaben sind (Sonderzeichen und Zahlen)
// 3. If = Wenn ein String ENTSCHLUESSELT werden soll wird wird das alphabet im Array umgedreht (abcdef...)->(zyxwvu...)
if(!isSet($_GET['string']) || empty($_GET['string'])) die("No String given!");
if(ctype_alpha($_GET['string']) === false) die("Bitte nur Buchstaben im String verwenden");
if(isSet($_GET['action']) && $_GET['action'] == "decrypt")
{
$validsigns = array_reverse($validsigns);
$validsigns2 = array_flip($validsigns);
}

// Jeder Buchstabe im String wird in ein Array geschrieben
$string = str_split(strtolower($_GET['string']), 1);

// Wandelt alle Buchstaben in die jeweiligen Zeichen des Codes um
$last = 1;
$slast = 0;
$firstrun = true;
$total = count($validsigns);

foreach($string as $sign)
{
$current = $last + $slast;

$newindex = $validsigns2[$sign]+$current;
if($newindex >= $total) $newindex = $newindex%$total;

echo $validsigns[$newindex];

if(!$firstrun) $slast = $last;
$last = $current;
if($firstrun) $firstrun = false;
}
?>

So, ich muss ja nur noch die foreach Schleife erklären, der Rest ist kommentiert.

Dazu habe ich folgendes herausbekommen:

String = bbbbb

0. Zeichen (crypted) = 1 Zeichen im Alphabet versetzt (b->c) (1)

1. Zeichen (crypted) = 1 Zeichen im Alphabet versetzt (b->c) (1)
2. Zeichen (crypted) = 1 Zeichen im Alphabet versetzt (b->c) (1)
3. Zeichen (crypted) = 2 Zeichen im Alphabet versetzt (b->d) (2)
4. Zeichen (crypted) = 3 Zeichen im Alphabet versetzt (b->e) (3)
5. Zeichen (crypted) = 5 Zeichen im Alphabet versetzt (b->g) (5)
...


So geht das immer so weiter... Die "versetzung" setzt sich also aus den Stellen des LETZTEN und VORLETZTEN versetzen Zeichens zusammen.

Bsp. 4. Zeichen = 2+1 = 3
Bsp. 5. Zeichen = 3+2 = 5

Vor dem 1. Zeichen muss man sich gedanklich noch ein 0. Zeichen vorstellen was immer mit dem Wert "1" dort steht...
Das Vorletzte Zeichen gibt es noch nicht und wird mit dem Wert "0" angenommen.

Sooo ist auch die Schleife aufgebaut.

Und jetzt versuch ich noch herauszufinden was daran falsch ist.

// Edit 1: Ok, es hat etwas mit den Vokabeln "a, e, i, o, u" zu tun.
Strings ohne diese Buchstaben werden korrekt ver-/ und entschlüsselt.

// Edit 2: Ok, ich überlass den anderen das Rästsel... kA wie das funktioniert... Irgentwie ink-/dekrementieren sich Buchstaben nach einem Vokal entsprechend der Stelle des Vokals :confused:
(Ich glaube die "andere hälfte" des Tipps hätte mich weiter gebracht...)

 
Blackgreetz
05-07-2008, 21:31 
 
Sieht doch schon gut aus.

Ansich hast du den anderen damit eine große Hilfestellung gegeben, da du ja die Folge teilweise bekanntgegeben hast. Wenn man danach suchen würde, findet man auch ganz schnell den Namen der Folge :)

..und dein Ansatz für dein Problem sieht auch gut aus.

mfg
Edit(So,1:30): Du musst antworten Schanz, sonst seh ich nichts ;)

Also: Die Folge nennt sich Fibonacci-Folge. Danach werden die Buchstaben verschlüsselt.
Bei Vokabeln fängt die Folge wieder von vorne an.
Jetzt muss man nur noch gucken, wie sich die nachfolgenden Buchstaben verhalten....;)

Ich setz mal das Zeitlimit auf Montag 18 Uhr.

 
Schanz
06-07-2008, 11:40 
 
Tschuldige.. Das nächste mal Antworte ich.

Ja das die Folge wieder von vorne Anfängt hatte ich schon soweit..
Nur dann war immer noch ein kleiner fehler drinnen.

 
Blackgreetz
06-07-2008, 11:57 
 
Dann guck dir mal folgenden crypt an:

http://blacksoul.111mb.de/phpr/cryptbg.php?string=hallohallo

Vlt zeigt der dir genaueres :)

mfg

 
Schanz
06-07-2008, 12:27 
 
Original geschrieben von Blackgreetz
Dann guck dir mal folgenden crypt an:

http://blacksoul.111mb.de/phpr/cryptbg.php?string=hallohallo

Vlt zeigt der dir genaueres :)

mfg

so hab jetzt wie es geht. Werde es aber nicht in PHP umsetzten, keine Lust mehr auf reverse engeneering^^... (und so wie es aussieht bin ich eh der einzige der was macht :o)

Also: Nach einem Vokal geht es so weiter als wäre das Vokal das erste Zeichen im String.
Der selbe Algorythmus wird allerdings auf die Nachfolgenden buchstaben umgekehrt angewendet.

Das heißt:
Der 1. Buchstabe nach einem Vokal ist um 1 nach hinten geschoben
Der 2. Buchstabe nach einem Vokal ist um 1 nach hinten geschoben
Der 3. Buchstabe nach einem Vokal ist um 1 nach hinten geschoben
Der 4. Buchstabe nach einem Vokal ist um 2 nach hinten geschoben
Der 5. Buchstabe nach einem Vokal ist um 3 nach hinten geschoben
Der 6. Buchstabe nach einem Vokal ist um 5 nach hinten geschoben
....

Ich versteh zwar nicht wieso die ersten 3. um nur eine Stelle verschoeben sind (sollten es nicht nur die ersten 2 sein?!?!), aber dadrum kümmere ich mich nun auch nicht mehr ^^...
Wer will kann das ganze jetzt in einem funktionierenden Code umsetzten, meine beiden Beiträge erklären den Algorythmus soweit vollständig.

 
Blackgreetz
06-07-2008, 15:46 
 
Also: Nach einem Vokal geht es so weiter als wäre das Vokal das erste Zeichen im String.
Der selbe Algorythmus wird allerdings auf die Nachfolgenden buchstaben umgekehrt angewendet.

Das heißt:
Der 1. Buchstabe nach einem Vokal ist um 1 nach hinten geschoben
Der 2. Buchstabe nach einem Vokal ist um 1 nach hinten geschoben
Der 3. Buchstabe nach einem Vokal ist um 1 nach hinten geschoben
Der 4. Buchstabe nach einem Vokal ist um 2 nach hinten geschoben
Der 5. Buchstabe nach einem Vokal ist um 3 nach hinten geschoben
Der 6. Buchstabe nach einem Vokal ist um 5 nach hinten geschoben

Erster Teil stimmt, aber deine Verschiebung der Buchstaben nicht.

hallohallo
iblmqhblmq

< Daran erkennt man es bereits...

mfg

 
Blackgreetz
07-07-2008, 19:01 
 
Ja...

..egal :)
Ich geb mal an den nächsten ab :)..

Also:
Die Verschiebung fand im a-z-Bereich statt mittels der Fibonacci-Folge.
Bei Vokalen wurde der Counter wieder zurückgesetzt und der 1. Buchstabe nach dem Vokal wurde nicht verschoben, aber die Folge ging weiter.
D.h. der 2. Buchstabe wurde dann um 1 verschoben, aber der 3. Buchstabe dann schon um 2.

Code:
<?php

function fibonacci($index,$x = 0, $y = 0){
$z = ($x == 0 && $y == 0) ? 1 : $x+$y;
return (($index-1) == 0) ? ($z) : fibonacci($index-1,$y,$z);
}

$buchstaben= array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
'r','s','t','u','v','w','x','y','z');

if(isset($_GET['string'])){

$string = strtolower($_GET['string']);

if(preg_match("#^[a-z]*$#",$string)){

$k = 1;
$v = 0; // vokal davor oder nicht?
$crypted = "";

for($i=0;$i<strlen($string);$i++){

if(in_array($string{$i},array('a','e','i','o','u'))){

//Vokal zurücksetzen
if($v==1){

$crypted .= $string{$i};
$k = 1;

}else{

$letter = array_keys($buchstaben,$string{$i});
$n = fibonacci($k) + ($letter[0]+1);
$n = (($n % 26) == 0) ? 26 : ($n%26);
$crypted .= $buchstaben[$n-1];
$k = 1;
$v = 1;

}

}else{

if($v == 1){
$crypted .= $string{$i};
$k++;
$v = 0;
}else{
$letter = array_keys($buchstaben,$string{$i});
$n = fibonacci($k) + ($letter[0]+1);
$n = (($n % 26) == 0) ? 26 : ($n%26);
$crypted .= $buchstaben[$n-1];
$k++;
}
}
}

echo $crypted;
}else{
echo "Bitte nur Buchstaben von a-z bzw. A-Z";
}
}

Ich geb mal an den ab, der will. ^^
Falls überhaupt noch wer will^^..

mfg

 
unset
08-07-2008, 14:32 
 
Na, komm, dann mach ich das mal.

Im Anhang eine Wortliste. Baue auf dieser Basis eine "Did you mean"-Funktion - also eine Funktion, der ein Wort aus dieser Liste, möglicherweise falsch geschrieben, übergeben wird, und die ermitteln, welches Wort gemeint gewesen sein könnte. Die "Test"-Routine werde ich heute Abend posten. Ihr habt bis Morgen, 15:00 Zeit ;)


array(
'ARQUES',
'ATP-Turnier',
'Abchasien',
'Abschaltung',
'Ackermann',
'Agrarsubventionen',
'Airline',
'Anixe',
'Annika',
'Atomausstieg',
'Atomenergie',
'Atommeiler',
'Atompolitik',
'Atomstreit',
'Aufenthaltserlaubnis',
'Ausstand',
'Barrot',
'Barth',
'Baur',
'Beiersdorfer',
'Bertha',
'Bischoff',
'Bitkom',
'Bloomberg',
'Borg',
'Brokkoli',
'Bundesnetzagentur',
'Buschkowsky',
'Cadillac',
'Cannes',
'Carolina',
'Carreras',
'Chevrolet',
'Coleman',
'Computerspiele',
'Credit',
'Crouch',
'DVB-T',
'Debitel',
'Deichmann',
'Dmitri Medwedew',
'Donaueschingen',
'EMI',
'EU-Kommissionsprsident',
'EU-Staaten',
'Einwanderung',
'Einwanderungspolitik',
'Ellwangen',
'Elmshorn',
'Elsass',
'Enkelmann',
'Eppler',
'Erdl',
'EreignisErderwrmung',
'Eurosport',
'Eurowings',
'Flamenco',
'Freddie Mac',
'Freiberg',
'Freizgigkeit',
'Fresenius',
'Frontex',
'Funktionre',
'GEMA',
'GWG',
'Gas Natural',
'Generika',
'Gesamtklassement',
'Gnzburg',
'Gontard',
'Hasan',
'Hauptfeld',
'Heckmann',
'Hedge-Fonds',
'Heiligendamm',
'Heisig',
'Hero',
'Hokkaido',
'Holtzbrinck',
'IPO',
'IT-Fitness',
'Icahn',
'Industrienationen',
'Industrieproduktion',
'Insolvenzantrag',
'Islamabad',
'Kabul',
'Karachi',
'Keith Urban',
'Kerkeling',
'Kernenergie',
'Kernkraft',
'Klckner',
'Klimapolitik',
'Klitschko',
'Komax',
'Lennox',
'Lufthansa',
'Madeleine',
'Mao',
'Martin Jol',
'Mauritius',
'Medwedew',
'Microsoft',
'Morrison',
'NBC',
'NBC Universal',
'Nashville',
'Neu-Isenburg',
'Neuwahlen',
'Nielsen',
'Nintendo',
'Nordex',
'Oliver Shanti',
'Online-Banking',
'Organisation',
'Ort',
'Pakt',
'Pamplona',
'Paulo',
'Personalvorstand',
'Pete',
'Piloten',
'Pilotengewerkschaft',
'Pilotenvereinigung',
'PolitikerBarroso',
'Portsmouth',
'Postbank',
'Rafael Nadal',
'Robert Kubica',
'SPOE',
'SPOE-Chef',
'Salzau',
'Schlagwort',
'Seidenberg',
'Selbstmordattentter',
'Siedlungen',
'Sony',
'Sorin',
'Sport',
'Sportchef',
'Sportler',
'Stadtpark',
'Steg',
'Stiglitz',
'Streik',
'Suedindien',
'TNK-BP',
'TUI',
'Tagessieg',
'Tarifkonflikt',
'Thompson',
'Trainer',
'Unesco',
'Vanessa',
'Verlagsgruppe',
'Versptungen',
'Verwaltungsrat',
'Volksabstimmungen',
'Wedeler',
'Wissenschaftsrat',
'Won',
'Yang',
'Zeitfahren'
);

 
case
08-07-2008, 14:46 
 
Also die Liste ist wirklich cool, alles aktuelle Wörter, die in den Nachrichten der letzten Tage vorkommen ;)

Ich kann da fast alles einordnen^^

Vielleicht könnte es ja auch als nächste Aufgabe ein Script geben, dass Nachrichtenseiten durchsucht und diese Wörter alle nach Themengebieten sortiert *gg*

naja, wenn ich es heute Abend mal schaffe, setze ich mich auf jeden fall mal an die "did you mean" Aufgabe....

 
PHP-Desaster
08-07-2008, 15:25 
 
Hier meine Lösung. Kannst dir aussuchen, ob der Vergleich mit der levenshtein, metaphone oder soundex-Funktion stattfinden soll. Liefern nicht immer die gleichen Ergebnisse, zum Beispiel findet der levenshtein bei der Eingabe "Carrrla" das Ergebnis "Carreras", während metaphone und soundex jeweils "Carolina" finden. Oder bei "dvb" findet levenshtein "Ort" anstatt "DVB-T". Darum finde ich die beiden Funktionen besser.
Falls ich die Aufgabe falsch verstanden haben sollte, bitte klär mich auf ;)

 
unset
08-07-2008, 15:27 
 
Bedingt. Die Funktion sollst du schreiben, und nicht auf vorhandene zurückgreifen ;)

 
PHP-Desaster
08-07-2008, 15:43 
 
Bedingt. Die Funktion sollst du schreiben, und nicht auf vorhandene zurückgreifen ;)Das erklärt so einiges ^^ Na mal schaun, ob ich da noch Zeit zu finde ;)

 
Bueddl
08-07-2008, 16:15 
 
yaa, das is ma n tolles thema, ich hab da auch schon was, ne kleine aber feine funktion.

sie funktioniert so: sie bewertet den vergleich zwischen jedem wort der wortliste und dem serachstring nach folgenden punkteprinzip:

erster buchstabe gleich?
ja? +2
nein? -2

zeichen in folge gleich?
1? +1
2? +2
3? +4
4? +8
(also anzahl der zeichen hoch 2)

längenunterschied?
pro zeichen -1
wenn absolut gleiche länge +3

Ausgewertet wird nach: wer ammeisten punkte hat, hat gewonnen =)

ich poste ihn gleich, optimiere nru kurz die anzeige ;-)


verfügbar unter: http://tools-box.net/dym/?search=Wendele
______________

den aktuellen Code gibts hier: http://www.php-resource.de/forum/showthread.php?s=&postid=593479#post593478
______________

Der auskommentierte Kram muss nicht sein, kann man aber machen (kostet performance). Dadrin wird für die einzelnen Kategorien einzen gezählt, zum späteren analysieren, warum welches Wort genommen wurde. Allerdings kann man damit, wie ich s heir noch posten werde nochmal eine Art Wertigkeit für die Kategorien besser definieren, wenn man z.B. bei Tests rückschlüsse auf eien etwaigen fehler, der ja z.B: durch falsche Wertigkeit entstehen kann.

Durch die Konstanten kann jeder das "Feintuning" selber übernehmen :)

neu ist jetzt die unterstützung für Groß/Kleinschreibung ignorieren :-) Ebenso werden dei anderen Begriffe der Liste mit Score angezeigt (kann man als variable abschalten)


Lg,
Bueddl

 
TroX
08-07-2008, 17:08 
 
Uh, umlaute in konstanten :/


achja:
Parse error: syntax error, unexpected ')', expecting ',' or ';' in /var/www/tools-box.net/dym/index.php on line 257

^^

 
Bueddl
08-07-2008, 17:11 
 
ich hab grad was verbessert, stand auch im post....

und damit auch gleich den neuen code:

_____

Aktuelle version: http://www.php-resource.de/forum/showthread.php?s=&postid=593479#post593478

____

n tipp: umlaute sidn im zeichnsat auch nichts anderes als ZAHLEN, da ich die Konstanten hier im GLEICHEN script, auf dem GLEICHEN server definiert habe, kann auch gar nichts passieren....

Lg, Bueddl

 
unset
08-07-2008, 17:16 
 
Schonmal nicht schlecht. Aber trotzdem plädiere ich dafür, den Code hier umzubrechen.

 
Bueddl
08-07-2008, 17:17 
 
öhm, was meinste damit?

 
unset
08-07-2008, 17:19 
 
Jetzt suchste mal im Forum nach "Code umbrechen"! :teach:

 
Bueddl
08-07-2008, 17:21 
 
meintest du den überlangen auskommentierten Code? (den, den ich gelöscht hab^^)

 
unset
08-07-2008, 17:22 
 
Du bekommst gleich Minuspunkte wegen doofer Fragen ...:cool:

 
Bueddl
08-07-2008, 17:26 
 
ok, forum hat wieder die "normale" breite^^

;-)

 
unset
08-07-2008, 17:29 
 
Evtl. sollten wir uns mal Gedanken über Teilnahmebedingungen hier machen. Ich meine sowas in der Art von wegen "alles was hier gepostet wird, muss a) aus eigener Feder stammen und b) dannach der GPL (oder eine andere offene Lizenz) unterliegen". Ich kann mir vorstellen, hier kann noch ne Menge nettes bei rumkommen - wenn der Gewinner ordentliche Aufgaben stellt ;)

 
Bueddl
08-07-2008, 17:36 
 
Stimme ich dir zu 100% zu, wir können das ja alles hier posten: www.tools-box.net (sollte mal n projekt werden, is nix geworden, forum existiert immer noch)

@unset: lust da mit mir admin zu machen und da die ganzen codes , die hie entstehen zu posten? =)

Lg,
Bueddl

 
unset
08-07-2008, 17:38 
 
Wir können die auch einfach hier drin lassen. Google indiziert den Krempel hier, und wer dannach sucht, wird das hier ohnehin ungefrat nehmen.

 
case
08-07-2008, 17:40 
 
Und, dass am besten die Programmieraufgabe zur Nacht am besten Nachts gemacht werden sollte *g*

immer wenn ich nach Hause komme und mal etwas Zeit hätte sind schon Lösungen da, und dann habe ich auch keine Lust mehr richtig zu tüfteln *g*

 
Bueddl
08-07-2008, 17:40 
 
stimmt auch wieder, aber hier erscheint es vllt etwas ungeordnet, außerdem wir man nicht immer auf die aktuellste version hingeleitet, wwenn man z.B. mehrfach code postet :)

 
unset
08-07-2008, 17:44 
 
Dann poste halt nicht mehrere Versionen. Das ist ja kein Changelog hier. Generell stimme ich case zu: Lösungen sollten erst ab einer gewissen Zeitspanne gepostet werden dürfen. Demos gehen natürlich auch schon eher.

 
Bueddl
08-07-2008, 17:44 
 
so, hier jetzt meine vorläufige final version, mit vergesserter Ergebnisauswertung:


<?php

$wortliste = array(
'ARQUES',
'ATP-Turnier',
'Abchasien',
'Abschaltung',
'Ackermann',
'Agrarsubventionen',
'Airline',
'Anixe',
'Annika',
'Atomausstieg',
'Atomenergie',
'Atommeiler',
'Atompolitik',
'Atomstreit',
'Aufenthaltserlaubnis',
'Ausstand',
'Barrot',
'Barth',
'Baur',
'Beiersdorfer',
'Bertha',
'Bischoff',
'Bitkom',
'Bloomberg',
'Borg',
'Brokkoli',
'Bundesnetzagentur',
'Buschkowsky',
'Cadillac',
'Cannes',
'Carolina',
'Carreras',
'Chevrolet',
'Coleman',
'Computerspiele',
'Credit',
'Crouch',
'DVB-T',
'Debitel',
'Deichmann',
'Dmitri Medwedew',
'Donaueschingen',
'EMI',
'EU-Kommissionsprsident',
'EU-Staaten',
'Einwanderung',
'Einwanderungspolitik',
'Ellwangen',
'Elmshorn',
'Elsass',
'Enkelmann',
'Eppler',
'Erdl',
'EreignisErderwrmung',
'Eurosport',
'Eurowings',
'Flamenco',
'Freddie Mac',
'Freiberg',
'Freizgigkeit',
'Fresenius',
'Frontex',
'Funktionre',
'GEMA',
'GWG',
'Gas Natural',
'Generika',
'Gesamtklassement',
'Gnzburg',
'Gontard',
'Hasan',
'Hauptfeld',
'Heckmann',
'Hedge-Fonds',
'Heiligendamm',
'Heisig',
'Hero',
'Hokkaido',
'Holtzbrinck',
'IPO',
'IT-Fitness',
'Icahn',
'Industrienationen',
'Industrieproduktion',
'Insolvenzantrag',
'Islamabad',
'Kabul',
'Karachi',
'Keith Urban',
'Kerkeling',
'Kernenergie',
'Kernkraft',
'Klckner',
'Klimapolitik',
'Klitschko',
'Komax',
'Lennox',
'Lufthansa',
'Madeleine',
'Mao',
'Martin Jol',
'Mauritius',
'Medwedew',
'Microsoft',
'Morrison',
'NBC',
'NBC Universal',
'Nashville',
'Neu-Isenburg',
'Neuwahlen',
'Nielsen',
'Nintendo',
'Nordex',
'Oliver Shanti',
'Online-Banking',
'Organisation',
'Ort',
'Pakt',
'Pamplona',
'Paulo',
'Personalvorstand',
'Pete',
'Piloten',
'Pilotengewerkschaft',
'Pilotenvereinigung',
'PolitikerBarroso',
'Portsmouth',
'Postbank',
'Rafael Nadal',
'Robert Kubica',
'SPOE',
'SPOE-Chef',
'Salzau',
'Schlagwort',
'Seidenberg',
'Selbstmordattentter',
'Siedlungen',
'Sony',
'Sorin',
'Sport',
'Sportchef',
'Sportler',
'Stadtpark',
'Steg',
'Stiglitz',
'Streik',
'Suedindien',
'TNK-BP',
'TUI',
'Tagessieg',
'Tarifkonflikt',
'Thompson',
'Trainer',
'Unesco',
'Vanessa',
'Verlagsgruppe',
'Versptungen',
'Verwaltungsrat',
'Volksabstimmungen',
'Wedeler',
'Wissenschaftsrat',
'Won',
'Yang',
'Zeitfahren'
);

define('PUNKTE_FÜR_PASSENDE_LÄNGE', +3);
define('PUNKTE_FÜR_NICHT_PASSENDE_LÄNGE_PRO_ZEICHEN', -1);
define('PUNKTE_FÜR_ERSTEN_BUCHSTABEN_PASSEND', +2);
define('PUNKTE_FÜR_ERSTEN_BUCHSTABEN_NICHT_PASSEND', -2);
define('PUNKTE_PRO_GLEICHES_ZEICHEN', +1);
define('PUNKTE_HOCH_GLEICHE_ZEICHEN', +2);
define('GROß_KLEIN_SCHREIBUNG_IGNORIEREN', true);
define('SHOW_LIST', false);

$search = $_REQUEST['search'];
if (strlen($search) > 0) {
$match = array();
if (GROß_KLEIN_SCHREIBUNG_IGNORIEREN) {
$search = strtolower($search);
}
for ($i = 0; $i < count($wortliste); $i++) {
$match[$i] = array (
'probability' => 0,
'word' => $wortliste[$i]);
if (GROß_KLEIN_SCHREIBUNG_IGNORIEREN) {
$match[$i]['word2'] = strtolower($match[$i]['word']);
} else {
$match[$i]['word2'] = $match[$i]['word'];
}
if ($match[$i]['word2'][0] == $search[0]) {
$match[$i]['probability'] += PUNKTE_FÜR_ERSTEN_BUCHSTABEN_PASSEND;
$match[$i]['pfl'] = PUNKTE_FÜR_ERSTEN_BUCHSTABEN_PASSEND;
} else {
$match[$i]['probability'] += PUNKTE_FÜR_ERSTEN_BUCHSTABEN_NICHT_PASSEND;
$match[$i]['pfl'] = PUNKTE_FÜR_ERSTEN_BUCHSTABEN_NICHT_PASSEND;
}

$difflen = abs(strlen($search)-strlen($match[$i]['word2']));
if ($difflen == 0) {
$match[$i]['probability'] += PUNKTE_FÜR_PASSENDE_LÄNGE;
$match[$i]['ple'] = PUNKTE_FÜR_PASSENDE_LÄNGE;
} else {
$match[$i]['probability'] += $difflen*PUNKTE_FÜR_NICHT_PASSENDE_LÄNGE_PRO_ZEICHEN;
$match[$i]['ple'] = $difflen*PUNKTE_FÜR_NICHT_PASSENDE_LÄNGE_PRO_ZEICHEN;
}
for ($a = 0; $a < strlen($search); $a++) {
for ($b = 1; $b < (strlen($search)-$a+1); $b++) {
$tpsc = pow(eregi(substr($search, $a, $b), $match[$i]['word2'])*$b*
PUNKTE_PRO_GLEICHES_ZEICHEN, PUNKTE_HOCH_GLEICHE_ZEICHEN);
$match[$i]['probability'] += $tpsc;
$match[$i]['psc'][] = $tpsc;
$match[$i]['psc']['ges'] += $tpsc;
}
}
$max = 0;
for ($a = 0; $a < strlen($match[$i]['word2']); $a++) {
for ($b = 1; $b < (strlen($match[$i]['word2'])-$a+1); $b++) {
$max += pow(eregi(substr($match[$i]['word2'], $a, $b), $match[$i]['word2'])*$b*
PUNKTE_PRO_GLEICHES_ZEICHEN, PUNKTE_HOCH_GLEICHE_ZEICHEN);
}
}
$max += 2;
$match[$i]['wahrscheinlichkeit'] = $match[$i]['probability'] / $max;
}

function sortit($wert_a, $wert_b)
{
$a = $wert_a['probability'];
$b = $wert_b['probability'];
if ($a == $b) {
return 0;
}
return ($a < $b) ? +1 : -1;
}

uasort($match, 'sortit');

foreach ($match as $m) {
$newarr[] = $m;
}

if ($search == $newarr[0]['word2']) {
echo "<span style='font-family: Courier New; font-size: 12px;'>Das Wort steht in der Liste ;-)</span>";
} else {
if (GROß_KLEIN_SCHREIBUNG_IGNORIEREN) {
$ignore = 'JA';
} else {
$ignore = 'NEIN';
}
$all = 0;
foreach ($newarr[0]['psc'] as $psc) {
$all += $psc;
}
echo "
<span style='font-family: Courier New; font-size: 12px;'>
Eingabe: \"<i>".$search."</i>\", meintest du: \"<i>".$newarr[0]['word']."</i>\" [".
round($newarr[0]['wahrscheinlichkeit']*100, 2).
"%]<br><br><u>Info:</u> <br>Gro&szlig;-Klein-Schreibung ignorieren: ".$ignore."<br/>Punkte gesamt: ".
$newarr[0]['probability']." <br/>Punkte Anfangsbuchstabe: ".$newarr[0]['pfl']."<br/>Punkte L&auml;nge: ".
$newarr[0]['ple']."<br/>Punkte Gleiche Zeichen: ".$newarr[0]['psc']['ges'].
"<br/>Gleiche Zeichenketten gefunden: ".
count($newarr[0]['psc'])."<br/>Durchschnittsl&auml;nge &Uuml;bereinstimmender Strings: ".
round(sqrt($all / (count($newarr[0]['psc']))))."<br/></span>";
if (SHOW_LIST) {
echo "<br><table border='1'>
<tr>
<th>Wort</th>
<th>Punkte (Gesamt)</th>
<th>Erster Buchstabe</th>
<th>Stringlen</th>
<th>Gleiche Buchstaben</th>
</tr>";

foreach ($newarr as $m) {
echo "<tr>
<td>".$m['word']."</td>
<td>".$m['probability']."</td>
<td>".$m['pfl']."</td>
<td>".$m['ple']."</td>
<td>".$m['psc']['ges']."</td>
</tr>";
}
}
echo "</table>";
}
} else {
echo "<span style='font-family: Courier New; font-size: 12px;'>Du musst schon was eingeben...</span>";
}

?>

 
Bueddl
08-07-2008, 17:47 
 
jup, das stimtm schon, also ich lösch jezz erstmal meien alten codeversionen und verweise auf den aktuellsten post, das machts schon mal übersichtlicher, wenn das jeder so macht, dann:

ab einer bestimmten Zeit posten is ne super idee, was haltet irh von 17:00?

Lg,
Bueddl

 
unset
08-07-2008, 17:47 
 
Wenn es etwas gibt, was ich am allermeisten hasse, dann mich wiederholen zu müssen. Warum postest du jedes mal deinen Code neu? Ist dir die "Bearbeiten"-Funktion nicht bekannt? Hast du meinen Post überhaupt gelesen?

 
Bueddl
08-07-2008, 17:52 
 
ich mag es auch nicht, wenn ich mich wiederholen muss udn ich tus trotzdem ;-)

Ich hab eben geschrieben, ich verweise in den alten pots immer auf den neuen und lösche den alten Code, das hab ich auch gerade geamcht. Es existiert jetzt hier nur noch 1x der Code und

schau mal heir vorbei:

http://www.php-resource.de/forum/showthread.php?s=&threadid=92749&perpage=15&pagenumber=3

http://www.php-resource.de/forum/showthread.php?s=&threadid=92749&perpage=15&pagenumber=5

da hast du auch 2x code gepostet...

 
unset
08-07-2008, 17:55 
 
Bearbeite doch einfach deinen Ursprungspost, und poste, dass du ihn aktualisiert hast. Abgesehen davon, dass ständiges geposte hier im Thread gar keinen Sinn macht.

 
Bueddl
08-07-2008, 17:58 
 
Ja, ich muss zugeben, ist auch ne Option, aber jetzt hast du dir meins nicht ganz durchgelesen...

 
unset
08-07-2008, 18:02 
 
Doch, aber wenn ich überarbeiteten Code innerhalb von wenigen Minuten neu poste, ist das was anderes, als wenn ich das mehrere Stunden später mache.

 
Bueddl
08-07-2008, 18:03 
 
*hust* ok, akzeptier ich, ich nehm den vorwurf damit auch zurück, hast recht.

Lg,
Bueddl

 
PHP-Desaster
08-07-2008, 21:24 
 
Ich weiß nicht, ob mir jetzt einfach die Kreativität für diese Aufgabe fehlt oder so, aber meine Lösung sieht wie folgt aus (Erweiterung zu meiner vorherigen):

function strsum( $input ) {
$chars = count_chars( $input, 3 );
return( $chars );
}Ich hänge auch noch einmal das komplette Testformular an.

Poste mal deine Testroutine, dann kann ich das etwas besser testen.

 
TroX
08-07-2008, 21:39 
 
Jut, dann mein vorschlag. Beruht ein bisschen auf der levenshtein-funktion, habe sie aber nicht kopiert ;)

<?php
function strPoints( $str1, $str2 )
{
$returnValue = 0;

$m = strlen( $str1 );
$n = strlen( $str2 );
$diff = abs( $m - $n );
$returnValue += $diff;

$max = max( $m, $n );

for( $i = 0; $i < $max; $i++ )
{
if( ( $m - 1 < $i ) || ( $n - 1 < $i ) )
{
break;
}

$c1 = $c2 = false;
if( ( $m - 1 ) >= $i )
{
$c1 = $str1{$i};
}

if( ( $n - 1 ) >= $i )
{
$c2 = $str2{$i};
}

if( ord( $c1 ) != ord( $c2 ) )
{
$returnValue++;
}
}

return $returnValue;
}


$words = array(
'ARQUES',
'ATP-Turnier',
'Abchasien',
'Abschaltung',
'Ackermann',
'Agrarsubventionen',
'Airline',
'Anixe',
'Annika',
'Atomausstieg',
'Atomenergie',
'Atommeiler',
'Atompolitik',
'Atomstreit',
'Aufenthaltserlaubnis',
'Ausstand',
'Barrot',
'Barth',
'Baur',
'Beiersdorfer',
'Bertha',
'Bischoff',
'Bitkom',
'Bloomberg',
'Borg',
'Brokkoli',
'Bundesnetzagentur',
'Buschkowsky',
'Cadillac',
'Cannes',
'Carolina',
'Carreras',
'Chevrolet',
'Coleman',
'Computerspiele',
'Credit',
'Crouch',
'DVB-T',
'Debitel',
'Deichmann',
'Dmitri Medwedew',
'Donaueschingen',
'EMI',
'EU-Kommissionsprsident',
'EU-Staaten',
'Einwanderung',
'Einwanderungspolitik',
'Ellwangen',
'Elmshorn',
'Elsass',
'Enkelmann',
'Eppler',
'Erdl',
'EreignisErderwrmung',
'Eurosport',
'Eurowings',
'Flamenco',
'Freddie Mac',
'Freiberg',
'Freizgigkeit',
'Fresenius',
'Frontex',
'Funktionre',
'GEMA',
'GWG',
'Gas Natural',
'Generika',
'Gesamtklassement',
'Gnzburg',
'Gontard',
'Hasan',
'Hauptfeld',
'Heckmann',
'Hedge-Fonds',
'Heiligendamm',
'Heisig',
'Hero',
'Hokkaido',
'Holtzbrinck',
'IPO',
'IT-Fitness',
'Icahn',
'Industrienationen',
'Industrieproduktion',
'Insolvenzantrag',
'Islamabad',
'Kabul',
'Karachi',
'Keith Urban',
'Kerkeling',
'Kernenergie',
'Kernkraft',
'Klckner',
'Klimapolitik',
'Klitschko',
'Komax',
'Lennox',
'Lufthansa',
'Madeleine',
'Mao',
'Martin Jol',
'Mauritius',
'Medwedew',
'Microsoft',
'Morrison',
'NBC',
'NBC Universal',
'Nashville',
'Neu-Isenburg',
'Neuwahlen',
'Nielsen',
'Nintendo',
'Nordex',
'Oliver Shanti',
'Online-Banking',
'Organisation',
'Ort',
'Pakt',
'Pamplona',
'Paulo',
'Personalvorstand',
'Pete',
'Piloten',
'Pilotengewerkschaft',
'Pilotenvereinigung',
'PolitikerBarroso',
'Portsmouth',
'Postbank',
'Rafael Nadal',
'Robert Kubica',
'SPOE',
'SPOE-Chef',
'Salzau',
'Schlagwort',
'Seidenberg',
'Selbstmordattentter',
'Siedlungen',
'Sony',
'Sorin',
'Sport',
'Sportchef',
'Sportler',
'Stadtpark',
'Steg',
'Stiglitz',
'Streik',
'Suedindien',
'TNK-BP',
'TUI',
'Tagessieg',
'Tarifkonflikt',
'Thompson',
'Trainer',
'Unesco',
'Vanessa',
'Verlagsgruppe',
'Versptungen',
'Verwaltungsrat',
'Volksabstimmungen',
'Wedeler',
'Wissenschaftsrat',
'Won',
'Yang',
'Zeitfahren'
);

$input = $_GET['in'];
$maxPointsDiff = ( isset( $_GET['diff'] ) ? intval( $_GET['diff'] ) : 0 );
$nearest = -1;
$last = null;

foreach( $words as $word )
{
$diff = strPoints( $word, $input );
if( $nearest == -1 || $diff < $nearest )
{
$nearest = $diff;
$last = $word;
}
}

if( $nearest > $maxPointsDiff )
{
echo "Meinten sie " . $last . " (Punkte: " . $nearest . ") anstelle von " . $input;
}
else
{
echo $input . " wurde in der Liste gefunden!";
}
?>

 
Kropff
08-07-2008, 21:43 
 
sagt mal, habt ihr alle nichts zu tun? oder das ist das so ein typischer schwanzvergleich? wer hat den längsten/kürzesten code? :D

peter

 
TobiaZ
08-07-2008, 21:45 
 
Why? Ich find's ein durchaus interessanter Contest!:grin:

 
unset
08-07-2008, 22:51 
 
Checkscript:

<?php

// Wortliste
$aWords = array(
'ARQUES',
'ATP-Turnier',
'Abchasien',
'Abschaltung',
'Ackermann',
'Agrarsubventionen',
'Airline',
'Anixe',
'Annika',
'Atomausstieg',
'Atomenergie',
'Atommeiler',
'Atompolitik',
'Atomstreit',
'Aufenthaltserlaubnis',
'Ausstand',
'Barrot',
'Barth',
'Baur',
'Beiersdorfer',
'Bertha',
'Bischoff',
'Bitkom',
'Bloomberg',
'Borg',
'Brokkoli',
'Bundesnetzagentur',
'Buschkowsky',
'Cadillac',
'Cannes',
'Carolina',
'Carreras',
'Chevrolet',
'Coleman',
'Computerspiele',
'Credit',
'Crouch',
'DVB-T',
'Debitel',
'Deichmann',
'Dmitri Medwedew',
'Donaueschingen',
'EMI',
'EU-Kommissionsprsident',
'EU-Staaten',
'Einwanderung',
'Einwanderungspolitik',
'Ellwangen',
'Elmshorn',
'Elsass',
'Enkelmann',
'Eppler',
'Erdl',
'EreignisErderwrmung',
'Eurosport',
'Eurowings',
'Flamenco',
'Freddie Mac',
'Freiberg',
'Freizgigkeit',
'Fresenius',
'Frontex',
'Funktionre',
'GEMA',
'GWG',
'Gas Natural',
'Generika',
'Gesamtklassement',
'Gnzburg',
'Gontard',
'Hasan',
'Hauptfeld',
'Heckmann',
'Hedge-Fonds',
'Heiligendamm',
'Heisig',
'Hero',
'Hokkaido',
'Holtzbrinck',
'IPO',
'IT-Fitness',
'Icahn',
'Industrienationen',
'Industrieproduktion',
'Insolvenzantrag',
'Islamabad',
'Kabul',
'Karachi',
'Keith Urban',
'Kerkeling',
'Kernenergie',
'Kernkraft',
'Klckner',
'Klimapolitik',
'Klitschko',
'Komax',
'Lennox',
'Lufthansa',
'Madeleine',
'Mao',
'Martin Jol',
'Mauritius',
'Medwedew',
'Microsoft',
'Morrison',
'NBC',
'NBC Universal',
'Nashville',
'Neu-Isenburg',
'Neuwahlen',
'Nielsen',
'Nintendo',
'Nordex',
'Oliver Shanti',
'Online-Banking',
'Organisation',
'Ort',
'Pakt',
'Pamplona',
'Paulo',
'Personalvorstand',
'Pete',
'Piloten',
'Pilotengewerkschaft',
'Pilotenvereinigung',
'PolitikerBarroso',
'Portsmouth',
'Postbank',
'Rafael Nadal',
'Robert Kubica',
'SPOE',
'SPOE-Chef',
'Salzau',
'Schlagwort',
'Seidenberg',
'Selbstmordattentter',
'Siedlungen',
'Sony',
'Sorin',
'Sport',
'Sportchef',
'Sportler',
'Stadtpark',
'Steg',
'Stiglitz',
'Streik',
'Suedindien',
'TNK-BP',
'TUI',
'Tagessieg',
'Tarifkonflikt',
'Thompson',
'Trainer',
'Unesco',
'Vanessa',
'Verlagsgruppe',
'Versptungen',
'Verwaltungsrat',
'Volksabstimmungen',
'Wedeler',
'Wissenschaftsrat',
'Won',
'Yang',
'Zeitfahren'
);

// Alphabet
$sAlpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

// Teilnehmer
$aTestee['name'] = 'unset';
$aTestee['function'] = 'check';
$aTestee['points'] = 0;
$aContest[] = $aTestee;


// Wortliste durchgehen
foreach($aWords as $sWord) {
// Wort zwischenspeichern
$sOriginal = $sWord;

// Wieviele Typos?
$iTypoCount = rand(1, 5);

// Typos einbauen
for($i = 0; $i < $iTypoCount; $i++) {
// Welche Art Typo
$iTypo = rand(1, 3);

// Typo erzeugen
switch($iTypo) {
case 1:
// Buchstaben vergessen
$iPosition = rand(0, strlen($sWord)-1);
for($j = 0; $j < strlen($sWord); $j++) {
if($j != $iPosition) {
$sOutput.= substr($sWord, $j, 1);
}
}
$sWord = $sOutput;
unset($sOutput);
break;

case 2:
// Buchstaben verdreht
$iPosition = rand(0, strlen($sWord)-2);
for($j = 0; $j < strlen($sWord); $j++) {
if($j == $iPosition) {
$sSwitched = substr($sWord, $j, 1);
} elseif($j == ($iPosition + 1)) {
$sSwitched = substr($sWord, $j, 1). $sSwitched;
$sOutput.= $sSwitched;
} else {
$sOutput.= substr($sWord, $j, 1);
}
}
$sWord = $sOutput;
unset($sOutput);
break;

case 3:
// Buchstaben hinzugefügt
$iPosition = rand(0, strlen($sWord));
for($j = 0; $j < strlen($sWord); $j++) {
if($j == $iPosition) {
$sOutput.= substr($sAlpha, rand(0, strlen($sAlpha) - 1), 1);
$sOutput.= substr($sWord, $j, 1);
} else {
$sOutput.= substr($sWord, $j, 1);
}
}
$sWord = $sOutput;
unset($sOutput);
break;
}
}

foreach($aContest as &$aTestee) {
if(call_user_func($aTestee['function'], $sWord) == $sOriginal) {
$aTestee['points']++;
}
}

}

function check($sWord){}

print_r($aTestee);

?>


Wie ihr seht, erwarte ich einen "Vorschlag". Nicht mehr, nicht weniger. Alles andere bedeutet keinen Punkt. Außerdem: Im Test wird es eine andere Wortliste geben, also kommt gar nicht erst auf die Idee, eure Funktion nach dieser zu optimieren und sorgt dafür, dass die Wortliste austauschbar ist ;)

@Kropff: Übung macht den Meister. Und sich mal mit ganz anderen als "alltäglichen" Problemen auseinandersetzen macht hier doch grade den Reiz aus. Abgesehen davon: Das ganze hier soll ja auch Spaß machen. Wenn du keinen an so etwas hast, musst du dich ja nicht drum kümmern.

 
dunixphp
08-07-2008, 22:57 
 
Original geschrieben von TobiaZ
Why? Ich find's ein durchaus interessanter Contest!:grin:

ich auch! Ich lese auch alles brav mit :)

 
unset
08-07-2008, 22:58 
 
Wer den Fehler im Check-Script findet, bekommt einen Extrapunkt ;)

 
Bueddl
08-07-2008, 23:20 
 
wann ist denn nochmal "Einsendeschluss"? :)

 
PHP-Desaster
08-07-2008, 23:36 
 
Absicht, das deine check-Funktion keinen Funktionskörper besitzt?

 
Bueddl
08-07-2008, 23:46 
 
nagut, ich hab nochmal bei 0 Angefangen, da ich das grad so wollt und promt ist noch ein (meiner Meinung nach) besserer, flexibler und besser anzupassender Code dabei rausgekommen.

Die Wortliste ist in "wortliste.php" gespeichert.
Es werden die Parameter "search", der Eingabestring und
"mode" der Arbeitsmodus ('dev' für das var_dump des arrays, wa in der entwicklung nützlich und 'contest', der Modus indem es nur das Wort ausgibt)

Ein Beispielaufru wäre also: http://tools-box.net/dym/scanword.php?search=Wedele&mode=contest


Den Code gibts hier: http://clipboard.4webmaster.net/79

Lg,
Bueddl

 
onemorenerd
09-07-2008, 00:11 
 
Die Wortliste kommt mir komisch vor. Keine Umlaute? EreignisErderwrmung?
Welche Absicht steckt dahinter?

 
onemorenerd
09-07-2008, 00:36 
 
Du hättest das Testscript nicht posten dürfen. Ich habe es gerade überflogen und es scheint reversibel zu sein.
Die Basis ist fix (Wortliste, Alphabet), die max. Anzahl und die Art der Fehler ist bekannt. Der Zufall bestimmt nur die letztliche Ausprägung der Verunstaltung.

Meine Lösung würde den Edit-Abstand zu jedem Wort aus der Liste berechnen. Das Minimum wird als Vorschlag ausgegeben. Das ist quasi das Inverse deiner Art, die Rechtschreibfehler zu erzeugen. Imho sollte das immer eine korrekte Ausgabe liefern.

Es sieht auch so aus, als könne man die Aufgabe nur bei geeigneter Wortliste eindeutig korrekt lösen. Sobald sich zwei Wörter in der Liste so sehr ähneln, dass sie in Reichweite der zufälligen Änderungen liegen, gibt es mehrere korrekte Lösungen.

Ein Beispiel: In der Liste stehen Sack und Socke. Dein Testscript gibt Lack vor. Das kann aus beiden Wörtern generiert worden sein. Aus dem L ein S, schon hat man Sack. Aus dem a ein o und hinten ein e dran ergibt Socke.

 
PHP-Desaster
09-07-2008, 00:44 
 
Übrigens habe ich gerade nicht die Zeit habe, eine eigene Lösung zu erstellen. Aber es sieht so aus, als könne man die Aufgabe nur bei geeigneter Wortliste eindeutig korrekt lösen. Sobald sich zwei Wörter in der Liste so sehr ähneln, dass sie in Reichweite der zufälligen Änderungen liegen, gibt es mehrere korrekte Lösungen.Genau das ist das von mir angesprochene Verhalten bei den Funktionen levenshtein und metaphone. Da ist das gleiche Verhalten zu erkennen.

 
3DMax
09-07-2008, 00:53 
 
habe gerade mal auf blauen dunst etwas ausprobiert - liefert zu deiner funktion gute ergebnisse.


function getBestWord($unsets_word)
{
// Wortliste - eventuell als Funktions-Parameter mitgeben
global $words;

$best_word = null;
$best_sum = 0;

$unsets_word_chars = count_chars($unsets_word);

foreach($words as $original_word)
{
$orginal_word_chars = count_chars($original_word);
$tmp_sum = array_sum(array_intersect_assoc($orginal_word_chars, $unsets_word_chars));

if($tmp_sum > $best_sum)
{
$best_word = $original_word;
$best_sum = $tmp_sum;
}
}

return $best_word;
}


braucht aber irgendwie ewig: Maximum execution time of 30 seconds exceeded
falls du es mit testest, executiontime hochsetzen ;) - dafür ist die funktion aber kurz :)

 
Benny-one
09-07-2008, 10:32 
 
Wenn ihr super langen Code postet, dann nehmt doch http://clipboard.4webmaster.net/
Dann muss man wenigstens nicht ewig nach unten scrollen, nur um den nächsten Beitrag zu finden.

 
Bueddl
09-07-2008, 11:46 
 
@unset, ich hab noch n zusätzliches Programm geschrieben, dass meine Variablen anpasst, muss ich das auch posten, weil eigentlich macht das programm das ja nur einmal und ich setzte die meiner Meinugn nach besten Variablen dann fest. Will nur nicht deswegen Punkte abgezogen bekommen :D


___________
edit:
ok, meine funktion hätt zulange gedauert, mein code bleibt jetzt so, wie er ist :)

Lg,
Bueddl

 
3DMax
09-07-2008, 21:17 
 
nachdem jetzt bestimmts unset's ganzer rechner (nicht nur die platte) den geist aufgegeben hat ;), wollte ich mal eine idee für eine ganz anderes programmier-spiel in das forum schmeißen.

ich stelle mir ein turnier von programmen die z.b. Tic Tac Toe (bestimmt zu simpel) oder schach (bestimmt zu schwer ;)) können - natürlich selbst programmiert und in php. jedes programm eines jeden mitspielers spielt dann gegen alle anderen und dem gewinner wird ruhm und ehre zuteil ;) könnte später auch eine liga werden ;)

ich habe nur so keine richtige idee, welches spiel - es müsste relativ simple regeln haben aber doch recht komplex sein, damit man auch an der strategie feilen kann. jeder teilnehmer müsste dann eine klasse programmieren, die ein regel-interface implementiert und dann könnte es auch schon losgehen.

was haltet ihr davon?

 
eintrachtemil
10-07-2008, 08:45 
 
Ne Poker-Enginge wäre bockstark. Und dazu steuert jeder seine Klasse bei, die entsprechend mitspielen kann. Da könnte man mal ordentlich an der Strategie feilen - der Langzeitspaßfaktor würde da nicht zu kurz kommen.

Ja gut - der Aufwand wäre vielleicht eine kleine Hürde:)


Gerade gefunden: gibt sogar ne PHP-Poker-Enginge:
http://www.phpclasses.org/browse/package/3149.html

 
onemorenerd
10-07-2008, 09:14 
 
Ich kenne mich mit Poker nicht aus, aber ist es nicht so, dass da sehr viel vom Glück abhängt (welche Karten man bekommt)? Dann fände ich Poker nicht gut.
Bei Schach ist es nicht so. Da ist die Anfangssituation immer gleich, es gibt keinen Zufall, selbst die nächsten gegnerischen Züge kann man versuchen zu berechnen. Schach wäre mein Favorit. Dumm nur, dass man im Netz viele Papers und sogar fertige Algorithmen findet.

Ich würde aber generell sagen, dass dieser Thread/Contest so weiterleben sollte wie er ist. Für den Spiele-Contest sollte ein eigener Thread aufgemacht werden.
Das schöne hier ist nämlich, dass die Aufgaben hier bunt gemischt sind und eine gewisse Praxisnähe haben. Ich hätte z.B. noch zwei Ideen, die nichts mit Kryptographie oder Mathematik zu tun haben sondern direkt in einer Webseite eingebaut werden könnten. Andere haben vielleicht auch was in petto oder werden später noch vom einem Geistesblitz getroffen. Es wäre schade, wenn hier wegen einer Spielliga kein Raum mehr dafür wäre.

 
eintrachtemil
10-07-2008, 09:31 
 
Bei der Texas Hold'em Poker-Variante hängt sehr viel von der Strategie ab. Etwas Glück (welche Hände bekomme ich) ist natürlich immer dabei, auf die Dauer setzt sich aber die bessere Strategie durch. So müsste die Poker-Engine den Besten immer über mehrere Durchläufe mitteln.

Da gibt es auch verschiedene Berechnungsverfahren, die die Chancen in bestimmten Situationen ermitteln, die man gut einbauen könnte - kombiniert dann mit der eigenen Spielweise und Taktik.

Da ich selber hin und wieder privat Poker spiele, würde mich das voll reizen. Aber wahrscheinlich für mal kurz so nebenher etwas zu aufwendig.

Dessen ungeachtet sollte der bestehende Thread natürlich weiterbestehen.

 
case
10-07-2008, 10:26 
 
Also ich finde diese Idee auch wirklich gut...

Nur Poker wäre meiner Meinung nach nicht das Richtige.

Es gibt beim Poker natürlich schon strategien etc. allerdings hat es trotzdem immer noch viel mit Glück zu tun und die Strategien so zu verfeinern ist vielleicht (für den Anfang) etwas zu komplex.

TicTacToe ist natürlich prädestiniert. Nur ist hier das Problem, dass die Logik so einfach ist, dass wenn 2 Klassen gegeneinander spielen es nach 1000 Spielen 500:500 stehen wird.

Natürlich muss vor Anfang der KI-Programmierung schon der "Spielmaster" (so nenne ich ihn einfach mal) geschrieben werden.

Mein Vorschlag: 4 gewinnt.

Und falls ich die Tage mal Zeit habe werde ich den Spielmaster schreiben ;)

 
PHP-Desaster
10-07-2008, 20:30 
 
So einen Wettbewerb finde ich auch ziemlich interessant. Allerdings sollte es in einem solchen Rahmen sein, dass auch Leute mitspielen können, die weniger Zeit haben (Arbeit, Studium, Reallife). Damit meine ich, die Basisfunktion ist recht schnell implementiert und es kann dann viel Zeit in die Strategie gesetzt werden.
Schach könnte vielleicht sogar so ein Spiel sein. Poker gefällt mir persönlich aber auch nicht, liegt wohl am trotzdem noch vorhandenen Glücksfaktor und einige schon professionell spielen und andere - so wie ich - noch nicht mal die Regeln kennen. 4 gewinnt ist aber auch cool!
Wie schon gesagt, sollte aber in einen anderen Thread, dieser Thread sollte so bestehen bleiben.

 
TheFish511
10-07-2008, 22:16 
 
Schach fände ich super. Zwar komplex, aber für eine 4 gewinnt KI würd' ich mich wahrscheinlich nicht mal halb so stark bemühen. Das Spiel ist zu langweilig.
Beim Poker müsste man halt mehrere tausend Hände simulieren, um ein aussagekräftiges Ergebnis zu bekommen. Ich spiele zwar gerne Poker, aber ich finde es deswegen auch nicht so gut geeignet.

PS: Wie kommt man eigentlich auf die Idee ne KI mit PHP zu schreiben? :D

 
Bueddl
10-07-2008, 22:29 
 
Also ich find die Idee auch Klasse :) Könnte mir vorstellen, dass sich da auch Teams bilden und dass, wie hier schon erwähnt, sich dann wirklich so n kleiner Wettkampf in dem jeweils gleichen Spiel Ki vs. Ki bildet.

Aber um ehrlich zu sein finde ich dieses Forum hier dazu nicht angemessen, es ist einfach nicht dafür gedacht, aber cih erwähnte schon mal die URL: www.tools-box.net, die ich mit nem Kumpel machen wollt, ist nix drauß geworden, den dazu gehörenden RootServer hab ich noch gemietet und das bleibt auch sicher so, also könnten wir das ja da machen und hier im Forum darauf verweisen. (Sowas sollte man Grundsätzlich mit den Moderatoren im FOrum abklären, gibt sonst ärger). Also ich hätt da echt Lust drauf :D

Wenn noch einer Lust hat, kann er sich ja mal (Hier) melden und sagen, was er davon hält das auf der Domain zu machen (wir könne ja eig alles installieren, was legal ist^^) Ich wäre für ne Forensoftware wei PHPBB oder so.

______________
edit: man könnte ja wirklich so Kategorien mit verschiedenen Games machen :)

Würde mich freuen,
Lg,
Bueddl =)

 
TBT
10-07-2008, 22:35 
 
Original geschrieben von TheFish511
PS: Wie kommt man eigentlich auf die Idee ne KI mit PHP zu schreiben? :D

so: http://www.php-resource.de/forum/showthread.php?s=&threadid=24145&highlight=schach

 
PHP-Desaster
10-07-2008, 23:21 
 
Warum nen eigenes Forum? Dazu genügt (vorerst) einmal ein Thread hier. Vielleicht wird ja eh nichts draus, ansonsten kann man bei sehr großer Begeisterung ja immer noch was aufsetzen.
Viel wichtiger ist zu klären, wie das ganze ablaufen soll. Im Grunde implementiert jeder Spieler ein vorgegebenes Interface und ein entsprechendes Spiel-Objekt übernimmt die Überwachung der korrekten Regeln, übergibt die Zugreihenfolge, erstellt Statistiken. Und auch, wer diese Aufgaben übernimmt, d.h. diese Controller-Objekte implementiert und das Spieler-Interface vorgibt.

@Bueddl: Kannst du deinen Code mal umbrechen? Ist so überbreit!

 
3DMax
11-07-2008, 01:33 
 
erstmal sorry für den thread im thread - vielleicht findet sich ja mal ein forenadmin, der den branch zu einem neuen trunk macht ;) ?

also ich fand bisher "4 gewinnt" am besten - einfach und trotzdem komplex. wobei es zu verbreitet/wissentschaftlich untersucht ist. aber, man könnte ja noch in der spielfeldgröße variieren oder zusätzlich eine zufallskomponente einbauen (dritter zufallsspieler mit neutralem stein) ...

wobei ich poker auch nicht schlecht fand, da mit zufallskomponente aber trotzdem kein reines glücksspiel. ähnlich wie blachjack (siehe film "21")

außerdem bin ich überrascht, wieviele hier für schach plädieren - das ist ja nun sehr komplex bzw. aufwändig und die regeln können bestimmt auch nicht so viele, oder (obwohl, programmierer bestimmt eher ;))?
aber wenn jemand eine abstrakte basisklasse zur verfügung stellen würde, die grundlegende methoden bereitstellt (also nicht nur ein interface), könnte ich mir vorstellen, dass hier einige forenmitglieder mitmachen.
sowas wie $chess->getPossibleMoves() etc.
dann könnte man die klasse um z.b. seine bewertungsfunktion erweitern. und muss für grundlegende sachen das rad nicht neu erfinden.

ich hatte auch schon etwas aus der spieletheorie im auge, wie z.b. das Gefangenendilemma (http://de.wikipedia.org/wiki/Gefangenendilemma) nur da fährt man wahrscheinlich mit "Tit for tat" am besten - also nicht ganz geeignet.

aber wer weiß, vielleicht hängt es nur davon ab, wer zuerst "basiscode" zur verfügung stellt, wie z.b. case mit seinem "Spielmaster"!?

 
Bueddl
11-07-2008, 02:40 
 
Welchen Code meinste, hier is doch gar keiner? :rolleyes:

Ich meinte eigentlich nur, dass, wenn was drauß wird, dass es hier dann nicht so passend angebracht wäre. Da ich denke, dass das Forum hier nicht genug Möglichkeiten bietet. Ich stimme dir aber voll und ganz zu, das wir das hier erstmal testen sollten nd schaun, wies ankommt.

Lg,
Bueddl

 
TheFish511
11-07-2008, 14:54 
 
Original geschrieben von 3DMax
wobei ich poker auch nicht schlecht fand, da mit zufallskomponente aber trotzdem kein reines glücksspiel. ähnlich wie blachjack (siehe film "21")

Naja, zwischen Black Jack und Texas Hold'em ist glaub ich doch noch ein deutlicher Unterschied.


außerdem bin ich überrascht, wieviele hier für schach plädieren - das ist ja nun sehr komplex bzw. aufwändig und die regeln können bestimmt auch nicht so viele, oder (obwohl, programmierer bestimmt eher ;))?

Naja, ich kann Schach. Außerdem soll die KI ja auch nicht gegen einen Menschen gewinnen, sondern nur gegen eine andere KI.

Vorteil von Poker:
Man muss nicht jeden gegen jeden spielen lassen, sondern alle(zumindest 10) können auf einmal simuliert werden.
Texas Hold'em ist ein geniales Spiel.
Nachteil beim Poker:
Wegen dem Glückfaktor müsste man mehrere Runden simulieren, damit zumindest 1000 Hände zusammenkommen.

Vorteil vom Schach:
Kein Glücksspiel.
Nachteil beim Schach:
Sehr Komplex.

Vorteil von 4 gewinnt:
Nicht so komplex.
Nachteil:
Langweilig. :D

 
Bueddl
12-07-2008, 13:58 
 
Wo bleibt eigentlich die Auflösung, bzw. die Auswertung der letzten AUfgabe? =)

Lg,
Bueddl

 
PHP-Desaster
13-07-2008, 17:09 
 
Welchen Code meinste, hier is doch gar keiner? :rolleyes:Der hier: http://php-resource.de/forum/showthread.php?s=&postid=593840#post593512!

 
Bueddl
14-07-2008, 13:11 
 
Du sry, bei mir is auf seite 14 kein Code...

 
PHP-Desaster
14-07-2008, 13:51 
 
Du sry, bei mir is auf seite 14 kein Code...Ach verdammt, ich habe ein paar Posts mehr pro Seite, bei mir gibt's nur 7 Seiten. Darum funktioniert mein Link bei dir nicht. Nimm mal diesen: http://php-resource.de/forum/showthread.php?s=&postid=593512#post593512

 
Bueddl
15-07-2008, 10:56 
 
AH ok, danke , mach ich eben mal =)

Hier mal der Code, hab ihn bein anderen Post auch verlinkt:

http://clipboard.4webmaster.net/79

Lg,
Bueddl

 
unset
16-07-2008, 10:21 
 
Sorry Leute, ich bin leider mehr oder weniger heftig erkrankt. Jetzt bin ich aber wieder auf dem Damm (zumindest sagt meine Ärztin das ;)) und ich werde mich heute oder Morgen um die Auflösung kümmern. :)

 
Bueddl
18-07-2008, 14:46 
 
nadann :) mal rein ins vergnügen :-P

 
Bueddl
24-07-2008, 09:41 
 
:huep: :huep: :huep: :huep: :huep:
...

 
unset
24-07-2008, 09:45 
 
Keine Zeit, keine Zeit. Manche Menschen müssen auch noch arbeiten ;)

 
Bueddl
24-07-2008, 10:30 
 
jaja xD

wollt eigentlich auch nur ma die tollen Smilies testen ;)

lg,
bueddl

 
Bueddl
27-07-2008, 19:37 
 
Bis du ma fertig bist mit dem auswerten könnte ja jemadn mal die nächste Aufgabe stellen, dann wär mir nicht sooo langweilig :-P

Lg,
Bueddl

 
Blackgreetz
27-07-2008, 19:57 
 
Original geschrieben von Bueddl
Bis du ma fertig bist mit dem auswerten könnte ja jemadn mal die nächste Aufgabe stellen, dann wär mir nicht sooo langweilig :-P

Na dann leg los, obwohl ja immer der "Gewinner" eine Aufgabe stellen sollte.., aber egal..

mfg

 
PHP-Desaster
27-07-2008, 20:13 
 
Bis du ma fertig bist mit dem auswerten könnte ja jemadn mal die nächste Aufgabe stellen, dann wär mir nicht sooo langweilig :-POder die beste Lösung der Aufgabe selbst ermitteln!

 
Bueddl
28-07-2008, 12:31 
 
Original geschrieben von PHP-Desaster
Oder die beste Lösung der Aufgabe selbst ermitteln! #

Sry, ich seh ein, dass es das Prinzip war, dass der Gewinner die nächste Aufgabe stellt, aber ich versteh nicht, wieso ich denn die Auswertung machen soll? unset hat ja gesagt, dass er es macht, also lass ihn das doch auch machen....

Grüße,
Bueddl

 
PHP-Desaster
28-07-2008, 12:55 
 
Sry, ich seh ein, dass es das Prinzip war, dass der Gewinner die nächste Aufgabe stellt, aber ich versteh nicht, wieso ich denn die Auswertung machen soll? unset hat ja gesagt, dass er es macht, also lass ihn das doch auch machen....Dann stell halt die nächste Aufgabe, unset ist momentan wohl beschäftigt.

 
unset
28-07-2008, 12:59 
 
Mein Testscript hab ich gepostet, wer will, kann die Auflösung übernehmen. Ich hab grad wichtigeres zu tun, sorry =/

 
unset
29-06-2009, 20:27 
 
Ich war dran, oder? Ich hab da so eine Idee für eine neue Aufgabe. Mal sehen, ob das in den nächsten paar Minuten was wird … :-)

 
Kropff
29-06-2009, 21:45 
 
Ich war dran, oder? Ich hab da so eine Idee für eine neue Aufgabe. Mal sehen, ob das in den nächsten paar Minuten was wird … :-)
Ihr habt echt nichts Vernünftiges zu tun, oder? ;) Dann hätte ich was für euch. Es geht um die Auswertung der ersten Hand in einem Pokerspiel. Man bekommt fünf Karten und es muss geprüft werden, ob vier Karten schon eine kleine Straße ergeben. Wir hätten also zum Beispiel:

Kreuz Bube, Karo 9, Herz 8, Kreuz Ass und Karo 10

Da sollen nun die Werte 8, 9, 10, Bube als potentielle Straße gewertet werden. Das gilt natürlich nicht für

Kreuz König, Karo 9, Herz 8, Kreuz Ass und Karo 10

Und das bitteschön in JavaScript!

Viel Vergnügen!
Peter

 
PHP-Desaster
29-06-2009, 21:54 
 
Wie sehen die Eingabedaten aus?

 
unset
29-06-2009, 21:56 
 
Wenn du mir verrätst in welcher pokervariante es kleine Straßen gibt, löse ich dir das ;)

 
Kropff
29-06-2009, 22:04 
 
Wenn du mir verrätst in welcher pokervariante es kleine Straßen gibt, löse ich dir das ;)
Es geht dabei um eine Empfehlung, besagte vier Karten zu halten. Für die zweite Ziehung, um eine mögliche Straße zu erhalten. Es gibt nur einen Spieler und der Gewinn berechnet sich aus dem Wert der Karten. Also ein Five Cards Hold ohne Gegenspieler.

Btw. Die Karten werden jeweils über einen Zufallsgenerator gezogen.

Peter

 
unset
29-06-2009, 22:24 
 
Dann mal her mit dem Eingabeformat!

 
Kropff
30-06-2009, 09:17 
 
Dann mal her mit dem Eingabeformat!
:confused::confused: Was für ein Eingabeformat?

Peter

 
unset
30-06-2009, 09:28 
 
Ich nehme doch mal an, dass du die Funktion oder die Klasse bereit stellst, die die Karten ausgibt. Da muss man also schon wissen, wie die Daten ankommen!

 
Kropff
30-06-2009, 09:34 
 
Ach so. Ich stelle dir heute Abend mal die Daten zur Verfügung. Ist ein Pokerautomat, an dem ich gerade sitze.

Peter

 
Kropff
30-06-2009, 20:10 
 
So, vorab mal der Basiscode. Der Einfachkeit halber habe ich mal zwei Beispiele angegeben, die beliebig variiert werden können (da eine mögliche Straße eh sehr selten ist:
function pokerFunction()
{
this.hand = new Array();
var self = this;

this.setCards = function()
{
// Dies wäre keine Straße
this.hand[0] = 'pik#8';
this.hand[1] = 'dame#10';
this.hand[2] = 'kreus#d';
this.hand[3] = 'herz#9';
this.hand[4] = 'pik#k';

// das schon
this.hand[0] = 'pik#8';
this.hand[1] = 'dame#10';
this.hand[2] = 'kreus#b';
this.hand[3] = 'herz#9';
this.hand[4] = 'pik#k';
}

function checkStreet()
{
// gibt die Karten zurück, die eine Straße bilden können
// Reihenfolge muss unbedingt eingehalten werden
}
}
var cards =
{
rank :
{
'2': 1, '3': 2, '4': 3, '5': 4, '6': 5, '7': 6, '8': 7,
'9': 8, '10': 9, 'b': 10, 'd': 11, 'k': 12, 'a': 13
}
}


Kurz zur Erläuterung, b steht für Bube, d für Dame, K für König (a für Ass). Den Trenner # benötige ich für andere Dinge. Das Literal cards: hier bilde ich einfach die Reihenfolge der Karten ab.

Die Aufgabenstellung:

Mit möglichst wenig Code herauszufinden, ob man vier aufeinander folgende Karten hat. Dabei gilt, dass es zwei Möglichkeiten für eine komplette Straße geben muss, also eine passende Karte entweder am Anfang oder am Ende. Das bedeutet, dass Kombinationen wie 2,3,4,5,irgendwas und auch irgendwas,b,d,k,a, ausscheiden, da es jeweils nur eine Möglichkeit gibt. Es darf auch kein "Loch" da sein, obwohl eine Straße möglich wäre, also zum Beispiel 8,9,10,d,irgendwas.

Wichtig. Die Reihenfolge(!) der zurückgegebenen Karten darf sich gegenüber dem Array this.hand nicht ändern. Nur der numerische Index.

Bei Fragen einfach melden, ich zerbrech mir schon seit Tagen den Kopf über eine elegante Lösung. Spielt das mal mit diversen Kombinationsmöglichkeiten durch.

Peter

 
Abraxax
30-06-2009, 20:48 
 
Hey Peter. Jetzt spannst du schon das Forum zum Lösen deiner Probleme ein ... Und unset merkt das noch nicht einmal. :D

Rechtschreibkorrekturen ... *gg*

 
unset
30-06-2009, 21:37 
 
Ich merk das schon, aber Peter vorzuführen macht Spaß :p

 
Abraxax
30-06-2009, 21:42 
 
So ... Peter. Dein Einwand bitte hier: __________________________ :p

 
PHP-Desaster
30-06-2009, 21:44 
 
Meine Lösung ist im Anhang :)

 
unset
30-06-2009, 21:47 
 
So ... Peter. Dein Einwand bitte hier: __________________________ :p
Ich gebe schon mal ein paar Vorlagen zum rauskopieren:

Kindeteller
Erfahrung des Alters


=P

 
Kropff
30-06-2009, 21:48 
 
So ... Peter. Dein Einwand bitte hier: __________________________ :p

Kein Einwand meinerseits. Ich habe eine Lösung aber die sieht extrem dreckig aus und unset kriegt ja den Hals nicht voll :). Da dachte ich einfach mal, ich spann ihn ein. Ist aber nur was völlig Privates, aus einer Langeweile heraus entstanden.

Peter

PS. Wenn er eine gute Lösung hat, dann küsse ich seinen weißen behaarten Hintern (metaphorisch natürlich).

 
PHP-Desaster
30-06-2009, 21:51 
 
Ich habe eine Lösung aber die sieht extrem dreckig ausDie würd ich aber mal gern sehen :p

 
Kropff
30-06-2009, 21:52 
 
Meine Lösung ist im Anhang :)
Schau ich mir morgen mal an. In Köln ist es derzeit drückend schwül, da kann ich nicht richtig denken.

Danke
Peter

PS: Heißt du unset? :D

 
PHP-Desaster
30-06-2009, 21:53 
 
PS: Heißt du unset? :DHöhö, nicht wirklich ^^ Wenn die Aufgabe ausschließlich an unset gerichtet war, beachte meine Lösung einfach gar nicht :grin:

 
Kropff
30-06-2009, 21:56 
 
Höhö, nicht wirklich ^^ Wenn die Aufgabe ausschließlich an unset gerichtet war, beachte meine Lösung einfach gar nicht :grin:
Wie gesagt, schaue ich mir morgen an. Wenn mir mein neuer Rechner nicht dazwischen kommt. Versuche seit 3 Stunden, Windows XP zu installieren, aber mir fliegen die Fehlermeldungen nur so um die Ohren und ich habe keine Ahnung was los ist.

Peter

 
unset
30-06-2009, 21:58 
 
get a mac ;)

 
Kropff
30-06-2009, 22:02 
 
get a mac ;)
NÖ! Schon aus Prinzip nicht! Unter Ubuntu wird der Raid problemlos erkannt, nur XP zickt mal wieder herum. Brauche ich leider, wegen des verk***ten IE und diverser Spiele. Werd mal unseren Admin morgen nerven, der hat das ja zusammengebaut :).

Peter

PS. Wo bleibt deine(!) Lösung? :D

 
Abraxax
30-06-2009, 22:03 
 
Oder nimm Linux ;-)

 
Kropff
30-06-2009, 22:10 
 
Oder nimm Linux ;-)
Das kommt auf meine alte Kiste, den ich dann als Server nutze. Sobald die neue Gurke läuft. Muss halt ab und zu mal zocken, da komme ich um um XP nicht herum. Und per Virtualisierung ist das nicht so prickelnd.

Peter

 
Abraxax
30-06-2009, 22:14 
 
Unter Linux kannst du auch "zocken". Nimm z.B. Sauerbraten, für dich das Richtige. ;)

 
Kropff
30-06-2009, 22:18 
 
Unter Linux kannst du auch "zocken". Nimm z.B. Sauerbraten, für dich das Richtige. ;)
Haha! Du bist kein "richtiger" Zocker, oder? :) Und wtf ist Sauerbraten?

Peter

 
Abraxax
30-06-2009, 22:22 
 
Haha! Du bist kein "richtiger" Zocker, oder? :)

Nö ...

Und wtf ist Sauerbraten?

http://sauerbraten.org/

 
mermshaus
30-06-2009, 22:25 
 
Darf ich auch mitmachen? Lösung per PM an Peter?

Gruß Marc

 
unset
30-06-2009, 22:28 
 
Jeder darf mitmachen. Lösung immer hier rein.

 
mermshaus
30-06-2009, 22:31 
 
Hmm, ist's nicht sinnvoller, die Lösungen nachher gesammelt zu posten? So verdirbt man sich nicht gegenseitig den Spaß.

Edit: ↓↓↓ Na schön. Das mit dem Anhang ist eine gute Idee.

 
unset
30-06-2009, 22:32 
 
Wie du siehst, wurden hier bereits mehrere "Aufgaben" absolviert, und keiner hat sich den Spaß verdorben.

 
PHP-Desaster
01-07-2009, 09:40 
 
Wie du siehst, wurden hier bereits mehrere "Aufgaben" absolviert, und keiner hat sich den Spaß verdorben.

Und wo ist deine Lösung? :p Ohne wird Kropff niemals Ruhe geben.


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:06 Uhr.