domingo, 18 de septiembre de 2016

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.






Una familia gatuna...

Solución a un puzzle:

primer problema:

Una familia gatuna
Las diferentes ramas de una familia de felinos se han reunido en una fiesta familiar. Jugando con unas balanzas han visto que: ƒ 4 gatas y 3 gatitos pesan 15 kg ƒ 3 gatas y 4 gatitos pesan 13 kg ¿Cuánto pesan cada gata y cada gatito por separado?


podemos reducir el problema en dos ecuaciones:

4x+3y =15
3x+4y=13

por el método de gauss jordan vamos a crear una matriz de ecuaciones:

| 4 3 | 15 |
| 3 4 | 13 |

comenzamos dividiendo por el número 4 en la primera linea:

| 1 0.75 | 3.75 |
| 3   4    |   13  |

para la segunda linea, sustraemos la primera multiplicada por 3

| 1 0.75 | 3.75 |
| 0 1.75 | 1.75 |

y ahora dividimos por 0.75 en la segunda linea

| 1 0.75 | 3.75 |
| 0    1   |    1   |

y si sustraemos la segunda linea multiplicada por 0.75

| 1    0   | 3 |
| 0    1   | 1 |


lo cual significa que las gatas pesan cada una 3 kg y los gatos 1 kg.

comprobando en las ecuaciones originales...



4x+3y =15 ---> 4(3) + 3(1) = 15 ---> 12 + 3 = 15 ---> 15=15
3x+4y=13  ---> 3(3) + 4(1) = 13 ---> 9 + 4 = 13 ---> 13=13



lo cual da por terminado el acertijo.





martes, 30 de agosto de 2016

Objetivos de proyecto

Objetivo General del Proyecto
Generar ingresos por medio de anuncios en el aplicativo que permita a clientes o usuarios mejorar su capacidad para solucionar problemas aritméticos.
Objetivos Específicos
Reforzar las habilidades aritméticas de los usuarios.
Desarrollar una interfaz simple y agradable, para facilitar su uso y mejorar la experiencia del
Para el proyecto de Ingeniería de software se hará una aplicación que ayude a los usuarios a mejorar sus habilidades aritmeticas, se tienen pensadas:
  • 16 pantallas
  • 3 niveles de dificultad
  • 4 modos de evaluación
  • uso de base de datos de usuarios y puntajes altos
para la base de datos se intentará tomar el modelo 'Firebase' para almacenar los datos simples en nube
sin embargo se intentará que todo sea offline para  mayor comodidad de los usuarios.
En la clase de hoy se han hecho objetivos respecto a las modificaciones que se deben hacer a una casa para poder disfrutar del mundial en familia

Objetivo General
Adecuar las instalaciones del hogar para optimizar el tiempo y el espacio en pro de la comodidad familiar en el tiempo del mundial.
Objetivos específicos:
Aumentar el espacio de los contenedores de comida para suplir a la familia.
Adquirir nuevos muebles para la comodidad de la familia.
Diseñar mejores espacios para la capacidad de espacio para los miembros de la familia.
Implementar elementos de ocio y entretenimiento para uso común.
Contratar un servicio de cable televisión.
Adquirir mercancía del equipo predilecto.