PHP 156
ええ。
$f=$argv[1];$p=explode('/',$f);$m=max(array_map('abs',$p));for(;$m;$m--)if(!($p[0]%$m||$p[1]%$m)){$r=$p[0]/$m.'/'.$p[1]/$m;break;}echo $r===$f?'reduced':$r;
実行:
php -r "$f=$argv[1];$p...[code here]...:$r;" 9/18;
1/2
- 分数が既に最も単純な形式の場合、「縮小」を出力します
- 負の分数で動作します
- 不適切な分数で動作します(例:150/100は3/2を与えます)
- ちょっと小数で動作します(たとえば、1.2 / 3.6は0.75 / 2.25を与えます)
- 99/0が誤って1/0を与える?
- 整数にはなりません(例:100/100は1/1になります)
これは、いくつかのテストを行った(関数形式に変更された)ゴルフ前のバージョンです。
<?php
$a = array(
'9/18','8/12','50/100','82/100','100/100','150/100','99/100',
'-5/10','-5/18','0.5/2.5','1.2/3.6','1/0','0/1','99/0'
);
print_r(array_map('r',array_combine(array_values($a),$a)));
function r($f) {
$p = explode('/',$f);
$m = max(array_map('abs',$p));
for ( ; $m; $m-- )
if ( !($p[0] % $m || $p[1] % $m) ) {
$r = $p[0]/$m.'/'.$p[1]/$m;
break;
}
return $r === $f ? 'reduced' : $r;
}
/*
Array(
[9/18] => 1/2
[8/12] => 2/3
[50/100] => 1/2
[82/100] => 41/50
[100/100] => 1/1
[150/100] => 3/2
[99/100] => reduced
[-5/10] => -1/2
[-5/18] => reduced
[0.5/2.5] => 0.2/1
[1.2/3.6] => 0.75/2.25
[1/0] => reduced
[0/1] => reduced
[99/0] => 1/0
)
*/
?>