Soluciones - Matrices (1)

En esta página se muestran una parte de las soluciones de los ejercicios Matrices (1), concretamente el fragmento PHP, sin el principio ni el final de la página que se puede dejar en un fragmento HTML. La solución completa se puede descargar de la página de soluciones.

Sin bucles

Matrices (1) 01 - Números

<?php
$dado = rand(1, 6);

$nombre = ["", "uno", "dos", "tres", "cuatro", "cinco", "seis"];

print "  <p><img src=\"img/$dado.svg\" alt=\"$dado\" title=\"$dado\" width=\"140\" height=\"140\" /></p>\n";
print "\n";
print "  <p>Ha sacado un <strong>$nombre[$dado]</strong>.</p>\n";
?>

Matrices (1) 02 - Animales

<?php
$dibujos = [
    "ballena.svg", "caballito-mar.svg", "camello.svg", "cebra.svg", "elefante.svg",
    "hipopotamo.svg", "jirafa.svg", "leon.svg", "leopardo.svg", "medusa.svg",
    "mono.svg", "oso.svg", "oso-blanco.svg", "pajaro.svg", "pinguino.svg",
    "rinoceronte.svg", "serpiente.svg", "tigre.svg", "tortuga-marina.svg", "tortuga.svg"
];

$animal = rand(0, count($dibujos) - 1);

print "  <p><img src=\"img/animales/$dibujos[$animal]\" alt=\"Animal\" title=\"Animal\" height=\"250\" /></p>\n";
?>

Matrices (1) 03 - Nombres de animales

<?php
$dibujos = [
    "ballena.svg", "caballito-mar.svg", "camello.svg", "cebra.svg", "elefante.svg",
    "hipopotamo.svg", "jirafa.svg", "leon.svg", "leopardo.svg", "medusa.svg",
    "mono.svg", "oso.svg", "oso-blanco.svg", "pajaro.svg", "pinguino.svg",
    "rinoceronte.svg", "serpiente.svg", "tigre.svg", "tortuga-marina.svg", "tortuga.svg"
];

$nombres = [
    "Ballena", "Caballito de mar", "Camello", "Cebra", "Elefante",
    "Hipopótamo", "Jirafa", "León", "Leopardo", "Medusa",
    "Mono", "Oso", "Oso blanco", "Pájaro", "Pingüino",
    "Rinoceronte", "Serpiente", "Tigre", "Tortuga marina", "Tortuga"
];

$animal = rand(0, count($dibujos) - 1);

print "  <h2>$nombres[$animal]</h2>\n";
print "\n";
print "  <p><img src=\"img/animales/$dibujos[$animal]\" alt=\"$nombres[$animal]\" title=\"$nombres[$animal]\" height=\"250\" /></p>\n";
?>

Con bucles

Matrices (1) 11 - Tirada de dados

<?php
$numero = rand(2, 7);

// Guardamos los valores de los dados en la matriz $dados1
$dados = [];
for ($i = 0; $i < $numero; $i++) {
    $dados[$i] = rand(1, 6);
}

// Mostramos las imágenes de los dados obtenidos
print "  <h2>Tirada de $numero dados</h2>\n";
print "\n";
print "  <p>\n";
foreach ($dados as $dado) {
    print "    <img src=\"img/$dado.svg\" alt=\"$dado\" title=\"$dado\" width=\"140\" height=\"140\" />\n";
}
print "  </p>\n";
print "\n";

// Mostramos los valores numéricos de los dados obtenidos
print "  <h2>Resultado</h2>\n";
print "\n";
print "  <p>Los valores obtenidos son: ";
foreach ($dados as $dado) {
    print "$dado ";
}
print "</p>\n";
?>

Matrices (1) 12 - Partida de dados

<?php
$numero = rand(2, 7);

print "  <h2>Jugador 1</h2>\n";
print "\n";

// Guardamos los valores del Jugador 1 en la matriz $dados1
$dados1 = [];
for ($i = 0; $i < $numero; $i++) {
    $dados1[$i] = rand(1, 6);
}

// Mostramos los resultados obtenidos por el Jugador 1
print "  <p>\n";
foreach ($dados1 as $dado) {
    print "    <img src=\"img/$dado.svg\" alt=\"$dado\" title=\"$dado\" width=\"140\" height=\"140\" />\n";
}
print "  </p>\n";
print "\n";

print "  <h2>Jugador 2</h2>\n";
print "\n";

// Guardamos los valores del Jugador 2 en la matriz $dados2
$dados2 = [];
for ($i = 0; $i < $numero; $i++) {
    $dados2[$i] = rand(1, 6);
}

// Mostramos los resultados obtenidos por el Jugador 2
print "  <p>\n";
foreach ($dados2 as $dado) {
    print "    <img src=\"img/$dado.svg\" alt=\"$dado\" title=\"$dado\" width=\"140\" height=\"140\" />\n";
}
print "  </p>\n";
print "\n";

// En los acumuladores $gana1 $gana2 y $empate contamos cuántas partidas ha ganado cada uno
print "  <h2>Resultado</h2>\n";
print "\n";

$gana1 = 0;
$gana2 = 0;
$empate = 0;
for ($i = 0; $i < $numero; $i++) {
    if ($dados1[$i] > $dados2[$i]) {
        $gana1++;
    } elseif ($dados1[$i] < $dados2[$i]) {
        $gana2++;
    } else {
        $empate ++;
    }
}

// Mostramos cuántas partidas ha ganado cada uno
print "  <p>El jugador 1 ha ganado <strong>$gana1</strong> ve";
if ($gana1 != 1) {
    print "ces";
} else {
    print "z";
}
print ", el jugador 2 ha ganado <strong>$gana2</strong> ve";
if ($gana2 != 1) {
    print "ces";
} else {
    print "z";
}
print " y los jugadores han empatado <strong>$empate</strong> ve";
if ($empate != 1) {
    print "ces";
} else {
    print "z";
}
print ".</p>\n";
print "\n";

// Mostramos quién ha ganado la partida
if ($gana1 > $gana2) {
    print "  <p>En conjunto, ha ganado el jugador <strong>1</strong>.</p>\n";
} elseif ($gana1 < $gana2) {
    print "  <p>En conjunto, ha ganado el jugador <strong>2</strong>.</p>\n";
} else {
    print "  <p>En conjunto, han empatado.</p>\n";
}
?>

Matrices (1) 13 - Negación de bits

<?php$numero = 10;

// Creamos la matriz de bits aleatorios
$inicial = [];
for ($i = 0; $i < $numero; $i++) {
    $inicial[$i] = rand(0, 1);
}

// Mostramos los bits aleatorios
print "  <p style=\"font-size: 300%; font-family: monospace;\">";
print "A: ";
foreach ($inicial as $bit) {
    print "$bit ";
}
print "</p>\n";
print "\n";

// Creamos la matriz con los valores complementarios
$resultado = [];
for ($i = 0; $i < $numero; $i++) {
    if ($inicial[$i] == 1) {
        $resultado[$i] = 0;
    } else {
        $resultado[$i] = 1;
    }
}

// Mostramos los valores complementarios
print "  <p style=\"font-size: 300%; font-family: monospace;\">";
print "<span style=\"text-decoration: overline\">A</span>: ";
foreach ($resultado as $bit) {
    print "$bit ";
}
print "</p>\n";
?>

Una forma alternativa de calcular los bits complementarios, sin necesidad de recurrir a un if ... else ... podría ser la siguiente:

// Creamos la matriz con los valores complementarios
$resultado = [];
for ($i = 0; $i < $numero; $i++) {
    $resultado[$i] = 1 - $inicial[$i];
}

Matrices (1) 14 - "Y" lógico

<?php
$numero = 10;

// Creamos la primera matriz de bits aleatorios
$inicial1 = [];
for ($i = 0; $i < $numero; $i++) {
    $inicial1[$i] = rand(0, 1);
}

// Mostramos los bits aleatorios de la primera matriz
print "  <pre style=\"font-size: 300%;\">\n";
print "   A   : ";
foreach ($inicial1 as $bit) {
    print "$bit ";
}
print "\n";
print "\n";

// Creamos la segunda matriz de bits aleatorios
$inicial2 = [];
for ($i = 0; $i < $numero; $i++) {
    $inicial2[$i] = rand(0, 1);
}

// Mostramos los bits aleatorios de la segunda matriz
print "   B   : ";
foreach ($inicial2 as $bit) {
    print "$bit ";
}
print "\n";
print "\n";

// Creamos la matriz con el resultado de la conjunción lógica
$resultado = [];
for ($i = 0; $i < $numero; $i++) {
    if ($inicial1[$i] == 1 && $inicial2[$i] == 1 ) {
        $resultado[$i] = 1;
    } else {
        $resultado[$i] = 0;
    }
}

// Mostramos los valores calculados
print "A and B: ";
foreach ($resultado as $bit) {
    print "$bit ";
}
print "\n";
print "</pre>\n";
?>

En este caso si calculamos el resultado como una operación lógica, tendríamos un problema:

// Creamos la matriz con los valores complementarios
$resultado = [];
for ($i = 0; $i < $numero; $i++) {
    $resultado[$i] = $inicial1[$i] && $inicial2[$i];
}

El problema es que cuando el resulatado es 0, como está calculado con una operación lógica, no sería 0 sino false.

La solución es forzar a PHP a que considere el resultado como número entero, en vez de como variable lógica. Así, el false se convertiría a 0, como queremos:

// Creamos la matriz con los valores complementarios
$resultado = [];
for ($i = 0; $i < $numero; $i++) {
  $resultado[$i] = (int)($inicial1[$i] && $inicial2[$i]);
}

Matrices (1) 15 - El bit más común

<?php
$numero = 10;

// Creamos la primera matriz de bits aleatorios
$inicial1 = [];
for ($i = 0; $i < $numero; $i++) {
    $inicial1[$i] = rand(0, 1);
}

// Mostramos los bits aleatorios de la primera matriz
print "  <p style=\"font-size: 300%; font-family: monospace;\">";
print "A: ";
foreach ($inicial1 as $bit) {
    print "$bit ";
}
print "</p>\n";
print "\n";

// Creamos la segunda matriz de bits aleatorios
$inicial2 = [];
for ($i = 0; $i < $numero; $i++) {
    $inicial2[$i] = rand(0, 1);
}

// Mostramos los bits aleatorios de la segunda matriz
print "  <p style=\"font-size: 300%; font-family: monospace;\">";
print "B: ";
foreach ($inicial2 as $bit) {
    print "$bit ";
}
print "</p>\n";
print "\n";

// Creamos la tercera matriz de bits aleatorios
$inicial3 = [];
for ($i = 0; $i < $numero; $i++) {
    $inicial3[$i] = rand(0, 1);
}

// Mostramos los bits aleatorios de la tercera matriz
print "  <p style=\"font-size: 300%; font-family: monospace;\">";
print "C: ";
foreach ($inicial3 as $bit) {
    print "$bit ";
}
print "</p>\n";
print "\n";

// Creamos la matriz con el resultado
$resultado = [];
for ($i = 0; $i < $numero; $i++) {
    if ($inicial1[$i] + $inicial2[$i] + $inicial3[$i] > 1) {
        $resultado[$i] = 1;
    } else {
        $resultado[$i] = 0;
    }
}

// Mostramos los valores calculados
print "  <p style=\"font-size: 300%; font-family: monospace;\">";
print "R: ";
foreach ($resultado as $bit) {
    print "$bit ";
}
print "</p>\n";
?>

Matrices (1) 16 - Cambio de bits

<?php
$numero = 10;

// Creamos la matriz de bits aleatorios
$inicial = [];
for ($i = 0; $i < $numero; $i++) {
    $inicial[$i] = rand(0, 1);
}

// Mostramos los bits aleatorios de la matriz
print "  <pre style=\"font-size: 300%\">";
print " A: ";
foreach ($inicial as $bit) {
    print "$bit ";
}
print "\n";
print "\n";

// Creamos la matriz con la detección de los cambios
$resultado = [];
for ($i = 0; $i < $numero - 1; $i++) {
    if ($inicial[$i] == $inicial[$i+1]) {
        $resultado[$i] = 0;
    } else {
        $resultado[$i] = 1;
    }
}

// Mostramos los valores calculados
print "&Delta;A: ";
foreach ($resultado as $bit) {
    print "$bit ";
}
print "\n";
print "</pre>\n";
?>

Matrices (1) 17 - Convertidor de binario a código de Gray

<?php
$numero = 10;

// Creamos la matriz de bits aleatorios
$inicial = [];
for ($i = 0; $i < $numero; $i++) {
    $inicial[$i] = rand(0, 1);
}

// Mostramos los bits aleatorios de la matriz
print "  <p style=\"font-size: 300%; font-family: monospace;\">";
print "B: ";
foreach ($inicial as $bit) {
    print "$bit ";
}
print "</p>\n";
print "\n";

// Creamos la matriz con el código Gray
$resultado = [];
$resultado[0] = $inicial[0];
for ($i = 0; $i < $numero - 1; $i++) {
    if ($inicial[$i] == $inicial[$i+1]) {
        $resultado[$i+1] = 0;
    } else {
        $resultado[$i+1] = 1;
    }
}

// Mostramos los valores calculados
print "  <p style=\"font-size: 300%; font-family: monospace;\">";
print "G: ";
foreach ($resultado as $bit) {
    print "$bit ";
}
print "</p>\n";
?>

Ordenar matrices

Matrices (1) 21 - Tirada de dados ordenada

<?php
$numero = rand(2, 7);

// Creamos la matriz de dados aleatorios
$dados = [];
for ($i = 0; $i < $numero; $i++) {
    $dados[$i] = rand(1, 6);
}

// Mostramos los dados
print "  <h2>Tirada de $numero dados</h2>\n";
print "\n";
print "  <p>\n";
foreach ($dados as $dado) {
    print "    <img src=\"img/$dado.svg\" alt=\"$dado\" title=\"$dado\" width=\"140\" height=\"140\" />\n";
}
print "  </p>\n";
print "\n";

// Ordenamos los dados
sort($dados);

// Mostramos los dados ordenados
print "  <h2>Tirada ordenada</h2>\n";
print "\n";
print "  <p>\n";
foreach ($dados as $dado) {
    print "    <img src=\"img/$dado.svg\" alt=\"$dado\" title=\"$dado\" width=\"140\" height=\"140\" />\n";
}
print "  </p>\n";
?>

Matrices (1) 22 - Jugada de Risk

<?php
// Mostramos con cuántos dados va a jugar el Atacante
print "  <h2>Atacante</h2>\n";
print "\n";
$numero1 = rand(1, 3);
if ($numero1 == 1) {
    print "  <p>El atacante ataca con $numero1 dado:</p>\n";
} else {
    print "  <p>El atacante ataca con $numero1 dados:</p>\n";
}
print "\n";

// Guardamos los valores del Atacante en la matriz $dados1
$dados1 = [];
for ($i = 0; $i < $numero1; $i++) {
    $dados1[$i] = rand(1, 6);
}

// Ordenamos la matriz  $dados2 y mostramos los resultados obtenidos por el Atacante
rsort($dados1);
print "  <p>\n";
foreach ($dados1 as $dado) {
    print "    <img src=\"img/$dado.svg\" alt=\"$dado\" title=\"$dado\" width=\"140\" height=\"140\" />\n";
}
print "  </p>\n";
print "\n";

// Mostramos con cuántos dados va a jugar el Defensor
print "  <h2>Defensor</h2>\n";
print "\n";
$numero2 = rand(1, 2);
if ($numero2 == 1) {
    print "  <p>El defensor defiende con $numero2 dado:</p>\n";
} else {
    print "  <p>El defensor defiende con $numero2 dados:</p>\n";
}
print "\n";

// Guardamos los valores del Defensor en la matriz $dados2
$dados2 = [];
for ($i = 0; $i < $numero2; $i++) {
    $dados2[$i] = rand(1, 6);
}

// Ordenamos la matriz $dados2 y mostramos los resultados obtenidos por el Defensor
rsort($dados2);
print "  <p>\n";
foreach ($dados2 as $dado) {
    print "    <img src=\"img/$dado.svg\" alt=\"$dado\" title=\"$dado\" width=\"140\" height=\"140\" />\n";
}
print "  </p>\n";
print "\n";

// En los acumuladores $bajasAtacante $bajasDefensor contamos cuántas partidas ha perdido cada uno
// El número de dados que se compara es el menor de los números de dados tirados
$menor = min($numero1, $numero2);
$bajasAtacante = 0;
$bajasDefensor = 0;
for ($i = 0; $i < $menor; $i++) {
    if ($dados1[$i] > $dados2[$i]) {
        $bajasDefensor++;
    } else {
        $bajasAtacante++;
    }
}

// Mostramos cuántas partidas bajas ha tenido cada jugador
print "  <h2>Resultado</h2>\n";
print "\n";
print "  <p>El atacante pierde <strong>$bajasAtacante</strong> unidad";
if ($bajasAtacante != 1) {
    print "es";
}
print ". El defensor pierde <strong>$bajasDefensor</strong> unidad";
if ($bajasDefensor != 1) {
    print "es";
}
print ".</p>\n";
?>