|
51
|
Programación / Programación General / Re: ¿Qué método es recomendado para ordenar al azar un array?
|
en: 7 Enero 2025, 15:02 pm
|
El FOR ya deberías de dominarlo porque te lo expliqué varias veces y convertirlo a WHILE es inmediato, son completamente equivalentes para estas cosas sencillas donde hay inicialización de variable, condición y actualización de variable. Quizá renombrando variables y adaptándolo más las instrucciones de ActionScript que sueles utilizar se te haga más legible: colores = ["Azul", "Rojo", "Verde", "Blanco", "Negro"] posicion1aReubicarse = colores.length - 1 while (posicion1aReubicarse > 0) { posicion2aReubicarse = random(posicion1aReubicarse) saveDeElemento1 = colores[posicion1aReubicarse] colores[posicion1aReubicarse] = colores[posicion2aReubicarse] colores[posicion2aReubicarse ] = SaveDeElemento1 posicion1aReubicarse-- } trace(Colores)
Resumen: Se toma el último elemento (el de la derecha), luego aleatoriamente se elige otro elemento (alguno situado a la izquierda del elemento elegido anteriormente), entonces se intercambian ambos elementos. Se continúa haciendo lo mismo con el penúltimo elemento, luego con el antepenúltimo y así sucesivamente. 1. Crea el Array de elementos a desordenar 3. Se inicializa posicion1aReubicarse al número de elementos del Array -1, para obtener el último índice válido para el Array, este indicará el primer elemento a reubicar 4. El WHILE, la condición para continuar es que posicion1aReubicarse sea mayor que 0 porque si fuera 0 ya no habría con quien hacer el intercambio 5. Generamos un número aleatorio entre 0 y el índice actual (no incluye a este último) para determinar el índice del segundo elemento a reubicar, para la primera iteración puede ser: 0, 1, 2, o 3 6. Guardamos el primer elemento a reubicar para no perderlo 7 y 8. Hacemos el intercambio, ponemos el segundo elemento a reubicar en lugar del primero, luego ponemos el primer elemento a reubicar (que se ha guardado porque lo perdimos en la línea 7) en lugar del segundo 9. Decrementamos posicion1aReubicarse para ir a por el penúltimo elemento, luego por el antepenúltimo y así sucesivamente La razón de avanzar de atrás hacia adelante (del último al primero) es para simplificar la generación del número aleatorio y que sea más legible, pero el funcionamiento es completamente igual. Si avanzaras desde el primero al último tendría que ser: colores = ["Azul", "Rojo", "Verde", "Blanco", "Negro"] posicion1aReubicarse = 0 while (posicion1aReubicarse < colores.length - 1) { posicion2aReubicarse = random( colores.length - (posicion1aReubicarse + 1) ) + posicion1aReubicarse + 1 saveDeElemento1 = colores[posicion1aReubicarse] colores[posicion1aReubicarse] = colores[posicion2aReubicarse] colores[posicion2aReubicarse ] = SaveDeElemento1 posicion1aReubicarse++ } trace(Colores)
|
|
|
52
|
Programación / Python / Re: Buscador de combinaciones inexistentes no funciona.
|
en: 5 Enero 2025, 17:55 pm
|
Eso es porque no entiendes el código que te manda ChatGPT, y eso agravado en que Python puede llegar a sonar a chino por sus "instrucciones complejamente simplificadas" porque difieren mucho a los de lenguajes de programación más clásicos, debes tener el manual de python a la mano y tratar de entender que hace cada cosa o decirle a ChatGPT que te lo explique, olvida cualquier otro lenguaje de programación clásico como ActionScript o solo formarás contradicciones en tu cabeza. También le puedes decir a ChatGPT que use un lenguaje más clásico y estándar en python para que sea más legible. De todas maneras el script a mi si me funciona, tengo la versión 3.8.10 de Python e incluso un doble click me sirve:  Lo mejor siempre es abrir una línea de comandos y ejecutar el script ahí, en mi caso presiono Shift + Click derecho en un espacio vacío y me aparece en el menú contextual la opción de: Abrir ventana de comandos aquí, luego arrastro el script ahí o tipeo el nombre, al final un Enter para ejecutarlo
|
|
|
53
|
Sistemas Operativos / Windows / Re: problemas con nuevo ordenador con win 11
|
en: 4 Enero 2025, 14:13 pm
|
Una vez le di a un técnico una PC que tenía contraseña al iniciar Windows, habiéndome olvidado de decirle, y cuando me la dió o hablamos el tipo me dijo que tenía contraseña, luego levantó la seja, pero llegué a la conclusión de que para él fue como una piedrita en el camino xD Aunque Songoku afirme que son unos pocos segundos y aunque casi siempre es así, puede llegar a complicarse, por ejemplo si Tachikomaia me trae su Celeron de 2GB de Ram y HDD antiguo, pues va a tardar mucho más en levantar el Sistema Live y eso si soporta arranque por USB, en el peor de los casos habrá que arrancar por CD y puede que ni CD ni Lectora de CD tenga XD En una PC moderna es mucho más rápido pero también hay que considerar el Cifrado, ya me ha tocado ver que aparte de contraseña tienen cifrado como BitLocker, muchos portátiles ya vienen con BitLocker activado por defecto, y pues ahí si pierdes la contraseña o la forma de recuperarla pierdes todo lo cifrado, intentar romper BitLocker es muy costoso, tengo entendido de que también está EFS para cifrar a nivel usuario aunque nunca lo vi en detalle
|
|
|
54
|
Programación / Python / Re: Buscador de combinaciones inexistentes no funciona.
|
en: 3 Enero 2025, 13:54 pm
|
El programa se cierra enseguida sin que yo pueda ver qué pasa. ¿Cual es la falla, cómo lo arreglo? O_o? Es un aplicación/script de consola o línea de comando (como john the ripper), usa una consola (CMD, Símbolo del Sistema, PowerShell, etc), también puedes poner una "pausa" antes de que se cierre pero si hay errores no los mostrará a no ser que lo ejecutes en una consola que es como debe de ser. Para poner la pausa puedes agregar un input al final o donde quieras la pausa: input("Presione Enter para continuar ...")
|
|
|
55
|
Foros Generales / Dudas Generales / Re: Convertir espacios seguidos en saltos de línea.
|
en: 3 Enero 2025, 00:24 am
|
Usa algún editor de texto plano potente como Notepad3, Notepad++ o SublimeText, todos ellos tienes opciones para hacer búsquedas, reemplazos avanzados. Notepad3 con expresiones regulares: [ +] => Reemplazar dos o más espacios [\n] => Por un salto de línea En Notepad++ y SublimeText es igual que en Notepad3 usando expresiones regulares En SublimeText puedes usar la multiedición con atajos de teclado que siempre es más rápido y cómodo para estas cosas tan sencillas:  1. Con doble click seleccionas palabras, yo seleccioné los espacios 2. Con Ctrl + F3 seleccionas todas las ocurrencias iguales a lo que hayas tenido seleccionado 3. Enter para reemplazar lo seleccionado con un Salto de Línea 4. Ctrl + A para seleccionar todo 5. Shift + Tab para quitar los espacios delante de las líneas
|
|
|
57
|
Informática / Hardware / Re: sirve una tarjeta pci express 3,0 x16 a una tarjeta madre pci express 2.0 x8?
|
en: 31 Diciembre 2024, 14:57 pm
|
PCI-E 2.0 x8? Es raro encontrar una placa así, estoy buscando sus características pero parece que es muy antigua y la tarjeta de video aparenta ser demasiado para esa pobre placa, ni en la web del fabricante encuentro su ficha técnica y eso no es buena señal. Estás seguro de que tiene una PCI-E 2.0 x8? revisaste su BIOS o tienes la ficha técnica o miraste el puerto PCI-E y viste que es x8? No soy experto pero dudo que la gráfica x16 funcione en una x8, la x8 tiene menos conectores Tarjeta de video x8, fíjate en la parte donde se conecta, solo tiene la mitad de conectores:   Siempre puedes revisar los Benchmarks para conocer un poco las opciones que otros usuarios han probado, por ejemplo: https://www.userbenchmark.com/System/ECS-H61H2-CM/9951
|
|
|
58
|
Programación / Programación General / Re: Evitar o corregir entrada de valores inaplicables.
|
en: 29 Diciembre 2024, 00:51 am
|
Supongo que una manera sencilla de hacer lo que pides es "limpiar" los caracteres, uno a uno los vas comprobando y solo dejas pasar los que admitas, el detalle es cuando vas a hacer esta limpieza, si lo desea lo puedes poner muy genérico y sencillo haciéndolo antes de tomar el valor del textbox, también lo puedes poner en el evento keyUp como el ejemplo que dejo a continuación: onClipEvent(keyUp) { if (Selection.getFocus() == "_level0.myClip.txt1") { txt = _level0.myClip.txt1 tmp = "" for (i = 0; i < txt.length; i++) { c = txt.charCodeAt(i) // 48 = 0, 57 = 9; 64 = A, 70 = F; 97 = a, 102 = F if ( (c >= 48 && c <= 57) || (c >= 65 && c <= 70) || (c >= 97 && c <= 102) ) { tmp += txt.charAt(i) } } _level0.myClip.txt1 = tmp.toUpperCase() } }
Selection.getFocus() devuelve la ruta completa del TextBox donde estoy escribiendo, de ahí puedes distinguir entre los textbox que tengas. Luego simplemente compruebo uno a uno los caracteres del textbox y creo un nuevo texto temporal donde únicamente dejo los caracteres de mi lista blanca: 0-9 A-F a-f y al final se la pongo al TextBox Otra cosa a considerar es por ejemplo el tamaño, debería ser 6, si no es así puedes rellenar con ceros aunque esto lo tendrías que validar al tomar el valor del textbox y ya no en el keyup
|
|
|
59
|
Informática / Software / Re: Programa para ordenar archivos, Windows 7 "cierra" el buscador al abrir la carpeta contenedora.
|
en: 28 Diciembre 2024, 13:42 pm
|
Quisiera algo más eficiente. Algo que abra la carpeta en otra ventana, de modo que pueda regresar a la búsqueda sin problema Si buscas eficiencia tienes a Everything https://www.voidtools.com/downloads/ con él puedes búsquedas avanzadas, y obviamente abrir la carpeta contenedora de un archivo o carpeta con click derecho > abrir carpeta contenedora, o presionar Ctrl + Enter para hacer lo mismo. Para hacer búsquedas en sistemas de archivos NTFS (típicos en Windows) es lo mejor que hay. Para el Explorador de Windows puedes probar: En caso de carpetas tienes dos opciones: - Click derecho > Abrir en nueva ventana - Ctrl + Enter En caso de archivos: - Click derecho, mantener presionado Ctrl y dar click en Abrir la ubicación del archivo
|
|
|
60
|
Programación / Programación General / Re: De una cadena, quitar la subcadena especificada, tantas veces como se repita.
|
en: 22 Diciembre 2024, 15:51 pm
|
En ambos casos no puedes usar split() porque este solo funciona con un caracter, debes crear tu propia función, por ejemplo para A lo tienes solucionado con: Cadena = "121213121" CaracteraQuitar = "121" trace(quitarOcurrencias(Cadena, CaracteraQuitar)) function quitarOcurrencias(cadena, quitar) { for (i = cadena.indexOf(quitar); i >= 0; i = cadena.indexOf(quitar)) { cadena = cadena.substring(0, i) + cadena.substring(i + quitar.length) } return cadena } // Devuelve: 213
- He utilizado un FOR porque las instrucciones son sencillas (un FOR es un "WHILE sencillo"), recuerda la estructura de un FOR: for (inicialización de variables; condición para continuar; actualización de variables) { código }- Su equivalente en WHILE sería: inicialización de variables while (condición para continuar) { código actualización de variables }- El objetivo del FOR sería ahorrarse una par de líneas sencillas, aunque pueden ser más pero ya complicarían más la legibilidad del FOR - Pero si lo quieres en WHILE completamente equivalente, porque he leído que no te gustan los FOR sería: Cadena = "121213121" CaracteraQuitar = "121" trace(quitarOcurrencias(Cadena, CaracteraQuitar)) function quitarOcurrencias(cadena, quitar) { i = cadena.indexOf(quitar) while (i >= 0) { cadena = cadena.substring(0, i) + cadena.substring(i + quitar.length) i = cadena.indexOf(quitar) } return cadena } // Devuelve: 213
- indexOf busca una subcadena en una cadena, si la encuentra devuelve el índice de donde empieza la subcadena, devuelve -1 si no encuentra nada, hace la búsqueda de izquierda a derecha y solo hace una vez, por eso lo pongo en un bucle En caso de B no puedes quitar mientras buscas, para ese caso debes marcar los caracteres a quitar y al final quitarlos Cadena = "121213121"; CaracteraQuitar = "121"; trace(quitarOcurrencias2(Cadena, CaracteraQuitar)) function quitarOcurrencias2(cadena, quitar) { i = 0 idx = cadena.indexOf(quitar, i) if (idx < 0) return cadena //Si no hay ocurrencias salgo de inmediato for (marcas = []; idx >= 0; i = idx + 1, idx = cadena.indexOf(quitar, i)) { for (j = 0; j < quitar.length; j++) { marcas[idx + j] = true } } nuevaCadena = "" for (i = 0; i < cadena.length; i++) { if (marcas[i] != true) { nuevaCadena += cadena.charAt(i) } } return nuevaCadena } // Devuelve: 3
Para este caso igualmente utilizo indexOf pero le doy un parámetro extra que es el índice de caracter donde debe empezar a buscar la subcadena en la cadena, tengo un array para guardar las marcas de acuerdo a la posición de los caracteres, marco con true los caracteres que coinciden. Al final reviso los caracteres marcados y solo conservo los que no tienen marca He usado FOR y como vez se complica un poquitín más y podría no ser muy legible XD, acá te dejo el equivalente con WHILE Cadena = "121213121"; CaracteraQuitar = "121"; trace(quitarOcurrencias2(Cadena, CaracteraQuitar)) function quitarOcurrencias2(cadena, quitar) { i = 0 idx = cadena.indexOf(quitar, i) if (idx < 0) return cadena //Si no hay ocurrencias salgo de inmediato marcas = [] while (idx >=0) { for (j = 0; j < quitar.length; j++) { marcas[idx + j] = true } i = idx + 1 idx = cadena.indexOf(quitar, i) } nuevaCadena = "" for (i = 0; i < cadena.length; i++) { if (marcas[i] != true) { nuevaCadena += cadena.charAt(i) } } return nuevaCadena } // Devuelve: 3
|
|
|
|
|
|
|