Para hacer funcionar el código, cree un nuevo documento de Flash ActionScript 3 y meta tres textfields con nombre de instancia status_txt
, link_txt
, y weasel_txt
. Puede cambiar el texto objetivo (variable target
) por cualquier otro que tenga letras de la A a la Z (mayúsculas), espacio, punto y signo de exclamación. Si quiere más letras tiene que modificar la funcion randomLetter()
.
El máximo número de generaciones que me ha generado para este texto es de 1452.
El código (AS3):
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
var target:String = "O TRUE APOTHECARY! THY DRUGS ARE QUICK. THUS WITH A KISS I DIE."; var current:String = ""; var numSiblings:Number = 100; var variation:Number = 5; var stepsNeeded:Number = 0; var generation:Array = []; var timer:Timer = new Timer(10); function newGeneration():Array { var i:Number; var thisGeneration:Array = []; for (i=0;i < numSiblings;++i) { thisGeneration.push(createSibling(current)); } return thisGeneration; } function newParent():String { var i:Number, r:String = ""; for (i=0;i < target.length;++i) { r += randomLetter(); } return r; } function createSibling(dad:String):String { var i:Number; var sibling:String = ""; for (i=0;i < dad.length;++i) { if (Math.random()*100<variation) { sibling += randomLetter(); } else { sibling += dad.charAt(i); } } return sibling; } function randomLetter():String { var r:String; var n:Number = Math.floor(Math.random()*28)+62; if (n==62) { r = " "; } else if (n==63) { r = "."; } else if (n==64) { r = "!"; } else { r = String.fromCharCode(n); } return r; } function qualifyGeneration():Number { var i:Number, j:Number; var qualification:Array = []; var tempQ:Number = 0; for (i=0;i < generation.length;++i) { tempQ = 0; for (j=0;j<generation[i].length;++j) { if (generation[i].charAt(j)==target.charAt(j)) { tempQ += 1; } } qualification.push(tempQ); } var maxQIndex = 0; var maxQ = 0; for (i=0;i < qualification.length;++i) { if (qualification[i]>maxQ) { maxQ = qualification[i]; maxQIndex = i; } } return maxQIndex; } function parseGeneration(event:TimerEvent) { status_txt.htmlText = "GENERACIONES: " + stepsNeeded; generation = newGeneration(); current = generation[qualifyGeneration()]; weasel_txt.text = current; if (current == target) { timer.stop(); status_txt.htmlText = "COMPLETADO LUEGO DE " + stepsNeeded + " GENERACIONES"; link_txt.htmlText = "<a href=\"event:restart\">OTRA VEZ</a>"; } else { stepsNeeded++; } } function doClick (e:TextEvent) { if (e.text=="stop") { link_txt.htmlText = "<a href=\"event:continue\">CONTINUAR</a>"; timer.stop(); } else if (e.text=="continue") { link_txt.htmlText = "<a href=\"event:stop\">DETENER</a>"; timer.start(); } else if (e.text=="restart") { init(); } } function init () { stepsNeeded = 0; current = newParent(); timer.start(); var style:StyleSheet = new StyleSheet(); var link:Object = new Object(); link.textDecoration = "underline"; style.setStyle("a:hover", link); link_txt.styleSheet = style; link_txt.htmlText = "<a href=\"event:stop\">DETENER</a>"; } link_txt.addEventListener(TextEvent.LINK, doClick); timer.addEventListener("timer",parseGeneration); init(); |