Avatar billede bearhugx Nybegynder
11. december 2003 - 13:12 Der er 4 kommentarer og
2 løsninger

hvornår kan opgaven udføres (string/mask opgave)

Hejsa eksperter....

Her kommer en lidt tricky streng-opgave...

Jeg har en string som kan indeholde følgende bogstaver '1', '0' samt kontrolblokken "§hhmm-"
Disse repræsenterer en medarbejders "ledighed" over en vis periode...
et '1' betyder at i de næste 15 minutter er medarbejderen optaget af et eller andet - hvorimod et '0' betyder at medarbejderen er fri.
Kontrolblokken betyder at der skiftes til næste dag og tidspunktet imellem §-tegnet og "-" er mødetidspunktet for medarbejderen...

f.eks. betyder "00001111§1030-0000110010" at medarbejderen er
- fri i en time
- derefter har en times arbejde
- derefter fyraften
- han møder næste dag kl. 10:30
- er fri i en time
- derefter har en halv times arbejde  og derefter
- er fri i en halv time

Derudover har jeg også en streng som repræsenter en opgave
"111" betyder en opgave, som tager 3 kvarter...

Jeg skal nu finde en smart måde, hvormed jeg kan sige - den opgave kan løses af medarbejderen på de og de tidspunkter...

hvis vi i ovenstående eksempel antager at starttidspunktet for medarbejderens "bitmap" er kl. 15:00 så kan opgaven "111" løses kl. 15:00, 15:15 - men ikke kl. 15:30 og resten af dagen-
næste dag kan den løses kl. 10:30 og 10:45;


Er der en nem måde, hvormed jeg kan udlede den information ???

og for at gøre det lidt mere indviklet - der er også opgaver hvori der er indregnet pause - f.eks. en opgave som har bitmappen "101"...
Den ville, udover tidspunkterne for "111" også kunne løses den næste dag kl. 12:15...

dvs. alle "1" i opgavens bitmap skal korrespondere med et
"0" i medarbejderens bitmap - men det er ligemeget om der er et "0" eller "1" i medarbejder-bitmappen, hvis der er et "0" i opgavens bitmap...

til sidst er der endnu en regl : hvis en medarbejder ikke møder i weekender og en på fredag først skal møde mandag morgen kl. 9:00 så vil kontrolblokken se således ud
  §§§0900-
hvor de to første §-tegn siger "næste dag"... (første er lørdag, næste er Søndag - og derefter kommer mandag med mødetidspunktet



der er 150p på spil for en javascript-metode, som kan give en array med de mulige tidspunkter, en opgave kan løses på...

Nogen der byder sig til ?

/Søren
Avatar billede roenving Novice
11. december 2003 - 15:52 #1
Sådan ?-)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Match tids-database</title>
<meta name="Generator" content="Stone's WebWriter 4">
<meta name="keywords" content="roenving,http://www.eksperten.dk/spm/438641">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="javascript" type="text/javascript">
var medarb = new Array();
medarb[0] = "Søren";
medarb[1] = "Peter";

var data = new Array();
data[0] = "00001111§1030-0000110010";
data[1] = "00001111§§§0900-0000110010";

function initSelect(){
    sel = document.getElementById('minSelect');
    for(i=0;medarb.length>i;i++){
        newOpt = document.createElement('OPTION');
        sel.appendChild(newOpt);
        newOpt.value = i;
        newOpt.text = medarb[i];
    }
}
function parseData(medarb){
    var idag = new Date();
    idag.setSeconds(0);
    var min = idag.getMinutes();
    min = (Math.floor(min/15)+1)*15;
    if(min==60){
        idag.setMinutes(0);
        var tim = idag.getHours()+1;
        if(tim==24){
            idag.setDate(idag.getDate()+1);
            idag.setHours(0);
        }else{
            idag.setHours(tim);
        }
    }else{
        idag.setMinutes(min)
    }
    var tid = new Array();
    var st = data[medarb].split("");
    for(i=0;st.length>i;i++){
        if(st[i]=='§'){
            idag.setDate(idag.getDate()+1);
            if(st[i+1].match(/\d/)){
                idag.setHours(+(st[i+1]+st[i+2]));
                idag.setMinutes(+(st[i+3]+st[i+4]));
                i+=5;
            }
        }else{
            var a = tid.length;
            tid[a] = new Array();
            tid[a][0] = new Date(idag.getTime());
            idag.setTime(idag.getTime()+900000);
            tid[a][1] = st[i];
        }
    }
    return tid;
}

function findTid(medarb,str){
    if(medarb=="")return "Fejl i valg af medarbejder";
    if(str==""||!str.match(/[01]+/))return "Ukorrekt angivet arbejdstidsdefinition"+"\n#"+str+"#";
    var tidFri, tid = parseData(+medarb);
//    alert(tid);
    var friTid = new Array();
//    alert(tid.length+"\n"+str.length)
    for(i=0;tid.length>=i+str.length;i++){
        tidFri = true;
        for(j=0;str.length>j;j++){
//            alert(i+"\n"+j+"\n"+tid[i+j]);
            tidFri = tidFri&&(tid[i+j][1]=='0'||str[j]=='0')
        }
        if(tidFri)friTid[friTid.length] = tid[i];
    }
    return friTid;
}

</script>
</head>
<body onload="initSelect()">
<br>
<form id="minForm" name="minForm">
<br>
Vælg medarbejder: <select name="minSelect" id="minSelect" onchange="">
    <option value="">-- Vælg her --<br>
</select>
<br>
<br>
Skriv opgavetidsstreng: <input id="minInput" name="minInput" type="text" value="Tidsstreng, f.eks. 111" onchange="alert(findTid(this.form.minSelect.value,this.value));" onfocus="if(this.value==this.defaultValue)this.value='';" onblur="if(this.value=='')this.value=this.defaultValue;" size="20">
<br>
</form>
</body>
</html>
Avatar billede bearhugx Nybegynder
12. december 2003 - 13:14 #2
hej Roenving...

Har først fået mulighed for at teste din kode idag--- og det ser ud til at den laver fejl, forstået på den måde, at hvis man har en opgave, som er "111" og et medarbejderbitmap som er "1100§0800-0011", så finder den alligevel mulighed for at lave opgaven (30 og 45 min efter start) - også selvom opgaven så går ind på næste dag....

Det er sikkert mig, som ikke har forklaret udtrykkeligt at opgaver ikke må deles over dage - de skal færdiggøres samme dag, som de påbegyndes...

Jeg har i mellemtiden selv udarbejdet en løsning, som takler problemet på en lidt anden måde end du (så vidt jeg kan se - for der er ting i din kode, som jeg ikke helt kan læse mig ud af - f.eks. parseData(+medarb); - hvad er +medarb ???

Under alle omstændigheder - så vil jeg gerne (selvom jeg også selv har udarbejdet en løsning) også give nogle points til dig for dit forslag... Så gider du ikke at lægge et svar ?

min kode er  :
<html>
    <head>
        <script>
            var start = "2003-12-12 09:00";
            var emplBitmap = "110011001111000000§§§1330-111111111111§0800-0000000";
            var behBitmap = "110011";

            function invertBitmap( bitmap ) {
                bitmap = bitmap.replace(/0/g, "t");
                bitmap = bitmap.replace(/1/g, "0");
                bitmap = bitmap.replace(/t/g, "1");
                return bitmap;
            }
            function createRegExpMask( bitmap ) {
                bitmap = invertBitmap( bitmap );
                return new RegExp( bitmap.replace(/1/g, "."), "g" );
            }
            function findMatches( find, inWhat ) {
                var pattern = createRegExpMask(find);
                var result = new Array();
                var offset = 0;
                var index = 0;
                if(inWhat.search(pattern) == -1)
                    return null;
                while( inWhat.search(pattern) != -1 ) {
                    index = parseInt( inWhat.search(pattern) );
                    result[result.length] = index+offset;
                    inWhat = inWhat.substr(index+1);
                    offset += index+1;
                }
                return result;
            }

            function parseDateTime( val ){
                _date  = val.split(" ")[0].split("-");
                _time  = val.split(" ")[1].split(":");
                _year  = _date[0];
                _month = _date[1];
                _day  = _date[2];
                _hour  = _time[0];
                _min  = _time[1];
                return new Date(_year, _month-1, _day, _hour, _min, 00);
            }
            function setTime( dateobj, time) {
                dateobj.setHours( time.substr(0,2) );
                dateobj.setMinutes( time.substr(2,2) );
                return dateobj;
            }

            function findAvailableTimesForTaskForEmployee(start, emplBM, behBM) {
                var result = new Array();
                var date =  parseDateTime(start)
                var days = emplBM.split("§");
                for(var i=0; i<days.length; ++i) {
                    var bitmap;
                    if(days[i].indexOf("-")>-1) {
                        var s = days[i].split("-");
                        time = s[0];
                        bitmap = s[1];
                        date = setTime( date, time );
                    } else {
                        bitmap = days[i];
                    }
                    if(bitmap.length>0) {
                        var matches = findMatches(behBM, bitmap);
                        if(matches != null ) {
                            for( var j=0; j<matches.length; ++j ) {
                                var matchDate = new Date( date.getTime() + (matches[j]*900000) );
                                alert(matchDate);
                                result[result.length] = matchDate;
                            }
                        }
                    }
                    date.setTime( date.getTime()+86400000 );
                }
                return result;
            }
            var avail = findAvailableTimesForTaskForEmployee(start, emplBitmap, behBitmap);
            alert( avail );
        </script>
    </head>
</html>


/Søren
Avatar billede roenving Novice
13. december 2003 - 03:38 #3
+medarb sikrer at det er en talværdi, som bliver overført ...

(+ som unary operator betyder: konvertér til (standard-)tal !-)

-- og ja, hvis en opgave ikke måtte splittes over dage, skulle jeg have haft det med som parameter ...

-- men ellers velbekomme '-)
Avatar billede bearhugx Nybegynder
13. december 2003 - 10:10 #4
lægger du så et svar - der er ca. 75 p ventende....
Avatar billede roenving Novice
13. december 2003 - 15:01 #5
;O)
Avatar billede roenving Novice
13. december 2003 - 23:09 #6
-- og tak for points ;~}
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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