Como adivinar una palabra con PHP haciendo permutaciones
Hola bienvenido a un nuevo post, hace unos días un primo compartió una publicación de un concurso de TV de hace algunos años donde te daban pistas para adivinar una palabra, la imagen es como la siguiente :
Para llegar al resultado es haciendo permutaciones con las letras hasta lograr la palabra indicada. Que en este caso era Adriana.
Para poder entender el concepto de permutación, lo explicare como yo lo entiendo que es poder acomodar una secuencia de caracteres o de números en todas los posibles ordenes posibles sin que se repitan, por ejemplo este caso, tenemos una frase que dice "ADAN IRA" tiene 7 letras esto quiere decir que al calcular las permutacione utilizamos la formula de factorial es decir 7! o en Excel Facotrial(7) o lo mismo es 7x6x5x4x3x2x1 lo que nos da como resultado 5040 permutaciones posibles
En Excel lo que hice para poder realizar de manera manual las permutaciones, fue utilizando la función de concatenar, ordenando las letras como se ve en la imagén, como imaginaran hacer esto de manera manual es mucho tiempo
Bueno para tratar de entender mejor el tema de permutaciones, hice otras imágenes que nos permiten ver de otra forma como hacer el ordenamiento
Otra forma de verlo es parecido a un grafo, donde los caminos son involucrar todos las letras
Para verlo con otro ejemplo más numérico, tome 4 letras al obtener el factorial es 24, viendo este ejemplo de forma gráfica con las posibles combinaciones es la siguiente imagen
Permutación con la primer letra A, nos da 6 posibles permutaciones
Por lo que podemos deducir es que si empezamos con otra letra la permutación, en cada caso nos dará 6 resultados más y al multiplicar 4x3x2x1 = 24 soluciones es decir el factorial de 4!
Ahora veamos como realizar la programación de este proceso y poder obtener la lista de permutaciones de una cadena ingresada.
Como hacer el programa en PHP
Primero la página WEB
<html>
<head>
<title>Permutaciones en PHP </title>
</head>
<body>
<p> Esta página es un ejemplo de como generar todas las posibles </p>
<p> Permutaciones de una lista de letras o números </p>
<img src="Diagrama_permutacion_lineal.PNG" alt="Permutaciones" height="300" width="300">
<p>Para poder generar las permutaciones, debes ingresar la lista de palabras, letras o números
<p>Separados por comas por ejemplo a,d,a,n,i,r,a
<form action="permutacion.php" method="GET">
<div align="center">
<input type="text" id="campo1" name="campo1"/>
<input type="submit" value="Permutar"/>
</div>
</form>
<a href="https://www.programacionparatodos.com">www.programacionparatodos.com</a>
</body>
</html>
Luego el programa, estuve pensando como hacerlo de manera de utilizar solo funciones de PHP y bueno si funciona, pero con pocas combinaciones, hay más opciones de hacerlo utilizando recursividad.
Revise solo algunas y las probé con la cadena de este ejemplo a,d,a,n,i,r,a y siempre estaba 5 o 6 veces con alguna de esas funciones, aclaro no probé todas las funciones ustedes pueden validarlas también.
Pero mi programa es el siguiente, utilice las funciones :
- str_shuffle que hacen la permutación de una cadena https://www.php.net/str_shuffle, por ejemplo esta función podría funcionar para generar un password.
- in_array que busca si una cadena existe en un arreglo https://www.php.net/manual/es/function.in-array.php si la encuentra regresa TRUE de lo contrario FALSE.
- str_replace es una función que nos permite cmabiar un caracter o segmento de cadena en una variable https://www.php.net/manual/es/function.str-replace.php
La lógica de mi programa es que busca todas las combinaciones en base a la función str_shuffle y si no la encuentra lo guarda en un arreglo e incrementa la variable.
Para ser sincera no es la forma más rápida de resolver este problema porque consume tiempo de ejecución, pero si me mostró las permutaciones correctas.
<?php
$entrada = $_GET["campo1"];
$lista = explode (",", $entrada);
$entrada = str_replace(",","",$entrada);
echo "Dato de entrada " . $entrada;
echo "<p>";
$largo = count($lista);
function factorial($var)
{
if($var==1)
return 1;
else
return $var * factorial($var-1);
}
echo "Permutaciones posibles " ;
$tot_per = factorial($largo) ;
echo $tot_per;
echo "<p>";
$result = array();
$j = 0;
while ($j < $tot_per ) :
$temp = str_shuffle($entrada);
if ($j == 0):
array_push($result, $temp);
$j = $j + 1 ;
echo $j . " " . $temp . "<p>";
endif;
if ($j > 0):
$key = in_array ($temp,$result, true) ;
if ($key == false):
array_push($result, $temp);
$j = $j + 1 ;
echo $j . " " . $temp . "<p>";
endif;
endif;
endwhile;
?>
Comentarios
Publicar un comentario