Problema de criptosuma
Problema de criptosuma:
Cada símbolo representa un dígito diferente del 1 al 9. Se muestra el valor de la suma de los elementos de cada columna y cada fila. ¿Cual es la suma de la diagonal que va desde la parte superior izquierda a la inferior derecha?
El problema de la criptosuma nos pide hallar una diagonal de sumas para la matriz anterior de símbolos. solo se sabe la suma que dan los mismos alineados por columnas y filas.
Lo primero que pasó por mi mente fue hacer un sistema de ecuaciones, teniendo en cuenta factores bastante obvios como el hecho de que el símbolo que parece un omega, sumado con el de sagitario, da el mismo valor que el del octágono negro y el trébol. sin embargo decidí que este proceso sería muy largo y decidí probar algo.
Los hackers llevan acabo una practica que para este uso se puede denominar "ataques de fuerza bruta" para hallar contraseñas fácilmente en sistemas que no están delimitadas por códigos captcha o regulaciones de seguridad. El mismo consiste en pasar un diccionario de palabras probables y combinaciones de caracteres hasta conseguir acceso al sistema. Algo así como intentar todas las combinaciones probables para abrir un candado de contraseña.
Para ello usé la plataforma "Unity", famosa por el uso que se le da en la industria de las animaciones y de los videojuegos. la consideré perfecta para mi problema, ya que tiende a ser rápida para correr bucles dentro de su característico método "Update()".
Escribí un codigo en c# que hace uso de un algoritmo de programación bastante conocido: el Fisher-Yates Shuffle, para tomar un array de datos numéricos y reorganizarlo en diversas posiciones acordes a las sumas que nos ofrece el problema.
El script:
using System.Collections;
using UnityEngine;
public class Tester : MonoBehaviour
{
private int tmp;
public int[] order;
private int t;
public int omega;
public int arriba;
public int cuadradonegro;
public int trebol;
public int circuloblanco;
public int cuadradoblanco;
public int arcoflecha;
public int aries;
public int circulonegro;
public int omegah;
public int arribah;
public int cuadradonegroh;
public int trebolh;
public int circuloblancoh;
public int cuadradoblancoh;
public int arcoflechah;
public int ariesh;
public int circulonegroh;
void Start()
{
order = new int[10];
order[1] = 1;
order[2] = 2;
order[3] = 3;
order[4] = 4;
order[5] = 5;
order[6] = 6;
order[7] = 7;
order[8] = 8;
order[9] = 9;
}
void Update()
{
omega = order[1];
arriba = order[2];
cuadradonegro = order[3];
trebol = order[4];
circuloblanco = order[5];
cuadradoblanco = order[6];
arcoflecha = order[7];
aries = order[8];
circulonegro = order[9];
Shuffle();
if (omega + circuloblanco + cuadradoblanco + arcoflecha == 16)
{
omegah = omega;
circuloblancoh = circuloblanco;
cuadradoblancoh = cuadradoblanco;
arcoflechah = arcoflecha;
}
if (arriba + aries + trebol + cuadradonegro == 27)
{
arribah = arriba;
ariesh = aries;
trebolh = trebol;
cuadradonegroh = cuadradonegro;
}
if (trebolh + circulonegro + circuloblancoh + cuadradoblancoh == 16)
{
circulonegroh = circulonegro;
}
if (cuadradonegroh + arcoflechah + arribah + ariesh == 28)
{
if (arcoflechah + cuadradonegroh + ariesh + cuadradoblanco == 26)
{
if (circuloblancoh + ariesh + arcoflechah + circulonegroh == 18)
{
if (omegah + arribah + cuadradonegroh + trebolh == 20)
{
if (cuadradoblancoh + trebolh + arribah + circuloblancoh == 23)
{
Debug.Log("omega:" + omegah);
Debug.Log("arriba:" + arribah);
Debug.Log("cuadradonegro:" + cuadradonegroh);
Debug.Log("trebol:" + trebolh);
Debug.Log("cicruloblanco:" + circuloblancoh);
Debug.Log("cuadradoblanco:" + cuadradoblancoh);
Debug.Log("arcoflecha:" + arcoflechah);
Debug.Log("Aries:" + ariesh);
Debug.Log("circulonegro:" + circulonegroh);
}
}
}
}
}
}
private void Shuffle()
{
for (t = 1; t < order.Length; t++)
{
tmp = order[t];
int r = Random.Range(t, order.Length);
order[t] = order[r];
order[r] = tmp;
}
}
}
Como podemos ver es un código simple que simula un ataque de fuerza bruta. puse a correr el código antes de irme a almorzar y cuando regresé tenía los datos para la matríz:
| 1 9 6 4 | 20 |
| 3 8 5 2 | 18 |
| 7 4 9 3 | 23 |
| 5 6 8 7 | 26 |
-----------------------
16 27 28 16
por lo tanto la diagonal es 25.
gracias por la tarea xd
ResponderEliminar