[JS]Elevator Saga The elevator programming game

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Vermakelijk spelleke :Y)

Modbreak:Dit topic is afgesplitst van De Devschuur Coffee Corner - Iteratie ➑, er kunnen dus wat minder gerelateerde posts missen die ik daar heb laten staan.

[ Voor 60% gewijzigd door Woy op 26-01-2015 09:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 09-06 12:37

Douweegbertje

Wat kinderachtig.. godverdomme

Nice :o
Zit alleen even hoe dat floor object nu in elkaar zit :+

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 04-06 11:57

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Tribits
  • Registratie: Augustus 2011
  • Laatst online: 15:23

Tribits

Onkruid vergaat niet

Wel jammer dat de 'next challenge' button het niet doet in IE, misschien maar beter als ze geen echte liften gaan programmeren. Oh well, misschien hadden ze gewoon niet verwacht dat een IE gebruiker voorbij de eerste challenge zou komen :P

Master of questionable victories and sheer glorious defeats


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Zit je nog op IE6 ofzo? :P

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
Ha, die is idd leuk! Morgen maar eens lekker mee prutsen.

Never explain with stupidity where malice is a better explanation


Acties:
  • 0 Henk 'm!

  • StM
  • Registratie: Februari 2005
  • Laatst online: 11-06 16:00

StM

Pas op, het is verslavend :p

Acties:
  • 0 Henk 'm!

  • Kobus Post
  • Registratie: September 2010
  • Laatst online: 21-04 14:29
Leuk spelletje, tweede challenge nu. 19 personen in 60 sec na wat prutsen

No trees were harmed in the creation of this message, but several thousand electrons were mildly inconvenienced.


Acties:
  • 0 Henk 'm!

  • GateKeaper
  • Registratie: April 2004
  • Laatst online: 10-06 20:30

GateKeaper

#1 Procastinator

Kobus Post schreef op zaterdag 24 januari 2015 @ 23:39:
Leuk spelletje, tweede challenge nu. 19 personen in 60 sec na wat prutsen
Dat had ik ook. Nog een keer op "Apply" drukken leverde mij met dezelfde code wel "succes" op. Nu dus nog wat herschrijven zodat ik zeker weet dat ik het verdien om door te gaan. :P

Acties:
  • 0 Henk 'm!

  • Tribits
  • Registratie: Augustus 2011
  • Laatst online: 15:23

Tribits

Onkruid vergaat niet

Ja inderdaad, maar dat mag toch geen probleem zijn? :P

Zie het nu, de verschillende pagina's verschillen alleen in segment identifier. Chrome is kennelijk zo bijdehand om de pagina te refreshen (omdat de identifier niet gevonden wordt?) en IE dus niet. Even geen idee wat het correcte gedrag is.

HTML:
1
<a class="emphasis-color" href="#challenge=2">Next challenge</a>

Master of questionable victories and sheer glorious defeats


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 18:12
GateKeaper schreef op zondag 25 januari 2015 @ 00:03:
[...]
Dat had ik ook. Nog een keer op "Apply" drukken leverde mij met dezelfde code wel "succes" op. Nu dus nog wat herschrijven zodat ik zeker weet dat ik het verdien om door te gaan. :P
Ik ben bij challenge 14 ofzo gekapt. 90 mensen vervoeren waarbij er geen een langer dan 15s mag wachten. Tot die tijd selecteerde ik telkens de lift die naar een bepaalde vloer moest gaan op basis van welke lift het dichtst bij de vloer zit waar wordt gedrukt, hoe vol de lift zit en hoe druk de lift is.
Geen zin meer om ook zooi te schrijven om bij te houden hoe lang elk van de poppetjes aan het wachten is en waar die aan het wachten en de urgentie daar op aan te passen. Want blijkbaar wordt de tijd in de lift ook nog meegenomen, ondanks dat je totaal niet kan weten waar die precies naar toe wil.

Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 19:58
Als iemand op het knopje drukt, hoe weet je dan op welke verdieping hij staat?

Wel een erg tof spel. Elke keer weer als ik in een lift sta dan ben ik manieren aan het bedenken waarop de lift efficiënter/intelligenter zou kunnen zijn. Nu kan ik het eindelijk eens zelf programmeren, met een mooie visualisatie :P

Nu nog eentje die hetzelfde doet voor stoplichten/kruispunten.

[ Voor 67% gewijzigd door Avalaxy op 25-01-2015 01:35 ]


Acties:
  • 0 Henk 'm!

  • Tribits
  • Registratie: Augustus 2011
  • Laatst online: 15:23

Tribits

Onkruid vergaat niet

Dezelfde functionaliteit programmeren in een PLC, da's pas een uitdaging :X . Ik weet eigenlijk niet hoe het tegenwoordig zit maar verkeerslichten werden in het verleden in ieder geval door een PLC bestuurd.

[ Voor 5% gewijzigd door Tribits op 25-01-2015 01:52 ]

Master of questionable victories and sheer glorious defeats


Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 28-02 01:01
Lift is gewoon een microcontroller tegenwoordig. En het alghoritme is best eenvoudig.

Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 09-06 12:37

Douweegbertje

Wat kinderachtig.. godverdomme

Avalaxy schreef op zondag 25 januari 2015 @ 01:33:
Als iemand op het knopje drukt, hoe weet je dan op welke verdieping hij staat?

Wel een erg tof spel. Elke keer weer als ik in een lift sta dan ben ik manieren aan het bedenken waarop de lift efficiënter/intelligenter zou kunnen zijn. Nu kan ik het eindelijk eens zelf programmeren, met een mooie visualisatie :P

Nu nog eentje die hetzelfde doet voor stoplichten/kruispunten.
Gewoon de floors itereren en daar de specifieke on button click events aan hangen.

Hoewel ik dit wel een leuk spel vind, is het gewoon een beetje ruk dat je elke keer maar een beetje data extra krijgt. Ik heb geen zin om pas later rekening te gaan moeten houden met opeens 4 extra variabelen.

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 28-02 01:01
Douweegbertje schreef op zondag 25 januari 2015 @ 02:38:
[...]


Gewoon de floors itereren en daar de specifieke on button click events aan hangen.

Hoewel ik dit wel een leuk spel vind, is het gewoon een beetje ruk dat je elke keer maar een beetje data extra krijgt. Ik heb geen zin om pas later rekening te gaan moeten houden met opeens 4 extra variabelen.
Begin je toch hier: http://play.elevatorsaga.com/#challenge=10

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 18:12
Avalaxy schreef op zondag 25 januari 2015 @ 01:33:
Als iemand op het knopje drukt, hoe weet je dan op welke verdieping hij staat?[...]
Je krijgt het floor object mee als this in de functie. dus met this.floorNumber oid krijg je het nummer.
Dan kan je dus ook bijhouden dat er iemand heeft gedrukt en hoe lang die al heeft staat drukken, maar het wordt wat vervelender zodra je ze oppikt. Is wel te doen, maar was makkelijker geweest als je naast elevators en floors ook een collectie passengers had gehad oid. Nu moet je dat zelf gaan opbouwen en de overgang van wachten op vloer en waar die naartoe wil bijhouden incl. tijd en daar dan voorrang aan geven.
Overigens is het dan nog steeds een beetje geluk hebben, want als de verdeling van passagiers over de floors een beetje ruk is dan haal je die max waiting time limieten nooit.

Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 19:58
Caelorum schreef op zondag 25 januari 2015 @ 11:11:
[...]

Je krijgt het floor object mee als this in de functie. dus met this.floorNumber oid krijg je het nummer.
Heb je daar een voorbeeldje van? Het werkt bij mij niet.

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 18:12
Avalaxy schreef op zondag 25 januari 2015 @ 17:05:
[...]


Heb je daar een voorbeeldje van? Het werkt bij mij niet.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
    init: function(elevators, floors) {
        for(var i = 0; i<elevators.length; i++){
            elevators[i].on("floor_button_pressed", function(floorNum) {
                this.goToFloor(floorNum, true);                      
            });
        }
        
        for(var i = 0; i < floors.length; i++){
            floors[i].on("up_button_pressed", function(){
                //bepaal hier de minst drukke of de lift met minste urgentie ipv elevators[0]
                elevators[0].goToFloor(this.floorNum());
            });
            floors[i].on("down_button_pressed", function(){
                //bepaal hier de minst drukke of de lift met minste urgentie ipv elevators[0]
                elevators[0].goToFloor(this.floorNum());
            });
        }
    },
    update: function(dt, elevators, floors) {
        // We normally don't need to do anything here
    }
}

zoiets?

Acties:
  • 0 Henk 'm!

  • GateKeaper
  • Registratie: April 2004
  • Laatst online: 10-06 20:30

GateKeaper

#1 Procastinator

Caelorum schreef op zondag 25 januari 2015 @ 17:18:
[...]

JavaScript:
1
2
3
4
5
6
7
8
{
    init: function(elevators, floors) {
        for(var i = 0; i<elevators.length; i++){
            elevators[i].on("floor_button_pressed", function(floorNum) {
                this.goToFloor(floorNum, true);                      
            });
        }...
}

zoiets?
tip, lodash is ook beschikbaar:

JavaScript:
1
2
3
4
5
6
7
8
9
// vrij vertaald:
{
  init: function(elevators, floors) {
    _.each(elevators, function(elevator) {
      elevator.on('floor_button_pressed', function(level) {
         this.goToFloor(level, true);
     });
 }
}

Acties:
  • 0 Henk 'm!

  • F.West98
  • Registratie: Juni 2009
  • Laatst online: 01-06 03:30

F.West98

Alweer 16 jaar hier

GateKeaper schreef op zondag 25 januari 2015 @ 21:11:
[...]


tip, lodash is ook beschikbaar:

JavaScript:
1
2
3
4
5
6
7
8
9
// vrij vertaald:
{
  init: function(elevators, floors) {
    _.each(elevators, function(elevator) {
      elevator.on('floor_button_pressed', function(level) {
         this.goToFloor(level, true);
     });
 }
}
Dat is toch underscore.js? :X

2x Dell UP2716D | R9 7950X | 128GB RAM | 980 Pro 2TB x2 | RTX2070 Super
.oisyn: Windows is net zo slecht in commandline als Linux in GUI


Acties:
  • 0 Henk 'm!

  • Soundless
  • Registratie: November 2008
  • Laatst online: 07-04 13:06
Ff simpele stuk code gebruikt om iets te testen:
code:
1
2
3
4
            elevator.goToFloor(0);
            elevator.goToFloor(1);
            elevator.goToFloor(2);
            elevator.goToFloor(1);


Nou blijkt dus dat als je de timer hoger zet, dat je dan ook een betere score krijgt. Met de timer op 2x ben ik met bovenstaande code klaar in 58s. Als ik de timer op 21x zet duurt dit maar 55s.

Handige bug voor als je het NET niet haalt :P

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Soundless schreef op maandag 26 januari 2015 @ 12:10:
Ff simpele stuk code gebruikt om iets te testen:
code:
1
2
3
4
            elevator.goToFloor(0);
            elevator.goToFloor(1);
            elevator.goToFloor(2);
            elevator.goToFloor(1);


Nou blijkt dus dat als je de timer hoger zet, dat je dan ook een betere score krijgt. Met de timer op 2x ben ik met bovenstaande code klaar in 58s. Als ik de timer op 21x zet duurt dit maar 55s.

Handige bug voor als je het NET niet haalt :P
Is het ook niet gewoon gedeeltelijk random waar de personen komen? Dan scheelt het per run dus of je het wel of niet haalt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Soundless
  • Registratie: November 2008
  • Laatst online: 07-04 13:06
Woy schreef op maandag 26 januari 2015 @ 14:23:
[...]

Is het ook niet gewoon gedeeltelijk random waar de personen komen? Dan scheelt het per run dus of je het wel of niet haalt.
Misschien wel, maar in al de runs die ik ehb gedraait is dit ongeveer de uitkomst. Ik denk toch dat er ergens een afrondingsbugje ofzo in zit waardoor dit gebeurt. Kan ook puur toeval zijn, maar dan is het ECHT toevallig want heb het nu wel een aantal keer getest.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 19:33

Matis

Rubber Rocket

Ik ben er ook aan begonnen, maar ik krijg het helaas niet voor elkaar om binnen de stramien van de opdracht eigen helper-functies aan te maken.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
    addFloorToQueue: function(elevator, floorNum, override) {
        
    },
    init: function(elevators, floors) {
        var elevator = elevators[0]; // Let's use the first elevator
        var rotator = 0;
        elevator.on("floor_button_pressed", function(floorNum) {
            // Floor button pressed
            addFloorToQueue(elevator, floorNum);
        });
        _.each(floors, function(floor) {
            floor.on("up_button_pressed down_button_pressed", function() {
                addFloorToQueue(elevator, floor.level, true);
            }); 
        });
        elevator.on("passing_floor", function(floorNum, direction) { 
            var destQueue = elevator.destinationQueue;
            
        });
        elevator.on("idle", function() {
            // The elevator is idle
            addFloorToQueue(elevator, 0);
        });

    },
    update: function(dt, elevators, floors) {
        // We normally don't need to do anything here
    },
}

Resulteert in:
There is a problem with your code: ReferenceError: addFloorToQueue is not defined
at Object.eval (eval at (http://play.elevatorsaga.com/app.js:68:35), :23:13)
at Object.el.trigger (http://play.elevatorsaga.com/libs/riot.js:45:12)
at Object.elevatorInterface.checkDestinationQueue (http://play.elevatorsaga.com/interfaces.js:15:35)
at http://play.elevatorsaga.com/world.js:162:64
at Function.St (http://play.elevatorsaga.com/libs/lodash.min.js:23:147)
at Object.world.init (http://play.elevatorsaga.com/world.js:162:15)
at updater (http://play.elevatorsaga.com/world.js:188:31)


Ook heb ik de function addFloorToQueue(elevator, floorNum, override) notitie gebruikt, maar helaas geen soelaas.

Hoe definiëren jullie herbruikbare code?

Edit;

Ah, even spieken in de oplossingen geeft de volgende mogelijkheid:

JavaScript:
1
2
3
        var addFloorToQueue = function(elevator, floorNum, override) {
        
        };

[ Voor 8% gewijzigd door Matis op 26-01-2015 14:59 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:43

.oisyn

Moderator Devschuur®

Demotivational Speaker

You suck at javascript :+

In een lambda heb je alleen toegang tot stack variabelen binnen de ancestor scopes. In je code is addFloorToQueue een member van het object dat je definieert, geen variabele op de stack. Als je 'm vanuit init aan wilt roepen zul je this.addFloorToQueue() moeten doen. Echter, je this wijst naar een ander object binnen de event handlers (namelijk het elevator of floor object waar de handler op zit). De truc is om van this even een lokale var te maken, zodat je bij je originele object kan.

Je kan 'm inderdaad ook gewoon als variabele definieren, maar dan heb je er eventueel geen toegang meer toe in je update()

[ Voor 13% gewijzigd door .oisyn op 26-01-2015 15:09 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 19:33

Matis

Rubber Rocket

Klopt, dat zal ik ook niet ontkennen.
In een lambda heb je alleen toegang tot stack variabelen binnen de ancestor scopes. In je code is addFloorToQueue een member van het object dat je definieert, geen variabele op de stack. Als je 'm vanuit init aan wilt roepen zul je this.addFloorToQueue() moeten doen. Echter, je this wijst naar een ander object binnen de event handlers (namelijk het elevator of floor object waar de handler op zit). De truc is om van this even een lokale var te maken, zodat je bij je originele object kan.
Klopt, daar liep ik dus ook al tegenaan. Echter was het nog niet in me opgekomen om this te misbruiken.
Je kan 'm inderdaad ook gewoon als variabele definieren, maar dan heb je er eventueel geen toegang meer toe in je update()
Dat is een oplossing waar ik nu mee kan leven.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Om je algoritme te testen kan je challenge 17 gebruiken. Dit is een oneindige demo, waarbij je de tijd hebt om te kijken hoe je algoritme reageert.

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 19:33

Matis

Rubber Rocket

Vannacht is versie 1.3.0 "uitgebracht".

Hierin is de API uitgebreid. Het Elevator Object heeft er de functie getPressedFloors() bijgekregen. Waarmee je alle ingedrukte verdiepingen kunt uitlezen per lift.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 18:12
Oh, nice. Dat maakt het een stuk eenvoudiger. Gewoon even sorteren op aflopend of oplopend en dan verder gaan ^^ Hoef je het zelf ook niet bij te houden.

Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Ik heb even snel iets in elkaar geknutseld wat alle opdrachten in een paar keer haalt. Op zich niets geavanceerds....ik sorteer per lift de queue waarbij ik rekening houd met de richting en de huidige positie (dus als de lift vanaf de 1e omhoog gaat en je moet naar verdieping 3,2 en 0, dan stop ik eerst op 2, dan op 3, dan terug naar 0). Ik kies verder altijd de leegste lift als er een nieuw poppetje komt. Bij challenge 17 kom ik zo (na 1000 personen) op een gemiddelde wachttijd van 7.2 seconden. Ben benieuwd hoe ver jullie gekomen zijn....

When life gives you lemons, start a battery factory

Pagina: 1