<?php
namespace JoshDiFabio;
interface RomanNumeralGeneratorInterface
{
/**
* @param int $number
* @return string
* @throws \InvalidArgumentException Argument not an integer or out of range
* @author Josh Di Fabio <joshdifabio@hotmail.com>
*/
public function generate($number);
}
class RomanNumeral
{
const ONE = 'I';
const FIVE = 'V';
const TEN = 'X';
const FIFTY = 'L';
const ONE_HUNDRED = 'C';
const FIVE_HUNDRED = 'D';
const ONE_THOUSAND = 'M';
}
class RomanNumeralGenerator implements RomanNumeralGeneratorInterface
{
/**
* @var array
* @author Josh Di Fabio <joshdifabio@hotmail.com>
*/
private $_integerNumeralMap = array(
1000 => RomanNumeral::ONE_THOUSAND,
500 => RomanNumeral::FIVE_HUNDRED,
100 => RomanNumeral::ONE_HUNDRED,
50 => RomanNumeral::FIFTY,
10 => RomanNumeral::TEN,
5 => RomanNumeral::FIVE,
1 => RomanNumeral::ONE,
);
/**
* @param int $number
* @return string
* @throws \InvalidArgumentException Argument not an integer or out of range
* @author Josh Di Fabio <joshdifabio@hotmail.com>
*/
public function generate($number)
{
if (!is_integer($number)) {
throw new \InvalidArgumentException('Provided argument is not an integer.');
}
if (1 > $number || 3999 < $number) {
throw new \InvalidArgumentException(
'The provided number is not within the allowed range of 1 to 3999.');
}
$numerals = array();
while (0 < $number) {
$_prevInteger = null;
foreach ($this->_integerNumeralMap as $_integer => $_numeral) {
if (!is_null($_prevInteger) && $number >= 4 * $_integer) {
$numerals[] = $_numeral;
$numerals[] = $this->_integerNumeralMap[$_prevInteger];
$number -= 4 * $_integer;
break;
}
if ($number >= $_integer) {
$numerals[] = $_numeral;
$number -= $_integer;
break;
}
$_prevInteger = $_integer;
}
}
return implode('', $numerals);
}
}
$generator = new RomanNumeralGenerator;
echo $generator->generate(412);
- Output for 5.3.0 - 5.3.29, 5.4.0 - 5.4.45, 5.5.24 - 5.5.35, 5.6.8 - 5.6.28, 7.0.0 - 7.0.20, 7.1.0 - 7.1.7, 7.2.29 - 7.2.33, 7.3.12 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.6
- CDXII
- Output for 4.4.2 - 4.4.9, 5.1.0 - 5.1.6, 5.2.0 - 5.2.17
- Parse error: syntax error, unexpected T_STRING in /in/SnUbn on line 2
Process exited with code 255. - Output for 4.3.1, 4.3.5 - 4.3.11, 4.4.0 - 4.4.1, 5.0.0 - 5.0.5
- Parse error: parse error, unexpected T_STRING in /in/SnUbn on line 2
Process exited with code 255. - Output for 4.3.2 - 4.3.4
- Parse error: parse error in /in/SnUbn on line 2
Process exited with code 255. - Output for 4.3.0
- Parse error: parse error, unexpected T_STRING in /in/rdWle on line 2
Process exited with code 255.
preferences:
168.14 ms | 401 KiB | 310 Q