[ create a new paste ] login | about

Link: http://codepad.org/btmDsGxH    [ raw code | output | fork ]

mohit_at_codepad - Haskell, pasted on Oct 21:
-- http://nabetani.sakura.ne.jp/hena/ord5railsontiles/
-- Input is 9 tiles
-- Arrange tiles and enter from Tile B, top
-- Trace the rail and print the tiles traversed until you corss 3 X 3 boundary

inputList = ["101221102", "000000000", "111111111", "222222222",
             "000211112", "221011102", "201100112", "000111222",
             "012012012", "201120111", "220111122", "221011022",
             "111000112", "001211001", "111222012", "220111211",
             "211212212", "002112210", "001010221", "100211002",
             "201212121"]
numList = map show [0, 1..]
hashList = repeat "#"
alphaList = "ABCDEFGHI"
dTop = 0
dLft = 1
dBot = 2
dRgt = 3

main = testAll inputList where
       testAll = putStr . unlines .
                 zipWith addWithoutSp hashList .
                 zipWith addWithSp numList .
                 zipWith addWithSp inputList . map findRail

addWithSp a b = a ++ " " ++ b
addWithoutSp a b = a ++ b
findRail = findRailInt 0 1 dTop

-- Outside 3 X 3
findRailInt  (-1) _ _ _ = ""
findRailInt  3 _ _ _ = ""
findRailInt  _ (-1) _ _ = ""
findRailInt  _ 3 _ _ = ""

-- findRailInt i j dDir a = [ alphaList !! idx ] ++ " " ++ show newi ++ " " ++ show newj ++  " " ++ show newDir ++ " " ++ findRailInt newi newj newDir a where
findRailInt i j dDir a = [ alphaList !! idx ] ++ findRailInt newi newj newDir a where

                                 idx = 3 * i + j
                                 tileType = a !! idx
                                 newDir = calcDir tileType dDir

                                 calcDir '0' 0= dTop
                                 calcDir '0' 2 = dBot
                                 calcDir '0' 1 = dLft
                                 calcDir '0' 3 = dRgt

                                 calcDir '1' 0 = dLft
                                 calcDir '1' 3 = dBot
                                 calcDir '1' 1 = dTop
                                 calcDir '1' 2 = dRgt

                                 calcDir '2' 0 = dRgt
                                 calcDir '2' 1 = dBot
                                 calcDir '2' 2 = dLft
                                 calcDir '2' 3 = dTop

                                 newi = calcNewI newDir i

                                 newj = calcNewJ newDir j

calcNewI 0 i = i + 1
calcNewI 2 i = i - 1
calcNewI _    i = i

calcNewJ 1 j = j + 1
calcNewJ 3 j = j - 1
calcNewJ _    j = j


Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#0 101221102 BEDGHIFEH
#1 000000000 BEH
#2 111111111 BCF
#3 222222222 BAD
#4 000211112 BEFIHEDGH
#5 221011102 BADGHIFEBCF
#6 201100112 BEHIFCBADEF
#7 000111222 BEFIH
#8 012012012 BC
#9 201120111 BEDABCFI
#10 220111122 BADEHGD
#11 221011022 BADG
#12 111000112 BCFIHEBA
#13 001211001 BEFI
#14 111222012 BCFEHIF
#15 220111211 BADEHI
#16 211212212 BCFEBAD
#17 002112210 BEFC
#18 001010221 BEF
#19 100211002 BEFIHG
#20 201212121 BEFCBAD


Create a new paste based on this one


Comments: