Pirámide de asteriscos con PHP – Modo avanzado

Tras explicar una forma básica de dibujar una pirámide de asteriscos con PHP, voy a tratar de explicar una forma un poquito más avanzada de hacerlo.

Lo bonito de la programación es que no hay una sola forma de hacer las cosas. Todo se puede analizar de muchas maneras y los resultados pueden ser los mismos. No obstante, dependiendo de nuestro análisis y de nuestra programación, podemos optimizar los resultados y conseguir que sean mucho más viables dependiendo de nuestro objetivo final.

El método que voy a tratar de explicar es una forma más avanzada de entender el problema. Para ello, voy a dibujar la pirámide dentro de un plano cartesiano.

<?php

/* 

 * Para trazar la piramide usare un plano cartesiano hecho con matrices

 * Este es un ejemplo de como quedara el plano sin valores

 *

 * $plane = array (0 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0),

 *           	   1 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0),

 *           	   2 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0),

 *           	   3 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0),

 *           	   4 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0),

 *           	   5 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0),

 *           	   6 => array(0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0)

 *                );

 *

 * Los parametros que voy a usar son los siguientes

 *

 * @param $rows int indica el numero de filas que va a tener la piramide

 * @param $char string indica el simbolo que vamos a usar para pintar la piramide
 * @Param $view int (opcional) indica si quiero pintar la piramide o el plano cartesiano
 *
 * return $piramide string si $view es true
 * return $plane array si $view es false
 *

**/

function crear_piramide ($rows, $char, $view = true) {



	// Creo el plano cartesiano, la piramide, las columnas y los acumuladores

	$plane = array();
	$range = null;
	$piramide = null;
	$cols = 0;
	$cont_pos = 0;
	$cont_neg = 0;



	/* Calculo el numero de columnas a partir de las filas. Hay que tener en cuenta 
	 * si el numero es par o impar para que la piramide quede bien dibujada en el 
	 * centro del plano cartesiano
	**/
	if (($rows % 2) != 0) {

		// El numero de filas es impar, calculo las columnas

		$cols = ($rows * 3) - 4;
	
	} else {

		// El numero de filas es par, calculo las columnas
		$cols = ($rows * 2) - 1;
	}
	
	// Creo los acumuladores para calcular los rangos que tengo que marcar
	$cont_pos = (($cols + 1) / 2) - 1;
	
	// Al ser el primer valor o pico de la piramide, el contador negativo es igual que el positivo

	$cont_neg = $cont_pos;
	

	// Recorro todas las filas

	for ($i = 0; $i < $rows; $i++) {
	
		// Creo el rango que quiero marcar dentro de cada fila
		$range = range($cont_neg, $cont_pos);

	

		// Recorro todas las columnas

		for ($j = 0; $j < $cols; $j++) {
		
			// Si la columna obtenida esta dentro de mi rango
			if (in_array($j, $range)) {
			
       
                                // Guardo valor 1 y pinto el asterisco
				$c[$j] = '1';
				$piramide .= $char;
				
			} else {
				
				// Si no esta, guardo valor 0
				$c[$j] = '0';
			}

		}
		

		// Guardo la fila generada dentro del plano cartesiano

		array_push($plane, $c);
		
		// Añado un salto de carro para seguir con la siguiente linea
		$piramide .= "<br />";
		
		// Actualizo los contadores para volver a calcular los rangos

		$cont_pos++;

		$cont_neg--;

	}
	
	// Devuelvo la opcion elegida en el parametro $view
	if ($view)
		return $piramide;
	else
		print_r($plane);

}

// Forma de uso

$piramides = crear_piramide (5, '*');

echo $piramides;

?>

Si ejecutáis esta función, el resultado por defecto será este:

          *
         ***
        *****
       *******
      *********

También podéis cambiar el asterisco por cualquier otro símbolo:

<?php

$piramides = crear_piramide (5, '[]');
echo $piramides;

// Resultado
         []
       [][][]
     [][][][][]
   [][][][][][][]
 [][][][][][][][][]

?>

Si quereis ver cómo ha quedado nuestro plano cartesiano, solo tenéis que modificar el tercer parámetro pasándolo como false:

<?php

$piramides = crear_piramide (5, '*', false);

echo $piramides;

// Resultado
Array ([0] => Array([0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 1 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0)
          [1] => Array([0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 1 [5] => 1 [6] => 1 [7] => 0 [8] => 0 [9] => 0 [10] => 0)
          [2] => Array([0] => 0 [1] => 0 [2] => 0 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 0 [9] => 0 [10] => 0)
          [3] => Array([0] => 0 [1] => 0 [2] => 1 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 1 [9] => 0 [10] => 0)
          [4] => Array([0] => 0 [1] => 1 [2] => 1 [3] => 1 [4] => 1 [5] => 1 [6] => 1 [7] => 1 [8] => 1 [9] => 1 [10] => 0)
)

?>

Como siempre, esta no es ni mucho menos la forma más eficiente ni definitiva de resolver el problema. También hay que tener en cuenta que este tipo de ejercicios nos ayudan a comprender cómo funciona un lenguaje de programación y cómo debemos abordar un problema real.

Os animo a que comenteis vuestra solución.

Anuncios

Acerca de Javi Garcia
Web developer at www.dejandomarcas.com

One Response to Pirámide de asteriscos con PHP – Modo avanzado

  1. Pingback: Pirámide de asteriscos con PHP – Esta vez, con OOP « Dejandomarcas

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: