From 6a103bc8ab7168717ade88782665d2399b36261c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20B=C3=BChler?= Date: Mon, 21 Jun 2010 16:20:37 +0200 Subject: [PATCH] Add c simulator --- Circuit.hs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Circuit.hs b/Circuit.hs index e751cbc..93676dd 100644 --- a/Circuit.hs +++ b/Circuit.hs @@ -1,4 +1,3 @@ - import Data.Maybe import Text.ParserCombinators.ReadP import Data.List @@ -121,7 +120,8 @@ key_circuit_str = "19L:12R13R0#1R12R,14R0L0#4R9L,9R10R0#3L8L,2L17R0#5L9R,15R1L0# -- goal: Find a circuit with test_key_circ circ == True test_key_circ :: Circuit -> Bool -test_key_circ circ = (key == execcirc circ) +-- test_key_circ circ = (key == execcirc circ) +test_key_circ circ = checkcirc circ input key -- key: 11021210112101221 factory0 = parseCircuit "0L:X0R0#X0R:0L" @@ -154,10 +154,10 @@ build s = let (p, pins) = step (-1) [] (reverse (key ++ (readstream s))) in Circ 1 -> step (k+2) (gates ++ [k+5,k+3,k+4,k+1,p,k]) xs 2 -> step (k+2) (gates ++ [k+5,k+3,k+1,k+4,k,p]) xs -data Circuit = Circuit { outPin :: Int, inPins :: [Int] } deriving (Eq) +data Circuit = Circuit { outPin :: Int, inPins :: [Int] } deriving (Eq, Show) -instance Show Circuit where - show = showCircuit +-- instance Show Circuit where +-- show = showCircuit circfactory :: Circuit -> ([Nat], ([Nat], Nat) -> ([Nat], Nat)) circfactory circ = (map (const 0) (inPins circ), next) where @@ -233,11 +233,18 @@ execfactory :: (a, (a, Nat) -> (a, Nat)) -> [Nat] -> [Nat] execfactory (s, f) [] = [] execfactory (s, f) (x:xs) = o:execfactory (t, f) xs where (t, o) = f (s, x) -execcirc circ = execfactory (circfactory circ) input +checkcirc :: Circuit -> [Nat] -> [Nat] -> Bool +checkcirc c input output = let inp = take (length output) (input ++ repeat 0) in output == execCirc c inp +-- checkcirc c input output = findcirc (circ_to_native c) input output + +execCirc c input = execfactory (circfactory c) input +-- execCirc = eec +execcirc c = execCirc c input ec circ = execfactory (circfactory circ) (input ++ take 100 (repeat 0)) +-- ec c = eec c (input ++ take 100 (repeat 0)) readstream :: String -> [Int] readstream = map (\c -> read [c] :: Int) key_input = [0,2,2,2,2,2,2,0,2,1,0,1,1,0,0,1,1] -key = execfactory (circfactory key_circuit) key_input +key = execCirc key_circuit key_input