seven / solution 7.5
<?php
simplify("6 7844/240");
function simplify(string $f)
{
$f = trim($f);
print_r("simplifying " . $f . ".\n");
if (!($f = checkFraction($f))) {
print_r("invalid fraction.\n");
return false;
}
if ($f[1] === 0) {
print_r("sorry, you can't divide by 0.\n");
return false;
}
if ($i = checkInteger($f)) {
print_r("your fraction simplifies to " . $i . ".\n");
return $i;
}
$f = reduceFraction($f);
print_r("your fraction simpifies to " . $f[0] . "/" . $f[1]);
if ($m = checkMixed($f)) {
print_r(" or " . $m[0] . " " . $m[1] . "/" . $m[2]);
}
print_r(".\n");
}
function checkFraction(string $f)
{
$f = trim($f);
if (!str_contains($f, "/")) {
// not a fraction
return false;
}
if (str_contains($f, " ")) {
// mixed fraction
$mixed = explode(" ", $f);
$whole = trim($mixed[0]) + 0;
$fraction = explode("/", $mixed[1]);
$numerator = trim($fraction[0]) + 0;
$denominator = trim($fraction[1]) + 0;
$numerator = $whole * $denominator + $numerator;
} else {
// simple fraction
$fraction = explode("/", $f);
$numerator = trim($fraction[0]) + 0;
$denominator = trim($fraction[1]) + 0;
}
return [$numerator, $denominator];
}
function checkInteger(array $f)
{
return $f[0] % $f[1] === 0 ? $f[0] / $f[1] : false;
}
function reduceFraction(array $f)
{
for ($i = $f[1]; $i >= 1; $i--) {
if ($f[0] % $i === 0 && $f[1] % $i === 0) {
return [$f[0] / $i, $f[1] / $i];
}
}
return $f;
}
function checkMixed(array $f)
{
if ($f[1] > $f[0]) {
// mixed is impossible with a smaller numerator
return false;
}
$whole = floor($f[0] / $f[1]);
$numerator = $f[0] - $whole * $f[1];
return [$whole, $numerator, $f[1]];
}