Avatar billede pme Nybegynder
17. april 2015 - 23:34 Der er 7 kommentarer og
1 løsning

Mail alias

Godaften Eksperter

Jeg har fået en lille opgave, nemlig at generer et mail alias ud fra en brugers føde navn (kun ASCII tegnene)
Hvis nu jeg har en bruger, som f.eks. hedder Søren Hyggesen Nielsen så kunne jeg godt tænke mig en algoritme som giver f.eks. 10 forskellige mail aliases som er genereret ud fra navnet. Alle 3 navne må gerne indgå i algoritmen og længden skal være på 5 tegn.

Nogle gode ideer til løsning af den opgave?

mvh peter
Avatar billede arne_v Ekspert
18. april 2015 - 04:21 #1
Maaske noget a la:


<?php
function echoline($alias) {
    echo "$alias\r\n";
}

function dk2en($name) {
    return str_replace(array('Æ','Ø','Å','æ','ø','å'), array('Ae','Oe','Aa','ae','oe','aa'), $name);
}

function generate_pieces($s, $prefix_length, $try_suffix) {
    $res = array();
    for($len = 1; $len <= $prefix_length; $len++) {
        $res[] = substr($s, 0, $len);
    }
    if($try_suffix) {
        $res[] = $s[0] . $s[strlen($s) - 1];
    }
    return $res;
}

function generate_recursive($res, $name_parts, $index, $prefix_length, $try_suffix, $min_length, $max_length, $process_func) {
    if($index < count($name_parts)) {
        foreach(generate_pieces($name_parts[$index], $prefix_length, $try_suffix) as $piece) {
            generate_recursive($res . $piece, $name_parts, $index + 1, $prefix_length, $try_suffix, $min_length, $max_length, $process_func);
        }   
    } else {
        if($min_length <= strlen($res) && strlen($res) <= $max_length) {
            $process_func($res);
        }   
    }       
}

function generate($name, $prefix_length, $try_suffix, $min_length, $max_length, $translate_func, $process_func) {
    $name_parts = explode(' ', strtolower($translate_func($name)));
    generate_recursive('', $name_parts, 0, $prefix_length, $try_suffix, $min_length, $max_length, $process_func);
}

generate('Søren Hyggesen Nielsen', 2, true, 5, 5, 'dk2en', 'echoline');
?>
Avatar billede pme Nybegynder
18. april 2015 - 18:40 #2
Respekt - det er en god løsning. Den er dog ikke helt bullet proof.

Jeg har prøvet med disse navne og det gav disse resultater:
Søren Hyggesen Nielsen:
shyni, shynn, shnni, shnnn, sohni, sohnn, sohyn, sohnn, snhni, snhnn, snhyn, snhnn

Søren Hyggesen Andersen Nielsen:
shani, shann, shann, shann, shyan, shnan, sohan, snhan

Søren Ib Hyggesen Andersen Nielsen
sihan

Gurli Andersen
intet resultat

Hvis den kan komme til at håndtere ovenstående tror jeg at den er hjemme og jeg ville kunne benytte den på websiden
Avatar billede arne_v Ekspert
18. april 2015 - 20:11 #3
Er det ikke bare et spoergsmaal omn at saette parameterne rigtigt?

to navne, max. 2 tegn fra hvert navn og minimum 5 tegn ialt er et vanskeligt krav at moede!
Avatar billede arne_v Ekspert
18. april 2015 - 20:12 #4
Men jeg kunne naturigvis lade metoden selv proeve at saette max antal tegn fra hvert navn udfra andtal navne og total laengde.
Avatar billede arne_v Ekspert
18. april 2015 - 21:09 #5

<?php
function echoline($alias) {
    echo "$alias\r\n";
}

function dk2en($name) {
    return str_replace(array('Æ','Ø','Å','æ','ø','å'), array('Ae','Oe','Aa','ae','oe','aa'), $name);
}

function generate_pieces($s, $prefix_length, $try_suffix) {
    $res = array();
    for($len = 1; $len <= $prefix_length; $len++) {
        $res[] = substr($s, 0, $len);
    }
    if($try_suffix) {
        $res[] = $s[0] . $s[strlen($s) - 1];
    }
    return $res;
}

function generate_recursive($res, $name_parts, $index, $prefix_length, $try_suffix, $min_length, $max_length, $process_func) {
    if($index < count($name_parts)) {
        foreach(generate_pieces($name_parts[$index], $prefix_length, $try_suffix) as $piece) {
            generate_recursive($res . $piece, $name_parts, $index + 1, $prefix_length, $try_suffix, $min_length, $max_length, $process_func);
        }   
    } else {
        if($min_length <= strlen($res) && strlen($res) <= $max_length) {
            $process_func($res);
        }   
    }       
}

function generate($name, $prefix_length, $try_suffix, $min_length, $max_length, $translate_func, $process_func) {
    $name_parts = explode(' ', strtolower($translate_func($name)));
    generate_recursive('', $name_parts, 0, $prefix_length, $try_suffix, $min_length, $max_length, $process_func);
}

function generate_smart($name, $length, $translate_func, $process_func) {
    $num_parts = count(explode(' ', $name));
    $prefix_length = (int)ceil($length / $num_parts) + 1;
    if($prefix_length > 2) {
        $try_suffix= true;
        $prefix_length--;
    } else {
        $try_suffix= false;
    }
    generate($name, $prefix_length, $try_suffix, $length, $length, $translate_func, $process_func);
}

generate('Søren Hyggesen Nielsen', 2, true, 5, 5, 'dk2en', 'echoline');

function test($name) {
    echo "$name:\r\n";
    generate_smart($name, 5, 'dk2en', 'echoline');
}

test('Søren Hyggesen Nielsen');
test('Søren Hyggesen Andersen Nielsen');
test('Søren Ib Hyggesen Andersen Nielsen');
test('Gurli Andersen');
?>
Avatar billede pme Nybegynder
18. april 2015 - 21:42 #6
Hvor er det bare godt.

Tusinde tak for koden, det er jo lige det jeg skulle bruge
Avatar billede arne_v Ekspert
19. april 2015 - 04:14 #7
Her er en objekt orienteret variant:


<?php
trait DK2EN {
    protected function translate($name) {
        return str_replace(array('Æ','Ø','Å','æ','ø','å'), array('Ae','Oe','Aa','ae','oe','aa'), $name);
    }
}

trait EchoLine {
    protected function process($alias) {
        echo "$alias\r\n";
    }
}

abstract class AliasGenerator {
    private $prefix_length;
    private $try_suffix;
    private $min_length;
    private $max_length;
    public function __construct($prefix_length, $try_suffix, $min_length, $max_length) {
        $this->configure($prefix_length, $try_suffix);
        $this->min_length = $min_length;
        $this->max_length = $max_length;
    }
    private function generatePieces($s) {
        $res = array();
        for($len = 1; $len <= $this->prefix_length; $len++) {
            $res[] = substr($s, 0, $len);
        }
        if($this->try_suffix) {
            $res[] = $s[0] . $s[strlen($s) - 1];
        }
        return $res;
    }
    private function generateRecursive($res, $name_parts, $index) {
        if($index < count($name_parts)) {
            foreach($this->generatePieces($name_parts[$index]) as $piece) {
                $this->generateRecursive($res . $piece, $name_parts, $index + 1);
            }   
        } else {
            if($this->min_length <= strlen($res) && strlen($res) <= $this->max_length) {
                $this->process($res);
            }   
        }       
    }
    public function generate($name) {
        $name_parts = explode(' ', strtolower($this->translate($name)));
        $this->generateRecursive('', $name_parts, 0);
    }
    protected function configure($prefix_length, $try_suffix) {
        $this->prefix_length = $prefix_length;
        $this->try_suffix = $try_suffix;
    }
    protected abstract function translate($name);
    protected abstract function process($alias);
}

class AliasGeneratorDK2ENEchoLine extends AliasGenerator {
    use DK2EN;
    use EchoLine;
}

class SmartAliasGeneratorDK2ENEchoLine extends AliasGeneratorDK2ENEchoLine {
    private $length;
    public function __construct($length) {
        parent::__construct(0, false, $length, $length);
        $this->length = $length;
    }
    public function generate($name) {
        $num_parts = count(explode(' ', $name));
        $prefix_length = (int)ceil($this->length / $num_parts) + 1;
        if($prefix_length > 2) {
            $try_suffix= true;
            $prefix_length--;
        } else {
            $try_suffix= false;
        }
        $this->configure($prefix_length, $try_suffix);
        parent::generate($name);
    }
}

$gen = new AliasGeneratorDK2ENEchoLine(2, true, 5, 5);
$gen->generate('Søren Hyggesen Nielsen');

function test($gen, $name) {
    echo "$name:\r\n";
    $gen->generate($name);
}

$smartgen = new SmartAliasGeneratorDK2ENEchoLine(5);
test($smartgen, 'Søren Hyggesen Nielsen');
test($smartgen, 'Søren Hyggesen Andersen Nielsen');
test($smartgen, 'Søren Ib Hyggesen Andersen Nielsen');
test($smartgen, 'Gurli Andersen');

?>
Avatar billede arne_v Ekspert
19. april 2015 - 04:14 #8
og et svar fra mig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester