R3.3 [Solución]- Arrays – Bienvenido al mundo de Mr. Robot

Contenido

Evil Corp —el gigante que controla todo lo que consumes, lo que piensas y hasta lo que olvidas— cree tenerlo todo bajo control.

Pero no contaba contigo.

En un sótano lleno de cables, pantallas parpadeantes y tazas de café frías, un grupo de hackers conocidos como Atriumsociety prepara su próximo golpe digital. Su misión: devolver el poder a la gente, línea de código a línea de código.

Tu papel comienza aquí.

Eres parte del equipo. Hoy no vienes a “hacer ejercicios”, vienes a infiltrarte en el sistema, Cada array que declares es una base de datos secreta, cada bucle un intento de intrusión, cada condicional una decisión que puede cambiarlo todo.

Prepárate: el prompt está parpadeando.

Atriumsociety te necesita.

1. “Elliot vs Evil Corp”

Enunciado:

Elliot ha interceptado una lista con los balances de Evil Corp.

Con el siguiente array:

int[] balances = {12000, -50, 5000, 15000, 0, -300, 800, 22000, 9999, 100};

Muestra:

  • Cuántas cuentas tienen saldo negativo.
  • Cuántas tienen saldo superior a 10 000 $.
  • El saldo medio.

Qué se hace

  • Recorremos balances
  • Contamos negativos (<0)
  • Contamos los que superan 10.000 (>10000)
  • Sumamos todo para el promedio

Código

public class ElliotVsEvilCorp {
    public static void main(String[] args) {

        int[] balances = {12000, -50, 5000, 15000, 0, -300, 800, 22000, 9999, 100};

        int negativos = 0;
        int masDe10000 = 0;
        int suma = 0;

        for (int i = 0; i < balances.length; i++) {
            int b = balances[i];

            if (b < 0) negativos++;
            if (b > 10000) masDe10000++;

            suma += b;
        }

        double media = (double) suma / balances.length;

        System.out.println("Cuentas con saldo negativo: " + negativos);
        System.out.println("Cuentas con saldo superior a 10000$: " + masDe10000);
        System.out.printf("Saldo medio: %.2f%n", media);
    }
}

2. “Backdoor Scanner”

Enunciado:

Darlene analiza si los servidores de Evil Corp están vulnerables.

Usa el siguiente array:

boolean[] vulnerables = {false, true, false, false, true, false, true, false};

Muestra:

  • Cuántos servidores son vulnerables (true).
  • En qué posiciones están.

Qué se hace

  • Recorremos el array de boolean
  • Si es true, contamos y mostramos la posición

Código





public class BackdoorScanner {
    public static void main(String[] args) {

        boolean[] vulnerables = {false, true, false, false, true, false, true, false};

        int contador = 0;

        System.out.print("Servidores vulnerables en posiciones: ");
        for (int i = 0; i < vulnerables.length; i++) {
            if (vulnerables[i]) {
                contador++;
                System.out.print(i + " ");
            }
        }

        System.out.println();
        System.out.println("Total vulnerables: " + contador);
    }
}


3. “Password Audit”

Enunciado:

Elliot encuentra las siguientes contraseñas antiguas de Evil Corp:

String[] passwords = {"admin123", "e@mpl3", "supersecure99", "pass", "root@2020"};

Indica:

  • Cuántas contienen el carácter @.
  • Cuántas tienen más de 8 caracteres.
  • Cuántas terminan en un número.
  • Cuál es la más larga.

Qué se hace

Para cada contraseña:

  • contains("@") → cuenta las que tienen @
  • length() > 8 → largas
  • “termina en número” → miramos el último carácter con charAt y comprobamos si es dígito
  • “la más larga” → guardamos la que tenga mayor longitud

Código





public class PasswordAudit {
    public static void main(String[] args) {

        String[] passwords = {"admin123", "e@mpl3", "supersecure99", "pass", "root@2020"};

        int conArroba = 0;
        int masDe8 = 0;
        int terminanEnNumero = 0;

        String masLarga = passwords[0];

        for (int i = 0; i < passwords.length; i++) {
            String p = passwords[i];

            if (p.contains("@")) conArroba++;
            if (p.length() > 8) masDe8++;

            char ultimo = p.charAt(p.length() - 1);
            if (Character.isDigit(ultimo)) terminanEnNumero++;

            if (p.length() > masLarga.length()) {
                masLarga = p;
            }
        }

        System.out.println("Contraseñas con @: " + conArroba);
        System.out.println("Contraseñas con más de 8 caracteres: " + masDe8);
        System.out.println("Contraseñas que terminan en número: " + terminanEnNumero);
        System.out.println("La más larga es: " + masLarga + " (" + masLarga.length() + " caracteres)");
    }
}


4. “Hack the Gibson”

Enunciado:

Simula los niveles de éxito de los ataques de Elliot con el siguiente array:

int[] intentos = {82, 13, 45, 79, 90, 5, 33, 72, 18, 65, 40, 100, 29, 10, 67, 55, 88, 60, 14, 3};

Muestra:

  • El valor máximo y el mínimo.
  • Cuántos intentos fueron “exitosos” (más de 70).
  • Si todos son menores de 30, muestra “Mr Robot sospecha que estás desconectado”.

Qué se hace

  • Máximo y mínimo: inicializamos con el primer elemento y comparamos
  • Exitosos: >70
  • “si todos son menores de 30”: bandera todosMenor30 (true al inicio, se rompe si encontramos uno >= 30)

Código





public class HackTheGibson {
    public static void main(String[] args) {

        int[] intentos = {82, 13, 45, 79, 90, 5, 33, 72, 18, 65, 40, 100, 29, 10, 67, 55, 88, 60, 14, 3};

        int max = intentos[0];
        int min = intentos[0];
        int exitosos = 0;

        boolean todosMenor30 = true;

        for (int i = 0; i < intentos.length; i++) {
            int v = intentos[i];

            if (v > max) max = v;
            if (v < min) min = v;

            if (v > 70) exitosos++;

            if (v >= 30) {
                todosMenor30 = false;
            }
        }

        System.out.println("Máximo: " + max);
        System.out.println("Mínimo: " + min);
        System.out.println("Intentos exitosos (>70): " + exitosos);

        if (todosMenor30) {
            System.out.println("Mr Robot sospecha que estás desconectado");
        }
    }
}


5. “Logs del Servidor”

Enunciado:

Angela revisa los registros de acceso de un servidor:

String[] logs = {"OK", "ERROR", "OK", "OK", "ERROR", "OK", "ERROR", "ERROR", "OK", "OK"};

Cuenta:

  • Cuántos accesos fueron "OK".
  • Cuántos "ERROR".
  • Si hay más errores que accesos correctos, muestra “Servidor en peligro”.

Qué se hace

  • Contar "OK" y "ERROR" usando equals
  • Comparar: si errores > ok → aviso

Código





public class LogsDelServidor {
    public static void main(String[] args) {

        String[] logs = {"OK", "ERROR", "OK", "OK", "ERROR", "OK", "ERROR", "ERROR", "OK", "OK"};

        int ok = 0;
        int error = 0;

        for (int i = 0; i < logs.length; i++) {
            if (logs[i].equals("OK")) ok++;
            else if (logs[i].equals("ERROR")) error++;
        }

        System.out.println("OK: " + ok);
        System.out.println("ERROR: " + error);

        if (error > ok) {
            System.out.println("Servidor en peligro");
        }
    }
}


6. “Temperaturas del Servidor”

Enunciado:

Durante un ataque, Elliot monitoriza las temperaturas del servidor:

int[] temperaturas = {45, 49, 52, 57, 60, 59, 55, 48, 46, 50};

Calcula:

  • La temperatura media.
  • Cuántas mediciones superan los 55 °C.
  • Si todas las temperaturas están por debajo de 60 °C, muestra “Sistema estable”; si alguna es 60 o más, muestra “¡Sobrecalentamiento detectado!”.

Qué se hace

  • Media: suma / total
  • Contar >55
  • Comprobar si alguna es >=60 (bandera sobrecalentamiento)

Código





public class TemperaturasServidor {
    public static void main(String[] args) {

        int[] temperaturas = {45, 49, 52, 57, 60, 59, 55, 48, 46, 50};

        int suma = 0;
        int superan55 = 0;

        boolean sobrecalentamiento = false;

        for (int i = 0; i < temperaturas.length; i++) {
            int t = temperaturas[i];

            suma += t;

            if (t > 55) superan55++;
            if (t >= 60) sobrecalentamiento = true;
        }

        double media = (double) suma / temperaturas.length;

        System.out.printf("Temperatura media: %.2f%n", media);
        System.out.println("Mediciones que superan 55°C: " + superan55);

        if (!sobrecalentamiento) {
            System.out.println("Sistema estable");
        } else {
            System.out.println("¡Sobrecalentamiento detectado!");
        }
    }
}


7. “DDoS Simulator”

Enunciado:

Durante un ataque DDoS, se registran los siguientes tiempos de respuesta (en ms):

int[] tiempos = {200, 540, 720, 150, 950, 330, 480, 510, 870, 610};

Muestra:

  • La media, el máximo y el mínimo.
  • Si más del 60 % supera los 500 ms, muestra “Servidor saturado”.
  • Si menos del 10 % supera los 200 ms, muestra “Ataque fallido”.

Qué se hace

  • Media, máximo, mínimo (igual que antes)
  • Contar cuántos superan 500 → para porcentaje
  • Si (superan500 / total) > 0.60 → “Servidor saturado”
  • Si (superan200 / total) < 0.10 → “Ataque fallido”
    • Nota: “supera 200” significa >200, no >=200.

Código





public class DDoSSimulator {
    public static void main(String[] args) {

        int[] tiempos = {200, 540, 720, 150, 950, 330, 480, 510, 870, 610};

        int suma = 0;
        int max = tiempos[0];
        int min = tiempos[0];

        int superan500 = 0;
        int superan200 = 0;

        for (int i = 0; i < tiempos.length; i++) {
            int t = tiempos[i];

            suma += t;
            if (t > max) max = t;
            if (t < min) min = t;

            if (t > 500) superan500++;
            if (t > 200) superan200++;
        }

        double media = (double) suma / tiempos.length;

        double porcentaje500 = (double) superan500 / tiempos.length;
        double porcentaje200 = (double) superan200 / tiempos.length;

        System.out.printf("Media: %.2f ms%n", media);
        System.out.println("Máximo: " + max + " ms");
        System.out.println("Mínimo: " + min + " ms");

        if (porcentaje500 > 0.60) {
            System.out.println("Servidor saturado");
        }

        if (porcentaje200 < 0.10) {
            System.out.println("Ataque fallido");
        }
    }
}