Archief - Hoe kan dit !!!!

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Stimpy

Legacy Member
ik denk dat alle getallen een meervoud van 9 zijn !!!!!!!!!!!!!!

haaaa, dat hadden jullie niet gedacht hé!

wlibaers

Legacy Member
kondamin zei:
http://www.nationalemediasite.nl/harrie/thought-reading.js

en als je er nog steeds niet uit komt
daar in het scriptje kan je zien dat de verschillende katjes telkens op een andere plaats in de tabel worden gezet

de katjes in vakje 9 18 27 36 45 54 ... zijn altijd gelijk
maar als je het spel op nieuw speelt dan zal er een ander katje in vakje 9 18 27 36 45... staan.
zo als hier al eerder is geopperd de berekening die je moet doen zal altijd op een getal uit komen dat je geheel kan delen door 9.

het is een mooi idee en de doelgroep zal echt wel verwonderd blijven
nu zit ik wel met et probleem waar in het script staat er dat er telkens op een vvd van 9 de zelfde kat moet staan



Ah ja, de werking van het script. Op het eerste gezicht allesbehalve eenvoudig. Het heeft eerlijk gezegd even geduurd voor ik het gevonden had. (na een blik op de ECMA-262 Standaard, want eigenlijk programmeer ik nooit in JS)
Ik zal proberen zo volledig mogelijk de relevante delen te bekijken.

Begin van het script, twee belangrijke stukken:

Code:
var nRandomNumber = -1;
var nImgCount  = "0.";

Merk vooral op dat nImgCount een string is, geen getal!

Dan, in de loop in loadImages wordt het volgende 16 keer (nImages = 16) uitgevoerd:
Code:
nImgCount += 1;

Als nImgCount een getal was geweest zou het resultaat 16 zijn. Maar dit is geen som van getallen, maar het samenvoegen van strings in Javascript (want linker operand is een string). Wat er gebeurt is dat het getal 1 naar de string "1" geconverteerd wordt, en dan aan nImgCount vastgeplakt. Eindresultaat na 16 keer:
nImgCount = "0.1111111111111111";

Vervolgens, in shuffle:
Code:
nRandomNumber = getRandomNumber(0, nImages - 1);

nRandomNumber is het nummer van de speciale kat die gekozen wordt om op de veelvouden van 9 te staan. De functie getRandomNumber is ook nog interessant in die zin dat ze nooit hetzelfde resultaat als nRandomNumber zal geven. De eerste keer is dat geen probleem (nRandomNumber = -1), daarna zal die functie nooit meer die waarde geven (dus de speciale kat zal alleen op posities met veelvouden van 9 komen, en nergens anders). Dat wordt bepaald door dit deel van die functie:
Code:
   do {
     var nRnd = Math.floor(nRange * Math.random()) + nMin;
   } while(nRnd == nRandomNumber);
Je kan zien dat de loop herhaalt tot een nummer verschillend van nRandomNumber gevonden wordt.

Dan de loop waarin de katten geplaatst worden:
Code:
     for(var i = 0; i < nFields; i++) {
       var n = getRandomNumber(0, nImages - 1);
       if(i > 0) {
         n = ((i + 1) % (((i % i) + 1) / nImgCount)) ? getRandomNumber(0, nImages - 1) : nRandomNumber;
       }
       document.images[IMG_OFFSET + i + 1].src = imgArrImages[n].src;
     }

Ze beginnen te tellen vanaf 0 in plaats van 1, dus de speciale katten moeten geplaatst worden als i == 8, i == 17, i == 26,...
Ofwel, wat identiek hetzelfde is: (i+1) == 9, (i+1) == 18, (i+1) == 27,...

Nu, het beeld dat op een bepaalde positie terechtkomt wordt bepaald door de index in de lijst van beelden n, en deze wordt als volgt bepaald:
Code:
n = ((i + 1) % (((i % i) + 1) / nImgCount)) ? getRandomNumber(0, nImages - 1) : nRandomNumber;

Voor wie deze constructie niet kent, het werkt als volgt:
n = A ? B : C
betekent: indien A verschillend is van nul, dan n = B, als A gelijk is aan nul, dan n = C

A eens in detail bekijken:
((i + 1) % (((i % i) + 1) / nImgCount))

De modulus-operator %:
X % Y heeft de waarde van de rest van de deling X / Y (details zijn te vinden in de ECMA-262 Standaard).

dus (i % i) = 0, we vereenvoudigen dan:

((i + 1) % (1 / nImgCount))

Nu, nImgCount == "0.1111111111111111". Deze string wordt in dit geval (bij operator /) geconverteerd naar een getal, wordt dus 0.1111111111111111.
1 / 0.1111111111111111 == 9 (wel, niet exact, maar vermits met beperkte numerieke precisie gerekend wordt komt het exact uit).

Dus:

((i + 1) % 9)

We hebben hier dus een uitdrukking die nul is indien i+1 een veelvoud van 9 is. De volledige uitdrukkig is dan:
Code:
n = ((i + 1) % 9) ? getRandomNumber(0, nImages - 1) : nRandomNumber;

Als i+1 geen veelvoud van 9 is wordt de gekozen index getRandomNumber(0, nImages - 1), wat betekent dat het eender welk beeld kan zijn behalve dat overeenkomend met nRandomNumber. Als i+1 wel een veelvoud van 9 is wordt de speciale index nRandomNumber gekozen.

kondamin

Legacy Member
wlibaers dankje, zou er zelf nooit zonder hulp uitgekomen zijn.
morge nog eens bekijken met een frisser hoofd :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan