Die Regeln sind klar. Dass sie dir nicht passen ist eine andere Sache. Das fiele dann aber unter "ändern bitte" und nicht unter "unklar formuliert".
Das schöne an meinen Regeln ist, dass man sie leicht verwirklichen kann: markieren, Zeichen ablesen, ein paar Mal 50 addieren - fertig. Würde man sie verkomplizieren, z.B. Leerzeichen nicht mehr zählen, wäre das für einen Menschen schlecht nachzuprüfen - man bräuchte also eine PHP-Funktion, mit der man seinen Code füttert, und die einem die Anzahl der Punkte oder Zeichen oder was auch immer mitteilt. Das Problem ist, dass etwas derartiges ziemlich schwer zu schreiben ist; generisch wird es wohl etwa so aussehen:[php:1:cd5de247d0]function evaluate($string) {
$string = strtolower($string); // Bringen wir's mal in eine schöne Form...
$string = preg_replace('@[^\\x20-\\x7e]@i', '', $string); // Alle bis auf druckbare ASCII-Zeichen und Space entfernen
$string = preg_replace('@\\s{2,}@', ' ', $string); // Mehrfache Spaces kürzen
// Wie löscht man Kommentare? Man müsste theoretisch den kompletten String parsen... Oder was sonst will man mit "/*"/**/ machen?
$returncount = substr_count($string, 'returnn');
$languageconstructs = array( // Die Funktionen, die keine Punkte kosten sollen
'for',
'foreach',
'while',
'list',
'if',
'elseif',
// else ist hier aber blöd einzubauen...
);
preg_match_all('@'.implode('|', $languageconstructs).'@', $string, $constructcount); // Zählt alle Sprachkonstruktoren des Typs foo, sofern im Array genannt
print_r($constructcount);
$constructcount = count($constructcount[0]);
preg_match_all('@[a-z_][a-z0-9_]*\\(@i', $string, $functioncount); // Zählt alle Funktionen des Typs foo(
print_r($functioncount);
$functioncount = count($functioncount[0]);
$functionvalue = 0 // Bauen wir uns den Punktestand
+ strlen($string)
+ 10 * (($returncount > 0) ? $returncount - 1 : 0) // Das erste return ist kostenlos, jedes weitere kostet 10 Punkte. Kein einziges return zu haben bringt aber leider keine 10 Punkte.
+ 50 * $functioncount // Für jede Funktion gibt's 50 Punkte extra
- 50 * $constructcount // ...die Konstrukte werden allerdings wieder abgezogen
- strlen('function') // Function am Anfang nicht mitzählen
;
return $functionvalue;
}[/php:1:cd5de247d0]...wohlgemerkt: die Funktion entfernt keine Kommentare, zählt elseif als 2 Konstrukte (else+if), hat Probleme mit Klammern und was weiß ich noch alles. Außerdem gibt's Probleme, sobald die Konstruktoren keine Klammern haben (z.B. else). Das alles einzubauen wage ich zu behaupten ist eine Arbeit, die einen wohl mehrere Wochen beschäftigen wird.
Des weiteren haben furchtbar aussehende Codes auch einen Vorteil: man kann sie nicht mal so ankucken, man muss sie auseinanderfieseln und sich damit beschäftigen, sonst ist man chancenlos. Und wer schon unbedingt auf der Funktion jemanden anders aufbauen will, der soll das auch tun - oder gefälligst seine eigenen Ideen einbringen. (So war das auch eigentlich gedacht...)
So, nun zu Duddles Primzahl-Script: Ich hab's mal aus Spaß mit allen Zahlen bis 10.000 probiert und irgendwie baut es seltsame Sachen; ich hab's auseinandergebaut, aber wo der Fehler herkommt ist mir schleierhaft - vielleicht ein Bug in PHP? Jedenfalls gibt's bei mir bei 9998 2 Primfaktoren - 2 und 4999.