elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Mensajes
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 229
1  Programación / Programación General / Captar victoria en juego estilo 3 en línea. 2 contiguos solamente. en: 20 Enero 2025, 19:40 pm
La cantidad de casilleros por fila y columna es configurable.

La cantidad de contiguos para ganar, también.

Pero por ahora quiero resolver el caso de 2 contiguos simplemente.

La situación se guarda en un array, es decir lo que tiene cada casillero, por ejemplo esta:
vv0
vXv
vvv
Es: v, v, 0, v, X, v, v, v, v
donde v es vacío

Mi idea es que, cuando un casillero se marque, se mire arriba, luego arriba-derecha, y así sucesivamente como las agujas de un reloj.

El reto es averiguar qué casillero en el array es el de arriba, y demás. Y si es que existe, sino capaz que mira alguno que no debe, no sé.

Si por ejemplo el casillero marcado es el nro 0, el de arriba no existe, el de arriba-derecha tampoco, el de la derecha es su +1...
Pero si se marca el nro 2, el de su derecha no es el +1, sino que no existe.

Quizá la mejor forma de resolver esto es creando variables estilo:
Casillero0_0 = "v"
Casillero1_0 = "v"
Casillero2_0 = "0"

Pero entre más grande sea el tablero, más variables así habría y son una copia de las otras así que no parece buena idea.

Debe haber una forma de calcular en qué posición del array está el casillero contiguo que se quiere mirar ¿cómo?
2  Programación / Programación General / Indicar que una acción no debe usarse. en: 20 Enero 2025, 04:16 am
Intento hacer una IA que aprenda a poner una X en un tablero y luego otra en la derecha o izquierda.

El problema que intento resolver en cuanto a eso, es que puede poner una X donde ya hay, debo evitarlo.

Sé que debo poner algo como:
Código:
if (Situacion[Action] == "v") {
   // Es realizable, realizarla...
sino
   // No, ver si hay otra...
Pero no sé bien qué pasa, es como que si hago eso tendría que poner código igual en distintos lados (aunque a ese código lo convierta en una función, siento que es innecesario que se repita), innecesariamente.

Aún no tengo el código completo. Díganme cómo pondrían uds ese if, dónde, o cómo harían.

Código
  1. // 2 en línea horizontal, en tablero de 2x2, sólo X:
  2. //
  3. // Uso arrays porque es más fácil así modificar los nombres...
  4. // de variables:
  5. //
  6. // Los casilleros están numerados así:
  7. // 0 1
  8. // 2 3
  9. // Situación inicial (v es casillero vacío):
  10. SituacionBase = ["v", "v", "v", "v"];
  11. // Ponerla en la lista de situaciones a experimentar:
  12. SaE1 = SituacionBase.slice();
  13. // Situaciones a experimentar (cuántas son):
  14. SaE = 1;
  15. NroDeSExperimentandose = 1;
  16. NombreDeSE = "S"+(SaE1.join(""));
  17. // Acción a realizarse (casillero a marcar):
  18. Action = 0;
  19. function BuscarAccionesGanadoras () {
  20. PlantearSyActuar();
  21. // ¿Ganó?
  22. // Para averiguarlo, calcular fila (contando desde 0):
  23. Fila = Math.floor(Action/2);
  24. // trace(" Fila: "+Fila);
  25. if (Situacion[Fila*2] == Situacion[Fila*2+1]) {
  26. // trace("Situacion[Fila*2] == Situacion[Fila*2+1]: "+Situacion[Fila*2]+" == "+Situacion[Fila*2+1]);
  27. // Sí, crear datos sobre eso:
  28. // En la situación base conviene la acción realizada:
  29. set (NombreDeSE+"BestAction", Action);
  30. // En esa situación se requiere 1 acción para ganar:
  31. set (NombreDeSE+"DistanciaaGanar", 1);
  32. trace("Ganó, ahora se sabe que en la situación "+SituacionBase+" se gana usando la acción "+Action);
  33. // ¿Aún hay situaciones a experimentar?
  34. if (SaE > NroDeSExperimentandose) {
  35. IniciarExperimentosEnOtraS();
  36. } else {
  37. // Comenzar la etapa 2.
  38. IniciarEtapa2();
  39. }
  40. } else {
  41. EvaluarConocimientoSobreSyEtc();
  42. }
  43. }
  44. function PlantearSyActuar () {
  45. // Plantear situación porque puede modificarse pero...
  46. // podría requerirse su estado original luego:
  47. Situacion = SituacionBase.slice();
  48. trace(" La situación experimentándose es "+Situacion);
  49. // Aplicación de la acción:
  50. Situacion[Action] = "X";
  51. trace(" Se realizó la acción "+Action+"; ahora la situación es "+Situacion);
  52. }
  53. function IniciarExperimentosEnOtraS () {
  54. NroDeSExperimentandose++;
  55. SituacionBase = eval("SaE"+NroDeSExperimentandose);
  56. // trace("SituacionBase: "+SituacionBase);
  57. // Reset de la acción a probar:
  58. Action = 0;
  59. trace("Se inician experimentos en otra situación");
  60. }
  61. function IniciarEtapa2 () {
  62. DistanciaaGanarAceptada = 1;
  63. trace("Se experimentaron todas las situaciones; se reexperimentarán buscando resultados menos óptimos");
  64. trace("Son "+SaE+" situaciones; se acepta que la distancia a la victoria sea "+DistanciaaGanarAceptada);
  65. gotoAndStop (3);
  66. }
  67. function EvaluarConocimientoSobreSyEtc () {
  68. SituacionHechaTexto = Situacion.join("");
  69. NombreDeSituacion = "S"+SituacionHechaTexto;
  70. Resumen = NombreDeSituacion+"BestAction";
  71. if (eval(Resumen) == undefined) {
  72. // No, anotar que debe investigarse:
  73. SaE++;
  74. set ("SaE"+SaE, Situacion.slice());
  75. trace("Esa situación no está anotada; se anota como nro "+SaE);
  76. // Esto para saber que está anotada:
  77. set (Resumen, "Desconocida");
  78. }
  79. // ¿Queda alguna acción sin probar?
  80. if (Action < 3) {
  81. // Sí, probar otra:
  82. Action++;
  83. } else if (SaE > NroDeSExperimentandose) {
  84. // Sino si aún hay situaciones a experimentar:
  85. trace("No hay más acciones posibles en la situación");
  86. IniciarExperimentosEnOtraS();
  87. } else {
  88. // Comenzar la etapa 2.
  89. IniciarEtapa2();
  90. }
  91. }

Ah, BuscarAccionesGanadoras se repite hasta que empiece la etapa 2.
3  Programación / Programación General / ¿Qué lío he hecho con mi generador de tableros estilo 3 en línea? en: 19 Enero 2025, 23:57 pm
Así funcionaba:
Código
  1. function HacerTablero () {
  2. MaxCasillero = CasillerosPorFila*CasillerosPorFila;
  3. LargoDeCasilleros = 384/CasillerosPorFila;
  4. CasillerosColocados = 0;
  5. // Sus columnas y filas se cuentan desde 0,
  6. // sirven para posicionarlos más fácil:
  7. Columna = 0;
  8. Fila = 0;
  9. do {
  10. CasillerosColocados++;
  11. CasilleroaColocar = "Casillero"+CasillerosColocados;
  12. // v es vacío.
  13. set ("SignoEn"+CasilleroaColocar, "v");
  14. // sCasillero tiene código.
  15. attachMovie("sCasillero", CasilleroaColocar, CasillerosColocados);
  16. setProperty (CasilleroaColocar, _x, LargoDeCasilleros*Columna);
  17. setProperty (CasilleroaColocar, _y, LargoDeCasilleros*Fila);
  18. setProperty (CasilleroaColocar, _width, LargoDeCasilleros);
  19. setProperty (CasilleroaColocar, _height, LargoDeCasilleros);
  20. Columna = Columna+1;
  21. if (Columna == CasillerosPorFila) {
  22. Columna = 0;
  23. Fila = Fila+1;
  24. }
  25. // Para que al presionar el botón se sepa qué modificar:
  26. set (CasilleroaColocar+".CasilleroAsociado", CasillerosColocados);
  27. } while (CasillerosColocados<MaxCasillero);
  28. }

Intenté poner que se cuenten desde 0 en vez desde 1 (o sea, que en vez de Casillero1, Casillero2, etc, sean Casillero0, Casillero1, etc) y ahora anda mal, pone uno menos y además lo borra mal (eso es otro tema):

Código
  1. function HacerTablero () {
  2. // Esto se irá especificando en el while:
  3. Situacion = [];
  4. PosiblesAcciones = [];
  5. // Los casilleros se cuentan desde 0:
  6. MaxCasillero = CasillerosPorFila*CasillerosPorFila-1;
  7. LargoDeCasilleros = 384/CasillerosPorFila;
  8. NroDeCasillerosaColocar = -1;
  9. // Sus columnas y filas se cuentan desde 0,
  10. // sirven para posicionarlos más fácil:
  11. Columna = 0;
  12. Fila = 0;
  13. do {
  14. NroDeCasilleroaColocar++;
  15. // v es vacío:
  16. Situacion.push("v");
  17. PosiblesAcciones.push(NroDeCasilleroaColocar);
  18. CasilleroaColocar = "Casillero"+NroDeCasilleroaColocar;
  19. // set ("SignoEn"+CasilleroaColocar, "v");
  20. // sCasillero tiene código.
  21. attachMovie("sCasillero", CasilleroaColocar, NroDeCasilleroaColocar);
  22. setProperty (CasilleroaColocar, _x, LargoDeCasilleros*Columna);
  23. setProperty (CasilleroaColocar, _y, LargoDeCasilleros*Fila);
  24. setProperty (CasilleroaColocar, _width, LargoDeCasilleros);
  25. setProperty (CasilleroaColocar, _height, LargoDeCasilleros);
  26. Columna = Columna+1;
  27. if (Columna == CasillerosPorFila) {
  28. Columna = 0;
  29. Fila = Fila+1;
  30. }
  31. // Para que al presionar el botón se sepa qué modificar:
  32. set (CasilleroaColocar+".CasilleroAsociado", NroDeCasilleroaColocar);
  33. trace("Colocado el "+NroDeCasilleroaColocar);
  34. } while (NroDeCasilleroaColocar<MaxCasillero);
  35. }

Si el tablero es de 3*3, se deben colocar 9, pero el máximo será 8 porque se cuentan desde 0. Y puse que el 1er colocado sea el 0. Pero el trace no lo indica, el 1er trace es del 1:
Colocado el 1
Colocado el 2
...
Colocado el 8

¿Qué pasa?

Edit: Creo que era una s de más, sorry >___<

NroDeCasillerosaColocar = -1;
debe ser:
NroDeCasilleroaColocar = -1;
4  Seguridad Informática / Hacking / Re: Hackeo de una cuenta de instagram en: 18 Enero 2025, 00:57 am
Pregunta a los de Insta si hay una opción para ver cómo se ha ingresado últimamente. Desde qué dispositivo, Windows, IP, esas cosas.
5  Programación / Programación General / Busco testers para mi generador de dibujos, hallar errores, paso el editable también. en: 15 Enero 2025, 16:18 pm
El siguiente link tiene un exe, un fla que es el archivo editable, y un swf que es como un exe menos peligroso pero sólo sirve si tienen Flash Player.
Actualización de acuerdo al momento en que el post fue editado: 25-01-15, 16:18
https://drive.google.com/file/d/17Mn04J7GUnn4CGaqjnE70UeGHISAVqbN/view?usp=sharing

Nota: Al cliquear un dibujo, muta.

Errores conocidos que intentaré arreglar más adelante:

1: La flecha de abajo que apunta a la izquierda, cuando se usa en la 1er pantalla quiero que lleve a las opciones de la última, pero aún no existe, así que está mal, no la usen en la 1er pantalla, saca las opciones y el programa se vuelve inusable.

2: Los botones de colores en la 2nda pantalla (flecha de abajo que apunta a la derecha) no deberían estar ahí. No los usen porque aún no llegué a arreglar esa parte, esos botones quedaron ahí por error.

3: No hay 3era pantalla así que tocar dos veces el botón de la derecha es mala idea.

4: Si habiendo X colores definidos (por ejemplo 3) se define uno salteando intermedios (por ejemplo habiendo 3, se define el 5), entonces al producirse los dibujos los colores intermedios serán negro.
Solución planeada: Se elegirán colores al azar para esos.

5: Aparentemente, si mientras se generan los dibujos señalas un botón de colores preestablecidos y quitas el mouse antes de que el proceso termine, el botón quedará parpadeando. Es un efecto que debería ocurrir sólo mientras el mouse apunta al botón, pero como el programa estaba haciendo otras cosas no notó que el mouse se fue de ahí, supongo. En PC rápidas posiblemente no ocurra por poca cosa, tendrían que aumentar la cantidad de dibujos y cuadraditos, tal vez.

6: Puede que se vean pequeñas líneas entre los cuadraditos, como si no ocuparan todo el espacio que deben. Un problema del largo y ancho supongo, que es calculado, si el resultado es en decimales ya saben que pueden pasar ese tipo de cosas.

7: Si bajas la cantidad de cuadraditos por fila, la mínima cantidad de colores requeridos debe bajar, porque si por ejemplo es 3 pero sólo hay 2 cuadraditos pintables (el resto son simétricos), entonces podrá haber 3 colores en el dibujo. Eso se corrige pero la corrección hace que a partir de ahí el último color definido se elimine, o se deje de usar, aunque en el la pantalla se vea que está definido.

8: Si agregas un color, luego aumentas la cantidad de mínimos requeridos, y luego bajas la cantidad de cuadraditos por fila, el programa se tranca por lo que expliqué en el punto anterior. No sé por qué no lo corrige en este caso.

Estoy corrigiendo, me toma tiempo...
6  Media / Diseño Gráfico / Re: Reducir tamaño de la hoja, no de la imagen. en: 14 Enero 2025, 20:41 pm
Sirvió, tema resuelto.


Songoku, te muestro.

Luego de tomar una foto que quería, quedó así:

La podría tomar de otro modo pero ya había tomado 4 así, además no creí que fuese un problema.

A las 4 las moví hacia arriba (con flechas) para que desapareciera el menú de arriba y quedara justito donde empieza el cuadro donde está la imagen, una cosa blanca y gris que se ve poco:


Ahora tenía que quitar todo lo de abajo, de modo que la imagen termine justito donde termina el cuadro que te comenté, así (esta es otra foto pero sirve para que se entienda):


Usando el mouse, no es fácil. Te pasás un pixel para un lado u otro, yo al menos sí, por más que ponga zoom. Poner un número como se mostró, es más fácil.

EdePC, al intentar eso me pone esto:

Pero tengo 160 GB libres, no sé. ¿Falta de ram?

Pero al intentar descargarla me descarga una página dice, no me dice que es un gif, me dice Chrome HTML document.

Vivo en Uruguay.
7  Media / Diseño Gráfico / Re: Reducir tamaño de la hoja, no de la imagen. en: 14 Enero 2025, 15:47 pm
Songoku, cuando intento ver tu imagen en una nueva pesataña, el link se cambia y no se muestra la imagen.
Cuando intento descargarla, me aparece descargar una página, no una imagen.
Y bueno, reduje el zoom del foro para poder verla toda pero queda muy chica, puedo hacer algunas artimañas pero no debería ser necesario, no sé qué pasa.
Por lo que vi, eso que haces no es muy diferente a lo que se puede hacer en Paint, yo necesito que quede en un tamaño que le especifique pegando un número, no que dependa de mi puntería con el mouse  :xD

EdePC, lo de selección a medida me podría servir, lo pruebo.
8  Programación / Python / Ayuda para poner prints en código que no entiendo bien. en: 14 Enero 2025, 15:32 pm
El programa genera las combinaciones de 2 letras.

Carga un diccionario en inglés y otro en español.

Anota las combinaciones de 2 letras que hay en las palabras.

Luego anota las combinaciones de 2 letras que ocurren cuando 2 palabras se unen. Así por ejemplo se obtiene zh, por nariz y hoy.

Finalmente, muestra las combinaciones que no ocurrieron, lo hace quitando de la 1er lista (la del inicio) las que anotó.

Eso si funciona bien, no sé.

Lo que quiero es que cuando anote una combinación, me diga cual anotó. Así me entero de cómo se forma qq por ejemplo.

Código
  1. import itertools
  2.  
  3. def cargar_diccionario(ruta):
  4.    """Carga el diccionario desde un archivo .txt y devuelve un conjunto de palabras en minúsculas."""
  5.    with open(ruta, 'r', encoding='utf-8') as archivo:
  6.        return set(palabra.strip().lower() for palabra in archivo)
  7.  
  8. def generar_combinaciones(alfabeto):
  9.    """Genera todas las combinaciones posibles de dos letras del alfabeto."""
  10.    return {a + b for a, b in itertools.product(alfabeto, repeat=2)}
  11.  
  12. def buscar_combinaciones(diccionario, combinaciones):
  13.    """Busca combinaciones dentro de las palabras del diccionario."""
  14.    presentes = set()
  15.  
  16.    # Buscar combinaciones dentro de palabras individuales
  17.    for palabra in diccionario:
  18.        for i in range(len(palabra) - 1):
  19.            presentes.add(palabra[i:i+2])
  20.  
  21.    # Buscar combinaciones entre palabras consecutivas
  22.    lista_palabras = sorted(diccionario)  # Ordenar las palabras
  23.    for i in range(len(lista_palabras) - 1):
  24.        ultima_letra = lista_palabras[-1]
  25.        primera_letra = lista_palabras[i + 1][0]
  26.        presentes.add(ultima_letra + primera_letra)
  27.  
  28.    return combinaciones - presentes
  29.  
  30. # Paso 1: Cargar diccionarios
  31. diccionario_es = cargar_diccionario('diccionario_es.txt')
  32. diccionario_en = cargar_diccionario('diccionario_en.txt')
  33.  
  34. # Paso 2: Generar combinaciones posibles
  35. alfabeto_es = 'abcdefghijklmnñopqrstuvwxyz'
  36. alfabeto_en = 'abcdefghijklmnopqrstuvwxyz'
  37. combinaciones_es = generar_combinaciones(alfabeto_es)
  38. combinaciones_en = generar_combinaciones(alfabeto_en)
  39.  
  40. # Paso 3: Buscar combinaciones inexistentes en cada diccionario
  41. inexistentes_es = buscar_combinaciones(diccionario_es, combinaciones_es)
  42. inexistentes_en = buscar_combinaciones(diccionario_en, combinaciones_en)
  43.  
  44. # Paso 4: Combinar resultados y mostrar combinaciones inexistentes en ambos idiomas
  45. inexistentes_totales = inexistentes_es.intersection(inexistentes_en)
  46.  
  47. print(f"Combinaciones inexistentes en ambos idiomas ({len(inexistentes_totales)}):")
  48. print(sorted(inexistentes_totales))
  49. input("Presione Enter para continuar ...")
9  Seguridad Informática / Hacking / Re: Descartar combinaciones de caracteres al buscar password. en: 14 Enero 2025, 15:24 pm
Deberé informarme de lo que has dicho.

Logré hacer que el programa puesto funcione, pero sólo encontró 8 combinaciones:
jq
jx
qj
qx
qz
vq
xj
zx

Me llama la atención que no esté qq por ejemplo. Debe haber palabras inglesas que terminen en q entonces. Porque en español...

Debería agregar tildes, supongo.
10  Informática / Software / Re: Mi Notepad++ no cambia el tamaño de la fuente. en: 14 Enero 2025, 15:12 pm
No vi ni pensé que hubiera que marcar varias cosas para cambiar la fuente.

También, cuando luego de cerrar el archivo no me preguntó si quería guardar los cambios, pensé que se guardaba automáticamente. Resultó que no.
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 229
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines