하스켈 점수 5017
여기에는 추상화 제거를위한 가장 가능한 알고리즘 ((λ x . x ) = I; (λ x . y ) = K y ; (λ x . M N ) = S (λ x . M ) (λ x . N ) )는 모든 적용 후에 사용되는 구멍 최적화 장치를 사용합니다. 가장 중요한 최적화 규칙은 S (K x ) (K y ) ↦ K ( xy )로, 알고리즘이 항상 지수 적으로 폭발하는 것을 막습니다.
규칙 세트는 문자열 쌍 목록으로 구성되므로 새 규칙으로 쉽게 해결할 수 있습니다. 이 목적으로 입력 파서를 재사용하면 특별한 보너스로 S, K 및 I도 입력 결합기 내에서 허용됩니다.
규칙은 무조건 적용되지 않습니다. 오히려 이전 버전과 새 버전이 모두 유지되며 차선 버전은 길이가 최고 버전의 길이를 일정 이상 (현재 3 바이트) 이상 초과하는 경우에만 제거됩니다.
출력 단계에서 SKK에 다시 쓸 때까지 I를 기본 결합 자로 취급하면 점수가 약간 향상됩니다. 이렇게하면 나머지 최적화를 혼동하지 않고 KI = K (SKK)를 출력시 SK로 4 바이트 단축 할 수 있습니다.
{-# LANGUAGE ViewPatterns #-}
import qualified Data.IntMap as I
import qualified Data.List.NonEmpty as N
import System.IO
data Term
= V Int
| S
| K
| I
| A (N.NonEmpty (Int, Term, Term))
deriving (Show, Eq, Ord)
parse :: String -> (Term, String)
parse = parseApp . parse1
parseApp :: (Term, String) -> (Term, String)
parseApp (t, ' ':s) = parseApp (t, s)
parseApp (t, "") = (t, "")
parseApp (t, ')':s) = (t, ')' : s)
parseApp (t1, parse1 -> (t2, s)) =
parseApp (A (pure (appLen (t1, t2), t1, t2)), s)
parse1 :: String -> (Term, String)
parse1 (' ':s) = parse1 s
parse1 ('(':(parse -> (t, ')':s))) = (t, s)
parse1 ('S':s) = (S, s)
parse1 ('K':s) = (K, s)
parse1 ('I':s) = (I, s)
parse1 (lex -> [(i, s)]) = (V (read i), s)
ruleStrings :: [(String, String)]
ruleStrings =
[ ("1 3(2 3)", "S1 2 3")
, ("S(K(S(K1)))(S(K(S(K2)))3)", "S(K(S(K(S(K1)2))))3")
, ("S(K(S(K1)))(S(K2))", "S(K(S(K1)2))")
, ("S(K1)(K2)", "K(1 2)")
, ("S(K1)I", "1")
, ("S(S(K1)2)(K3)", "S(K(S1(K3)))2")
, ("S(SI1)I", "S(SSK)1")
]
rules :: [(Term, Term)]
rules = [(a, b) | (parse -> (a, ""), parse -> (b, "")) <- ruleStrings]
len :: Term -> Int
len (V _) = 1
len S = 1
len K = 1
len I = 3
len (A ((l, _, _) N.:| _)) = l
appLen :: (Term, Term) -> Int
appLen (t1, S) = len t1 + 1
appLen (t1, K) = len t1 + 1
appLen (K, I) = 2
appLen (t1, t2) = len t1 + len t2 + 2
notA :: Term -> Bool
notA (A _) = False
notA _ = True
alt :: N.NonEmpty Term -> Term
alt ts =
head $
N.filter notA ts ++
[A (N.nub (a N.:| filter (\(l, _, _) -> l <= minLen + 3) aa))]
where
a@(minLen, _, _) N.:| aa =
N.sort $ do
A b <- ts
b
match :: Term -> Term -> I.IntMap Term -> [I.IntMap Term]
match (V i) t m =
case I.lookup i m of
Just ((/= t) -> True) -> []
_ -> [I.insert i t m]
match S S m = [m]
match K K m = [m]
match I I m = [m]
match (A a) (A a') m = do
(_, t1, t2) <- N.toList a
(_, t1', t2') <- N.toList a'
m1 <- match t1 t1' m
match t2 t2' m1
match _ _ _ = []
sub :: I.IntMap Term -> Term -> Term
sub _ S = S
sub _ K = K
sub _ I = I
sub m (V i) = m I.! i
sub m (A a) =
alt $ do
(_, t1, t2) <- a
pure (sub m t1 & sub m t2)
optimize :: Term -> Term
optimize t = alt $ t N.:| [sub m b | (a, b) <- rules, m <- match a t I.empty]
infixl 5 &
(&) :: Term -> Term -> Term
t1 & t2 = optimize (A (pure (appLen (t1, t2), t1, t2)))
elim :: Int -> Term -> Term
elim n (V ((== n) -> True)) = I
elim n (A a) =
alt $ do
(_, t1, t2) <- a
pure (S & elim n t1 & elim n t2)
elim _ t = K & t
paren :: String -> Bool -> String
paren s True = "(" ++ s ++ ")"
paren s False = s
output :: Term -> Bool -> String
output S = const "S"
output K = const "K"
output I = paren "SKK"
output (V i) = \_ -> show i ++ " "
output (A ((_, K, I) N.:| _)) = paren "SK"
output (A ((_, t1, t2) N.:| _)) = paren (output t1 False ++ output t2 True)
convert :: Int -> Term -> Term
convert 0 t = t
convert n t = convert (n - 1) (elim n t)
process :: String -> String
process (lex -> [(n, lex -> [((`elem` ["=", "->"]) -> True, parse -> (t, ""))])]) =
output (convert (read n) t) False
main :: IO ()
main = do
line <- getLine
putStrLn (process line)
hFlush stdout
main
온라인으로 사용해보십시오!
산출
- S (KS) K
- S (K (SS (KK))) (S (KK) S)
- S (K (SS)) (S (KK) K)
- S (K (SS (KK))) (S (KK) (S (KS) (S (K (S (SKK))) K)))
- S (K (S (K (SS (SK)))))) (S (K (SS (SK))) (S (SKK) (SKK)))
- KK
- S (K (S (S (KS) (S (K (S (SKK))) K)))) (S (KK) K)
- S (K (SS (K (S (KK) (S (SKK) (SKK))))))) (S (SSK (KS)) (S (S (KS) (S (KK) (S (KS)) K))) (K (S (K (S (SSK))) K))))
- S (K (S (KK))) (S (K (S (S (SKK) (SKK)))) K)
- SK
- S (KS) (S (KK) (S (K (SS)) (S (KK) K)))
- S (K (SS (K (S (KK) K))))) (S (KK) (S (KS) (S (SSK (KS)) (S (K (SS)) (S (KK) K)) ))))
- S (K (S (K (S (K (KK))) (S (KK) S))))) (S (K (SS (KK)))) (S (KK) (S (KS) (S (K (S (SKK))) K)))
- S (K (S (K (S (K (SSKK))) (S (KK) S))))) (S (K (S (SKK))) K)
- S (K (S (K (S (KS) K)))) (S (KS) K)
- S (K (S (KS) K))
- S (K (S (K (S (K (S (S (KS (K () (SKK) (SK)))) (K (S (SKK) (SKK)))))) (S (KK) (S (KS) K)))))) (S (K (SS (K (SSK)))) (S (KK) (S (KS) (S (KK) (SSK)))) )
- SSS (KK)
- KK
- S (KK) (S (KK) (S (S (KS) K) (S (K (S (SKK))) (S (K (S (SKK))) K)))
- S (S (KS) (S (KK) (S (KS) (S (KK) (S (K (SS)) (S (KKKKK)))))) (K (S (K (S ( S (KS) (S (K (S (SKK))) K)))) (S (KK) K)))
- S (KK)
- S (KS) (S (KK) (S (KS) (S (KK) (S (K (SS)) (S (KK) K)))))
- S (K (S (K (S (KS) K)))) (S (K (S (S (KS) (S (KK) (S (K (K) K) K)))) ))) (S (KK) (S (K (SS)) (S (KK) K))))
- S (KS) (S (KK) (S (KS) K))
- S (S (KS) (S (KK) (S (KS) (S (KK) (S (K (S (K (SS (KK))))) (S (KS) (S (KK) (S (SSK (KS)) (S (KS) (S (SKK) (SKK)))))))))) K ) (S (K (S (KS) (S (K (S (SK () (K))) K)))))))) (S (K (S (SKK))) K))) (S (K ( S (K (S (KK) K)))) (S (K (S (SKK))) K)))
- S (K (S (K (S (K (S (K (S (KS () (S (K (S (SKK)) K)))) (S (KK) K)) ))) (S (KK) (S (KS) K)))))) S (K (SS (K (S (K (SS)) (S (KK) K))))) (S ( KK) (S (KS) (S (KK) (S (K (SS)) (S (KKKKK))))))
- K (S (KK))
- S (K (S (K (S (K (S (K (S (KS) K))))) (S (K (S (S (KS)) (S (KK) (S (K (SS))) ( S (KK) K)))))) K))))) (S (K (S (S (KS) (S (KK) (S (K (K)) (S (KK) K)))) ))) (S (KK) (S (K (SS)) (S (KK) K))))
- S (KK) (S (K (SSS (KK))))
- K (SSS (KK))
- S (K (SS (K (S (S (KS) (S (KK) (S (KS) K)))) (K (S (K (S (SKK))) K)))) (S (KK) (S (KS) (SS (S (S (KS) (S (KK) (S (KS) (S (K (S (KS) (S (KK) (S (KS) K))))) (SS )))))) (KK))))
- S (K (S (K (S (K (S (K (KK))) (S (KK) S))))))) (S (K (SS (K (S (KK) K)) ))) (S (KK) (SSS (KS))))
- S (K (S (K (S (KKKKK))))
- S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S) K)))))))) (S (KK) (S (KS) (S (KK))))) (S (K (SS (K (S (K (S (KK))) K)))) (S (KK) (S (K (SS)) (S (KK) K)))))) )))))) (S (K (S (S (KS) (S (K (S (SK ()) K)))) (S (KK) K))
- S (K (SS (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S) K)))))))) ")"(S (KK) (S (KS) (SS (S (S (KS))) (S (KK) (S (KS) (S (K (S (SKK))) K))))) (KK)))))))) (S (KK) (S (KS) (S ( KK) (S (K (S (K (S (K (S (K (S (KK))) (S (KK) S)))))))) (S (K (SS (KK))) (S (KK) (S (KS) (S (K (S (KS) (S (KK) (S (KS) K)))))))))
- S (KK) (S (K (S (K (S (KK) (S (KKKK))))) (SS (SK)))
- K (S (K (SSS (KK))))
- S (K (S (K (S (K (S (K (S (K (S (K (S (K (SS (K (S (K (S (S (KS) (S (K (S (SKK ))) K)))) (S (KK) K))))) (S (KK) (S (KS) K)))))) (S (K (SS (K (S (K (SS ( )) (S (KK) K))))) (S (KK) (S (KS) K)))))) (S (K (SS (K (S (K (SS))) (S ( KK) K))))) (S (KK) (S (KS) K))))))) (S (K (SS (K (S (K (SS)) (S (KK) K))) ))) (S (KK) (S (KS) (S (KK) (S (K (SS)) (S (KK) K))))))
- S (K (S (KK))) (S (KS) (S (KK) (S (K (S (KK) (S (KKKKK) K)))))
- S (K (SS (K (S (S (KS) (S (KK) (S (KS) K)))) (K (S (K (S (SKK))) K)))) (S (KK) (S (KS) (S (KK) (S (K (S (K (S (K (SS (K (SS () (S (KK) K))))))) (KK) (S (KS) K)))))) (S (K (SS (K (S (KK) (S (K ()) K))))) (S (KK) (S ( K (SS)) (S (KK) (S (K (S (K (S (KK) (S (KS) K))))) (S (KS) K)))))))))
- S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (SS (K (S (K (S (S (KS) (S (K (S (SKK))) K)))) (S (KK) K))))) (S (KK) (S (KS) K)))))) (S (K (SS (K (S (K (SS)) (S (KK) K))))) (S (KK) (S (KS) K)))))) (S (K (SS (K (S ( K (SS)) (S (KK) K))))) (S (KK) (S (KS) K))))))) (S (K (SS (K (S (K (SS))) (S (KK) K))))) (S (KK) (S (KS) K)))))) (S (K (SS (K (S (K (SS ()) (S (KK)) K))))) (S (KK) (S (KS) (S (KK) (S (K (SS)) (S (KKKKK) K)))))
- K (K (K (K (K (S (KK) (S (KK) (S (K (SS () (S (K))) (SSK))))))))
- S (KK) (S (K (S (KK) (S (KK) (S (KK) (S (KK) K))))))
- 에스 K (S (S (KS) (S (K (S (SKK))) K)))) (S (KK) K))))) (S (KK) (S (KS) K)))) )) (S (K (SS (K (S (K (SS)) (S (KK) K)))))) (S (KK) (S (KS) K)))))) (S ( K (SS (K (S (K (SS)) (S (KKKKK) K))))) (S (KK) (S (KS) K))))))) (S (K (SS (K (S (K (SS)) (S (KK) K))))) (S (KK) (S (KS) K)))))) (S (K (SS (K (S (K ( SS)) (S (KK) K))))) (S (KK) (S (KS) K))))))) (S (K (SS (K (S (K (SS))) (S (KK) K))))) (S (KK) (S (KS) (S (KK) (S (K (SS)) (S (KKKKK) K)))))
- 에스 KS) (S (K (S (SKK))) K)))))) (S (KK) (S (KS) (S (KK) (S (SSK (KS))) (S (K (SS) )) (S (KK) K)))))))))) (S (KK) (S (KS) (S (KK) (S (K (SS (K (S (KK)) (S (KSKK))) ) (S (KK) (S (K (SS (K (S (KK) (S (KS) K))))) (S (KK) (S (K (SS)) (S (KK) (S (K (SS (K (S (KK) K))))) (S (KK) S)))))))))))) (S (KK) (S (K (SS)) K)) )))))))) (S (K (SS (K (S (KK)) (S (K (S (S (KS)) (S (KK) (S (K (SS))) (S (KK) K)))))) (S (KK) (S (K (SS)) (S (KK) K))))))))) (S (KK) S)))))) (S (K (SS (K (S (K (S (S (KS) (S (KK) (S (K (S)) (S (KKK) K)))))) (S (KK) (S (K ( SS)) (S (KK) K))))))) (S (KK) (S (KS) (S (KK) (S (K (S (K (S (KS) (S (KK) (( S (KS) K)))))) (S (KS) (S (KK) (S (K (SS)) (S (KK) K)))))))))
- S (K (SS (K (SS (S (S (KS) (S (KK) S)))) (KK)))) (S (KK) (S (KS) (S (K (S (K) (S (KS) (S (KK) (S (KS) (S (KK) (S (K (S (K (S (K (S (K (S (K (S (S (S (KS (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (K (S (S (K (S (S (S (K (S (S (K)))))))))))) "))))))))))))))) KK) (S (K (SS)) (S (KK) K)))))) (S (KK) (S (K (SS)) (S (KK) K)))))) (S (KK) (S (KS) K))))))))))) (S (K (S (S (KS) (S (KK) (S (K (SS))) (S ( KK) (S (K (S (K (S (KS) K)))) (S (K (SS (K (S (K (SS)) (S (KK) K))))) (S ( KK) (S (KS) (S (KK) (S (K (SS)) (S (KKKKK))))))))))))) (S (KK) (S (K (S (K (S (KK) (S (KS) (S (KK) (S (K (SS (K (S (KK) (S (KS) K)))))) (S (KK) (S (K)) (SS)) K)))))))))) S (KS) (S (KK) (S (K (SS (K (SKK) K))))) (S (KK) (S ( KS) (S (SSK (KS)) (S (K (SS (KK))) (S (KK) (S (KS) (S (K (S (SKK))) K))))) ))))))))))
- K (S (K (S (KK) (S (K (S (KK) (S (K (S (KK) (S (KK) K) K)))))))))
- S (KK) (S (K (S (K (S (KK)) S (K (S (K (S (KK)) (S (K (S (K (S (KK) (S (K (S ( K (S (KK) (S (K (S (KK))) ((S (K (S (SKK))) K))))) (S (K (S (SKK))) K)) ))) (S (K (S (SKK))) K)))))) (S (K (S (SKK))) K))))) (S (K (S (SKK)))) 케이))
- S (K (S (K (S (K (S (K (S (K (SKK)))) (S (K (SS (K (S (K (S (S (KS () (S (K ( S (SKK))) K)))) (S (KK) K))))) (S (KK) (S (KS) K))))))) (S (K (SS (K (S (K (SS)) (S (KK) K))))) (S (KK) (S (KS) K))))))) (S (K (SS (K (S (K (SS)) ) (S (KK) K))))) (S (KK) (S (KS) (S (KK) (S (K (S (K (S (KK) (S (KK) (S (KK)))) (S (KK) K))))))) (S (K (SS)) (S (KK) K))))))