En el dibujo de arriba izquierda: debería formarse esto: ┌ es como una L reflejada verticalmente. pero como ven, está mal.
Ahí hay 7*7 dibujos (cuadros) compuestos de 8*8 cuadraditos cada uno.
El problema ocurre con esos números, no ocurre con números menores como 2 y 3 3 y 4 ... 6 y 7 como ven siempre pongo que CuadrosPorFila = CuadraditosPorFila-1
Creo que el problema está en cómo se genera la variable DibujoaMostrar, en esta función, que se usa al inicio y cada vez que cambian esos números:
trace("DibujoaMostrar calculado desde la L invertida: "+DibujoaMostrar);
}
Porque tengo una función que convierte DibujoaMostrar a binario y...
Si CuadroPorFila es 2 y CuadraditosPorFila es 3, la conversión dice: Convirtiendo a binario esto: 432 DibujoEnBinario: 110110000 y está bien, vean que tiene 4 0s al final. Los dibujos se muestran al revés a eso, o sea: 000 011 011 y 0 es negro, vean que se forma la ┌ son 3 0s y uno más que sigue en la siguiente fila. 4.
Si pongo 3 y 4: Convirtiendo a binario esto: 61152 DibujoEnBinario: 1110111011100000 5 0s, la cantidad de 0s aumentó 1.
Con 4 y 5: Convirtiendo a binario esto: 32472000 DibujoEnBinario: 1111011110111101111000000 6, de nuevo aumentó 1.
5 y 6: Convirtiendo a binario esto: 67628691328 DibujoEnBinario: 111110111110111110111110111110000000 7, de nuevo +1.
6 y 7: Convirtiendo a binario esto: 558517276622592 DibujoEnBinario: 1111110111111011111101111110111111011111100000000 8, de nuevo +1.
7 y 8: Convirtiendo a binario esto: 1.83744039008715e+19 DibujoEnBinario: 1111111011111110111111101111111011111110111111110000000000000000 Con esto ocurre el problema. Vean que en 1er lugar el número se muestra raro, y el binario en vez de tener 9 0s al final tiene 16. Creo haber confirmado que la función que convierte a binario no es el problema, falla porque se le da ese número raro.
¿Se puede corregir el error o es un número muy largo y por eso fallará sí o sí?
Explico por qué uso números grandes: Supongan que el programa calcula cuántos dibujos pueden formarse con las condiciones dadas. Siendo 8*8 cuadraditos, si mal no recuerdo el cálculo es 2^64, que en la calculadora dice que es: 18446744073709551616 ese número convertido a binario forma lo que sería el dibujo todo pintado, con uno 1 delante que sobra: 10000000000000000000000000000000000000000000000000000000000000000 se vería así si quitamos el 1: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 son 8*8 0s.
Supongan que esa cantidad la queremos dividir entre 7, para que cada cuadro muestre la misma cantidad de esos posibles dibujos a lo largo de cierto tiempo. El cuadro nro 1 mostrará los 1eros 1000 dibujos posibles, por decir algo, el 2ndo los siguientes, y así.
Básicamente por eso es que necesito los números grandes. A la cantidad de dibujos posible le voy restando la cantidad que va a mostrar cada cuadro, para saber qué dibujo se mostrará 1ero en cada cuadro. Eso no lo puse en el código aquí porque no creo que sea el problema.
¿Hay alguna otra cosa importante que deba decir sobre esto?
La conversión es:
Código
function ConvertiraBinario (numero){
// trace("Convirtiendo a binario esto: "+numero);
// Averiguar cómo es en binario:
DibujoEnBinario = "";
while(numero>0){
DibujoEnBinario = numero%2+DibujoEnBinario;
numero = Math.floor(numero/2);
}
// Agregar 0s a DibujoEnBinario si hacen falta:
while(DibujoEnBinario.length<Cuadraditos){
DibujoEnBinario = 0+DibujoEnBinario;
}
// trace("DibujoEnBinario: "+DibujoEnBinario);
}
« Última modificación: 8 Julio 2025, 10:59 am por Tachikomaia »
Según GPT, Flash falla en guardar números demasiado grandes. Asumo que el problema es ese.
A ver, tengo una cadena que representa a un binario.
Necesito convertirlo en decimal, pero si es un número falla, así que necesito que sea una cadena. ¿Cómo convierto una cadena que representa a un binario, en una cadena que representa a un decimal? Sin convertirlo todo junto a número porque sino falla.
Luego a la cadena obtenida, que representa a un decimal, necesito dividirla por otro número, nunca tan grande. Y que el resultado sea una cadena también, porque puede ser muy grande. ¿Cómo a una cadena que representa a un decimal, la puedo dividir por un número, de modo que el resultado sea representado por una cadena? Mismo comentario.
Con eso tenemos Decimal y ResultadoDeDivision.
Por último, a Decimal necesito restarle ResultadoDeDivision varias veces, en un loop. Esto parece lo más sencillo, como hacer una resta manualmente, viendo cuales son los últimos caracteres. ¿Cómo a una cadena que representa a un decimal, le puedo restar otra que representa a otro? Mismo comentario.
O quizá sería más fácil hacer las operaciones usando las cadenas binarias, creo que no necesito los decimales.
Le preguntaré a GPT si nadie responde.
« Última modificación: 12 Julio 2025, 13:05 pm por Tachikomaia »
Intento resumir y corregir algunos posibles errores que haya cometido en posts anteriores.
Se consigue el número binario que forma la L invertida, aunque es un string: "1111111011111110111111101111111011111110111111101111111000000000"
Se intenta convertir a decimal, pero como el número resultante es tan grande, Flash falla: 9.22337203685478e+18 Según GPT, el resultado debería ser 18374686492081295424 y el número raro que pone Flash es casi la mitad de eso. Falla.
Entonces, en principio necesito un método de convertir un string que representa un número binario, en un string que represente un decimal, pero sin que dicho método use variables tipo número que sean demasiado grandes, porque sino falla.
El método que usaba, para convertir DibujoEnBinario en DibujoaMostrar, es:
hola en javascript puedes usar el comando BigInt asi
Código
BigInt("0b"+ binarioGigante)
pero tiene limites no creas que todos los convierte si es demasiado grande no puede
saludos Flamer -----Edito----- lei mal el titulo es alreves, bueno toString(2) creo que no te sirve ya que para numeros muy grandes no puede en fin saludos
« Última modificación: 23 Julio 2025, 17:21 pm por Flamer »
En Flash 5 el número entero más grande con el que puedes trabajar es 9007199254740992 (2^53) en en algún momento operas superando ese valor se usarán aproximaciones que obviamente perderán precisión dependiendo cuan alejados estén al límite de 2^53.
Convertir no te sirve porque igual vas a llegar a superar ese valor al intentar realizar alguna operación. Las soluciones que tienes es buscar otra forma dependiendo de como funcione tu programa o lo que quieras lograr, o trabajar todo sin convertirlo completamente, por ejemplo si intentas convertir de binario_string a decimal se te complica porque debes hacer operaciones con números enormes al depender de operaciones que involucran cada caracter
En caso de convertir de binario_string a hexadecimal lo tienes muy sencillo porque tomas de 4 en 4 bits y los conviertes a hexadecimal concatenando todo y ya está, no es necesario trabajar con todos los caracteres ni operar con todos ellos a la vez PERO el problema viene cuando dices: luego debo dividir entre otro número, ahí se rompe todo porque lo tendrás que convertir a número, lo que podrías hacer es crear una función propia para hacer la división, ya sea trabajando todo en binario, o hexadecimal, o decimal (pidiéndole a ChatGPT una función rarísima que ni se entienda XD).
Pues si por ejemplo trabajas en binario_string puro y quieres dividir lo haces como se haría con papel y lápiz a mano (como en el colegio), si el trabajo lo va hacer ChatGPT pues mejor le pides que lo trabaje todo así sin hacer conversiones innecesarias, que cree una función que divida dos binario_string
Ahora bien, con respecto a las calculadoras, la de Windows obviamente no está preparada para esas locuras XD, aunque está el viejo Microsoft Mathematics que no tendría problemas pero es una aplicación más avanzadita, para hacer tus pruebas sin errores yo te recomendaría SpeedCrunch https://heldercorreia.bitbucket.io/speedcrunch/download.html si deseas puedes bajar la versión instalable o la portable, es muy amigable para los programadores porque es sencillísima, una forma de poner a prueba la calculadora es operando, esta calculadora puede trabajar con números de hasta 78 dígitos sin perder precisión, Excel por otro lado solo puede con 15 dígitos. Por ejemplo con SpeedCrunch:
Mira que puse el 0b delante, eso es para especificar que estás usando un binario tal cual es 0x para los hexadecimales. Con darle un Enter te devuelve en ese número en Decimal:
18374403900871474688
Servirá como referencia, ahora hago la siguiente operación:
Como resultado me muestra: 2268444905390666566675256832
Ahora el resultado de la operación anterior lo divido entre 123456789 para ver si obtengo el mismo número de la referencia:
2268444905390666566675256832 / 123456789
Devuelve: 18374403900871474688 que es exactamente igual a la muestra, es más lo puedo convertir a binario con:
bin(18374403900871474688)
dando: 0b1111111011111110111111101111111011111110111111101111111000000000 que es exactamente el binario original, es decir, no pierdes nada de precisión
Consigo en binario la cantidad de dibujos que se van a mostrar en pantalla. DIBUJOS.
Esa cantidad la necesito dividir entre el número de cuadros (o minipantallas), que está en decimal. CUADROS. Salvo que pudiera hallar alguna regla, que luego comento.
Así que debo convertir el binario en decimal, y luego hacer la división. DIBUJOS/CUADROS. Una alternativa, trabajar con binarios, lo veo complicado. Supongamos que convierto la cantidad de cuadros, a binario. Luego puedo hacer una división entre binarios, puedo preguntarle a GPT cómo. Pero luego a DIBUJOS tengo que irle restando eso, o sea, hacer restas en binario, y no sé realmente si voy a obtener los números que preciso. Pero sea como sea, las divisiones van a tener que ser con strings.
Lo de la regla es que los dibujos podrían empezar de cierta forma sin que haya mucho problema. Por ejemplo si hay 4 cuadros de 3*3 cuadraditos cada uno y ponemos que empiecen así: NNN NNN NBB NBN NBB NBB
NNN NNN NBB NBB NNB NBN Hay que ver si el cuadro inferior derecho queda todo negro (los dibujos van variando) después de que los otros cuadros mostraran todos los dibujos que deben. Si es así y se sigue cumpliendo cuando aumenta la cantidad de cuadros y cuadraditos, bueno, no sería la solución ideal, pero podría ser una solución. Como es difícil saberlo, prefiero hacer una división como se debe. Supongamos que se van a mostrar 512 dibujos. Son menos pero supongamos. Hacemos eso /4, entonces: 512 384 256 128 Me refiero a que un cuadro mostrará el dibujo 512, otro el nro 384, otro el 256, y así. Enseguida, cada uno mostrará el anterior, así: 511 383 255 127 Y así seguirán variando hasta que el inferior derecho llegue a 0 (todo negro), es decir, se muestran todos los dibujos posibles. Cada número al convertirse a binario se convierte en una representación del dibujo, 0 es negro, 1 blanco. Más o menos es eso, me puedo haber confundido en algo. Si los convierto a binario ¿para qué inician como decimales? No sé, me pareció más fácil, lo pensé así, para entender mejor qué estoy haciendo. No creo que sea el problema...
En fin, que yo sepa, para empezar, tengo un binario enorme que debo convertir a decimal pero que sea string. Espero no confundirme en esto.
GPT:
Citar
Para no perder precisión en Flash 5 necesitas hacer aritmética “grande” con strings (sin usar Number para el valor completo). La idea: recorre el binario de izquierda a derecha y mantén el acumulado en decimal como un arreglo de dígitos; en cada bit haces “decimal = decimal*2 + bit”. Multiplicar por 2 y sumar 1 se hacen dígito a dígito.
Aquí tienes una función ActionScript (Flash 5) que convierte un string binario a su string decimal sin pérdida:
```actionscript
Código
// Convierte un string binario (p.ej. "1101") a string decimal exacto (p.ej. "13")
// No usa Number para representar el valor completo, solo dígitos individuales.
function binToDecString(bin){
// Saltar ceros líderes
var i = 0;
var n = bin.length;
while(i < n && bin.charAt(i) == "0"){ i++; }
if(i >= n)return"0";
// digits almacena el número decimal en dígitos base 10, LSB primero (digits[0] es las unidades)
var digits = [0];
for(; i < n; i++){
var c = bin.charAt(i);
if(c != "0"&& c != "1"){
// Si hay caracteres no binarios, puedes elegir lanzar error o ignorar; aquí se ignoran.
continue;
}
// decimal *= 2
var carry = 0;
var j;
for(j = 0; j < digits.length; j++){
var x = digits[j]*2 + carry; // x siempre pequeño, seguro
Notas: - Complejidad aproximada O(bits × dígitos_decimales). Para binarios muy largos funciona bien en Flash 5 si no son cientos de miles de bits. - Si quieres validar estrictamente el input, en vez de “continue” cuando c != '0'/'1', lanza un error o retorna null.
Ahora tengo que intentar entender ese código... Ya había conseguido uno parecido y no pude. Le puedo ir preguntando a GPT lo que no entienda pero... si alguien pudiera hacer un código más comprensible y explicarlo con un ejemplo estaría bueno.
« Última modificación: 12 Agosto 2025, 23:33 pm por EdePC »
Como dije, el convertir no te sirve porque igual vas a operar números grandes que están fuera del alcance de Flash, sí puedes convertir para intentar entender al utilizar la conocida base 10. El detalle está en las operaciones, lo que le tienes que pedir a ChatGPT es que te de una función para Operar números como string, has mencionado que necesitas División y Resta.
Estas operaciones de División y Resta podrían ser los de toda la vida, de esas que haces con lápiz y papel, directamente puedes hacer esas operaciones en cualquier Base, en tu caso Binario me parece, por ejemplo (123456789 / 123):
Como puedes ver el número más grande que se toma será más o menos igual al divisor, si el divisor no es tan grande puedes operar sin problemas, pero si no es el caso tendrás que usar algoritmos más complejos como ese que te mandó ChatGPT, y entenderlos es complejo, primero tendrías que ver que algoritmo está utilizando, una descripción general de los pasos al menos, y dedicarle varias horas en entenderlo
Por el vistazo rápido que le di, me parece que está haciendo la inversa de conversión de Decimal a Binario usando el algoritmo de sucesivas divisiones entre 2, además está guardando cada dígito del resultante en un array teniendo cuidado de que si dicho dígito no supere el 9, si es así lo "lleva" para sumarlo al siguiente dígito.
Por ejemplo:
Convertir 13 a binario, se hacen divisiones sucesivas entre 2, al final se recolectan desde el último cociente y los residuos en ese orden para obtener el binario
13 / 2 1 6 / 2 0 3 / 2 1 1 => 1101
Para hacer lo inverso se aplica la fórmula de Dividendo = (Cociente * Divisor) + residuo, y se va haciendo lo mismo hasta utilizar todos los dígitos binarios y así obtener el primer Dividendo que será el número Decimal original
Ahora en un rato voy a hablar con él sobre el código que me dió porque no lo entendí. Luego actualizo.
Edit: Hablado hasta que me quedé sin puntos.
Resumen: qué significa Saltar ceros líderes
Citar
Ignorar los 0s que están al inicio del binario
explica esto while (i < n && bin.charAt(i) == "0") { i++; } if (i >= n) return "0";
no sé si el while ha terminado, etc. Lo veo así: while (i < n && bin.charAt(i) == "0") { i++; } if (i >= n) return "0"; y sigue ¿es así?
Citar
Sí
cambié los i por NroDeCaracteraMirar: (código) ¿tengo que cambiar los siguientes i o son independientes? Este: for (; i < n; i++) {
Citar
Representan lo mismo, debes cambiarlos también
la variable n es el largo del binario, siempre?
Citar
sí
var para qué es, qué diferencia hay entre definir una variable con var y sin var
Citar
En ActionScript (especialmente en Flash 5/ActionScript 1), var sirve para declarar variables con alcance local a la función o al clip donde se declaran. Si no usas var, la variable se crea de forma implícita en un ámbito más global, lo que puede provocar efectos secundarios.
Diferencias clave:
- Con var: - Crea una variable local al ámbito actual (normalmente la función). - Solo existe mientras se ejecuta esa función. - No “ensucia” el timeline/objeto global. - Mejor rendimiento y menos riesgos de colisiones de nombres.
- Sin var: - Crea o sobrescribe una propiedad en el objeto actual (this) o en el nivel global (_root en muchos casos). - Persiste después de terminar la función. - Puede pisar variables/propiedades existentes y causar bugs difíciles de rastrear. - En proyectos grandes, suele generar “fugas” de estado.
Buenas prácticas en Flash 5: - Declara siempre tus variables con var dentro de funciones. - Evita depender de variables implícitas globales. - Usa nombres claros (como hiciste con LargoDelBinario) y mantén la consistencia.
No sabía o me había olvidado, a veces creaba variables y luego las eliminaba, de esta forma se eliminan solas.
cómo este if no tiene el { ? if (NroDeCaracteraMirar >= LargoDelBinario) return "0"; normalmente se pone si (condición) { efecto
Citar
En muchos lenguajes (incluido ActionScript/javascript), si el if controla una sola sentencia, puedes omitir las llaves. Estas dos formas son equivalentes:
- Forma compacta en una sola línea: if (condicion) return "0";
- Forma “normal” con llaves: if (condicion) { return "0"; }
- Forma sin llaves pero en varias líneas (no recomendada por claridad): if (condicion) return "0";
Recomendación: - Usa llaves siempre, incluso para una única sentencia, por legibilidad y para evitar errores al agregar otra línea después. Por ejemplo, este cambio accidental introduce un bug si no hay llaves:
if (condicion) hacerAlgo(); hacerOtraCosa(); // se ejecutará siempre, no está dentro del if
Con llaves, eso no pasa.
¿es posible que NroDeCaracteraMirar quede mayor que LargoDelBinario? // Ignorar ceros al inicio del binario: var NroDeCaracteraMirar = 0; var LargoDelBinario = bin.length; // Para eso mira caracteres desde la izquierda hasta que no haya caracteres o hasta que no sea 0: while (NroDeCaracteraMirar < LargoDelBinario && bin.charAt(NroDeCaracteraMirar) == "0") { NroDeCaracteraMirar++; } if (NroDeCaracteraMirar >= LargoDelBinario) { return "0"; }
el incremento de NroDeCaracteraMirar ocurre sólo si es menor que LargoDelBinario, por lo que en cierto punto quedará igual y luego ya no aumentará, por lo tanto NroDeCaracteraMirar nunca será mayor que LargoDelBinario ¿correcto?
Citar
Sí.
Código más claro (aún falta aclararlo más):
Código
// Convierte un string binario (p.ej. "1101") a string decimal exacto (p.ej. "13")
// No usa Number para representar el valor completo, solo dígitos individuales.
function binToDecString(bin){
// Ignorar ceros al inicio del binario:
var NroDeCaracteraMirar = 0;
var LargoDelBinario = bin.length;
// Para eso mira caracteres desde la izquierda hasta que no haya caracteres o hasta que no sea 0:
EdePC te respondo otro día porque por hoy este tema me cansó/aburrió, pero a simple vista, sí, voy a tener que poner que el programa opere así, pero eso es un problema a resolver más adelante.
« Última modificación: Hoy a las 03:04 por Tachikomaia »