Volledige versie bekijken : MeerkeuzeVraagMogelijkheden
Tha Narie
%Europe/Berlin %643 %2005, 16:26
Deze code gaat niet zozeer om het resultaat, maar meer om de manier van werken. Wat grappige, soms smerige, manieren om dingen te bereiken.
Naar aanleiding van Deze topic (http://www.flashfocus.nl/forum/showthread.php?t=2152)
this.click = function()
{
nrOfQuestions = Number(nrs_nr.value); // aantal, bv 4
answers = txt_answers.text.split(","); // array van antwoorden, bv ["A", "B"];
totalNr = Math.pow(answers.length, nrOfQuestions); // geeft totaal aantal mogelijkheden
txt_trace.text = "Total : " + totalNr + "\n\n";
for(var i=0; i<totalNr; ++i)
{
var bin = i.toString(answers.length);
bin = new Array((nrOfQuestions+1) - bin.length).join("0").split("undefined").join("") + bin;
for(var a in answers)bin = bin.split( a).join(answers[a]);
txt_trace.text += bin + newline;
}
}
Zie hier werkend voorbeeld Tadaa! (http://www.thanarie.nl/FF/exp/questions.html)
Gebruik niet te grote getallen, want anders gaat hij hangen :)
Roenes
%Europe/Berlin %651 %2005, 16:38
Kblijf het een mooi script vinden. Helaas geen foutjes of zo kunnen ontdekken. Ben eigenlijk wel benieuwd of het nog "beter" of "viezer" kan :D
Dauntless
%Europe/Berlin %672 %2005, 17:07
Wauw... Ik snap er niets van :D (Ok, ik snap er wel wat van maar niet helemaal :p).
Woordje uitleg? :I
Roenes
%Europe/Berlin %675 %2005, 17:12
Ik moest er ook eerst een aantal keer naar kijken voordat ik em doorhad. Narie, geef jij die uitleg? Ik wil het eventueel ook wel doen, maar die komt dan wel later :)
Dauntless
%Europe/Berlin %686 %2005, 17:28
Bug?
-> 7,8,9,10
(2 vragen)
Tha Narie
%Europe/Berlin %716 %2005, 18:11
Ja, van de 10 maakt hij nieuwe 1 en 0, die hij dus opnieuw pakt voor de 7 en de 8.
Dus beter Letters voor pakken ;)
arshad
%Europe/Berlin %719 %2005, 18:15
Bug?
-> 7,8,9,10
(2 vragen)
hmm werkt ook niet bij
7,8,9,0
7,8,9,1
7,8,9,2
(ook 2 vragen)...
volgens mij wordt bij de resultaten de 4de getal op deze manier gekozen: answers[0] of answers[1] of answers[2]. Dus het getal wat het laatste is (zoals hier boven 0,1,2);
daarom werkt dit ook niet:
7,8,0
De 0 wordt gezien als: answers[0] = 7.
Ik hoop dat ik een beetje duidelijk ben gweest ;)
Tha Narie
%Europe/Berlin %750 %2005, 19:01
Ja dat zeg ik, geen getallen gebruiken maar letters. :)
Anders **** je het programma op ;)
Mediamonkey
%Europe/Berlin %768 %2005, 19:26
Oooh ThaNarie zei een vies woord!! Serieus, ik ben tégen censuur.
Ik snap dan wel dat we hier met veel jongeren zitten die misschien flamewars beginnen, maar aan de andere kant is dit wel weer een Nederlands forum, dus alles moet kunnen. Of kijken er moeders mee?
matzo
%Europe/Berlin %770 %2005, 19:29
mijn vader af en toe wel
Tha Narie
%Europe/Berlin %908 %2005, 22:48
nrOfQuestions = Number(nrs_nr.value); // aantal, bv 4
answers = txt_answers.text.split(","); // array van antwoorden, bv ["A", "B"];
totalNr = Math.pow(answers.length, nrOfQuestions); // geeft totaal aantal mogelijkheden
Eerste 2 regels spreken voor zich.
In de derde doe ik 'aantal antwoorden' tot de 'aantal vragen' macht. Daar komt het dus het totaal aantal mogelijkheden uit.
Waar ik vervolgens doorheen ga loopen:
for(var i=0; i<totalNr; ++i)
{
var bin = i.toString(answers.length);
In deze regel maak ik van het getal (i) een string, en geef ik een radix mee. De radix geeft aan welk getallenstelsel gebruikt moet worden. Decimaal kennen we allemaal wel, daar werkt iedereen standaard mee.
Daarnaast wordt binair vaak gebruikt voor PC's, en in de logica. En hexadecimaal kennen we van de kleuren 0xRRGGBB, en sommige van de HEX-editors om programma's mee te kraken.
Met 2 vragen en 2 antwoorden krijgen we dus (binair):
0
1
10
11
Als we 3 antwoorden hebben, (trinair waarschijnlijk) krijgen we:
0
1
2
10
11
12
20
21
22
En verder kunnen jullie het wel raden. Dit is dus eigenlijk al een lijstje met alle mogelijkheden, maar dan in getallen.
Zoals je ziet hebben we (of Flash dan) geen voorloopnullen, deze moeten we zelf aanmaken:
bin = new Array((nrOfQuestions+1) - bin.length).join("0").split("undefined").join("") + bin;
Wat ik hier doe is eigenlijk een vieze manier, wat eigenlijk ook in een for-loopje zou kunnen.Door een verandering in de array constructor sinds Flash MX 2004 krijgt deze regel 2 stappen extra.
Ik maak een lege array aan, en geef aan hoe lang deze moet zijn. Deze array join ik met nullen. Ik plak de (lege) waardes van de array aan elkaar, en de seperator die ik mee geef, wordt er tussen gestopt. Met een array van 5 waardes, krijg ik dus 4 nullen.
Voorheen waren de waardes altijd leeg, maar sinds Flash MX 2004 (AS2) zijn de arrays gevuld met undefined. Dus moeten we die nog replacen met "" (split en join extra).
De lengte van de array moet dus zijn:
new Array(totaalAatalCijfers+1 - lengteVanHuidigeString)
for(var a in answers)bin = bin.split( a).join(answers[a]);
txt_trace.text += bin + newline;
}
}
Als laatste gaan we door alle antwoorden in de array heen.
i bevat dan de index als string ("0", "1", "2", enz), en answers[i] dus de echte waarde ("A", "B", enz).
Daar replace ik dus de 0 voor de A, de 1 voor de B, de 2 voor de C, enz.
Welk getallenstelsel ik kies, hangt dus af van het aantal antwoorden (die ik moet replacen).
En ik plak elke keer de nieuwe 'mogelijkheid' in het tekstveld.
Tot zover deze les over vies programmeren, creatief met code, en een beetje wiskundig inzicht ;)
Roenes
%Europe/Berlin %435 %2005, 11:27
Tot zover deze les over vies programmeren, creatief met code, en een beetje wiskundig inzicht ;):D
Duidelijke uitleg. Maar ik blijf me toch verbazen hoe je op dit soort creaties komt. Verzin je dat zelf? Heb je ooit eens gezien? puur geluk? Maar hoe dan ook, weer een mooi en leuk stukje code :)
Tha Narie
%Europe/Berlin %625 %2005, 16:01
Zelf verzonnen denk ik wel ja :)
Dauntless
%Europe/Berlin %629 %2005, 16:07
De kans dat iemand anders daar op komt is idd zéééér miniem ;) :p
Een nu snap ik je code! Ik snapte de toString(); (met radix) niet.
Roenes
%Europe/Berlin %701 %2005, 17:49
Zelf verzonnen denk ik wel ja :)Ik bedoelde meer: jij komt wel vaker met dit soort oplossingen. Hoe kom je erop zeg! Ik had dus echt nooit aan een array gedacht in dit geval :) Het was iig geen beschuldiging of zo (misschien kwam het zo over?)
Een nu snap ik je code! Ik snapte de toString(); (met radix) niet.Die radix vind ik wat waardeloos uitgelegd in de AS-ref. Narie's uitleg is velen malen duidelijker :)
Tha Narie
%Europe/Berlin %704 %2005, 17:54
Nee het kwam niet over als beschuldiging hoor :)
Alleen als je zo lang aan het scripten bent, weet je onderhand niet meer waar je je kennis vandaan hebt. ;)
[m]
%Europe/Berlin %716 %2005, 18:12
Slim gebruik van de getallenstelsel, petje af. :)
En nu alleen permutaties! (of heten die dingen nou combinaties?)
Veel succes ermee. ;)
rackdoll
%Europe/Berlin %419 %2005, 11:04
ja die tha narie is erg idd...
ik werk met die gozer....dan denk je dat je AS kan,
en dan kijk je bij hem en besef je ...
dat je niets kan...:D
TE erg
brossiekoppie
%Europe/Berlin %430 %2005, 11:20
']Slim gebruik van de getallenstelsel, petje af. :)
En nu alleen permutaties! (of heten die dingen nou combinaties?)
Veel succes ermee. ;)
Waarom geen variaties :D
Dit zijn volgens mij herhalingsvariaties want de volgorde speelt een rol maar de herhaling ligt niet vast. ;)
mknol
%Europe/Berlin %462 %2005, 12:05
ik voer 4 vragen en
0,1,2,3,4 als antwoorden
dan krijg ik een opsomming, maar een kleine bug, er zitten ook letters in (een a, na nr 009)
klopt dit?
Roenes
%Europe/Berlin %465 %2005, 12:10
Met dezelfde instellingen krijg ik er geen letters tussen hoor :)
Tha Narie
%Europe/Berlin %484 %2005, 12:37
Shit, leest er niemand meer.. Is wel 3 keer gezegd.
Geen getallen gebruiken als antwoorden, dan werkt het converten naar de antwoorden niet meer goed. Ik gooi er anders wel een restrict op.
mknol
%Europe/Berlin %651 %2005, 16:37
sorry, foutje, maar ik wou het even gebruiken om wat mogelijkheden te bekijken en toen kwam ik op deze bug, heb niet het hele topic gelezen.
kH_
%Europe/Berlin %809 %2005, 20:26
Leuk scrippie hoor. Ik heb zelf ook ff een versie gemaakt, die weliswaar wat langer is, maar misschien is deze iets makkelijker te begrijpen:
var antwoorden:Array = new Array("A", "B", "C", "D");
var vragen:Number = 3;
var mogelijkheden:Number = Math.pow(antwoorden.length, vragen);
for(var iteraties=0; iteraties<mogelijkheden; iteraties++)
{
var deler:Number = iteraties;
var rest:Number = 0;
var resultaat:String = "";
for(var i=0; i<vragen; i++)
{
rest = deler % antwoorden.length;
resultaat = antwoorden[rest] + resultaat;
deler = Math.floor(deler / antwoorden.length);
}
trace(resultaat);
}
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.