Skip to content

Instantly share code, notes, and snippets.

@Zerquix18
Created December 17, 2014 15:28
Show Gist options
  • Save Zerquix18/f069ac329c4da03b6e41 to your computer and use it in GitHub Desktop.
Save Zerquix18/f069ac329c4da03b6e41 to your computer and use it in GitHub Desktop.
Con este código puedes sacar la generatriz de un decimal, es decir, la fracción que genera como resultado aquel decimal :)
<?php
function simplificar($up, $down) {
echo "¿Trato de simplificar? [s|y]\n";
if( ! in_array( strtolower( trim( $x = fgets(STDIN) ) ), array("yes", "y", "s", "si", "sí", "yh") )
&& !($x == "\n") )
exit("Entendido.\n");
$result = array(0 => array("u" => (int) $up, "d" => (int) $down) );
$i = 0;
echo "Intentando simplificar...\n";
while(true) {
if( ! is_float($result[$i]['u'] / 2) )
$tu = $result[$i]['u'] / 2;
elseif( ! is_float($result[$i]['u'] / 3) )
$tu = $result[$i]['u'] / 3;
else
break;
if( ! is_float($result[$i]['d'] / 2) )
$td = $result[$i]['d'] / 2;
elseif( ! is_float($result[$i]['d'] / 3) )
$td = $result[$i]['d'] / 3;
else
break;
$result[$i+1]['u'] = $tu;
$result[$i+1]['d'] = $td;
$i++;
}
array_shift($result);
if( empty($result) )
exit("No he podido simplificar. :(\n");
echo "Simplificado:\n";
foreach($result as $r)
echo $r['u'] . '/' . $r['d'] . " <- \n";
}
echo <<< INICIO
******************************************
*-------- Generatriz del decimal --------*
* Usa paréntesis para los que se repiten *
* Sólo acepta positivos *
* *
* Ejemplos: 12.12, 12.(15), 35.1(43) *
* *
*-------- Made by Luis! ^-^ --------*
******************************************
\n
INICIO;
echo "Ingresa el decimal: \n";
$dec = str_replace(",",".", trim( fgets( STDIN ) ) );
echo "Calculando tipo...\n";
if( preg_match("/^(\d)+.(\d)+$/", $dec) ) {
echo "Detectado: decimal exacto.\n";
$type = "de";
}elseif( preg_match("/^(\d)+.\((\d)+\)$/", $dec) ) {
echo "Detectado: decimal periódico puro. \n";
$type = "pp";
}elseif( preg_match("/^(\d)+.(\d)+\((\d)+\)$/", $dec ) ) {
echo "Detectado: decimal periódico mixto. \n";
$type = "pm";
}else
exit("No puedo detectar qué tipo de decimal es.\n");
echo "-------------- calculando... --------\n";
switch($type) {
case "de":
$d = explode(".", $dec);
$np = str_replace(".", "", $dec);
$dv1 = "1";
for($i = 0; $i<strlen($d[1]); $i++)
$dv1 .= "0";
$resultado = $np . '/' . $dv1;
echo "El resultado es: {$resultado}\n";
simplificar($np, $dv1);
break;
case "pp":
$dec = str_replace( array("(", ")"), "", $dec);
$d = explode(".", $dec);
$np = str_replace(".", "", $dec);
$dv1 = "";
for($i = 0; $i<strlen($d[1]); $i++)
$dv1 .= "9";
$np = (int) $np - (int) $d[0];
$resultado = $np . '/' . $dv1;
echo "El resultado es {$resultado}\n";
simplificar($np, $dv1);
break;
case "pm":
$np = str_replace( array("(", ")", "."), "", $dec);
$nip = preg_replace("/\((\d)+\)/", "", $dec);
$tr = str_replace(".", "", $nip);
$up = (int) $np - (int) $tr;
$n0 = explode(".", $dec);
$down = "";
for($i = 0; $i < strlen($tr); $i++)
$down .= "9";
for($i = 0; $i < strlen($n0[0]); $i++)
$down .= "0";
$resultado = $up . '/' . $down;
echo "El resultado es {$resultado}\n";
simplificar($up, $down);
break;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment