shiro #4742(2007/12/11 03:16 GMT) [ Haskell ] Rating2/2=1.00
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
import Numeric data Item a b = Value a | Op (a->a->a) b [Char] cat a b = a*10+b ops :: [Item Double Integer] ops = [Op cat 2 "", Op (+) 0 "+", Op (-) 0 "-", Op (*) 1 "*", Op (/) 1 "/"] opparse [] _ vs = reverse vs opparse (op:ops) (i:is) vs = opparse ops is $ push op (Value i) vs push op@(Op o p _) v (op'@(Op o' p' _):vs) | (p <= p') = (op:v:op':vs) | otherwise = (op':push op v vs) push op v vs = op:v:vs calc [a] [] = a calc ns ((Value a):vs) = calc (a:ns) vs calc (a:b:ns) ((Op op _ _):vs) = calc ((op b a):ns) vs calc _ _ = error "invalid stack state" showFormula ops = "1" ++ rec [2..] ops where rec _ [] = "" rec (i:is) ((Op _ _ n):ops) = n ++ (showInt . round) i (rec is ops) genops 0 = [[]] genops n = [o:os | o <- map (ops!!) [0..4], os <- genops (n-1)] komachi n = [ops | ops <- genops n, test 100 ops] where test sum ops = abs (sum - (calc [] $ opparse ops [2..] [Value 1])) <= 1.0e-10 main = putStr $ unlines $ map showFormula $ komachi 8
Rating2/2=1.00-0+
1 reply [ reply ]
shiro
#4742()
[
Haskell
]
Rating2/2=1.00
opparseで演算子順位文法を使って式をRPNに変換し、calcで計算してます。
opsの定義を変えれば演算子を増やしたり優先順位を買えたりできます。同じ優先度の演算子は左結合。
Rating2/2=1.00-0+
1 reply [ reply ]