Jump to content

Knight's tour: Difference between revisions

m
Updated to Elm 0.19.1
m (Updated to Elm 0.19.1)
Line 2,522:
 
=={{header|Elm}}==
<lang elm>importmodule ListMain exposing (concatMap, foldl, head,member,filter,length,minimum,concat,map,map2,tailmain)
 
import TimeBrowser exposing (Time,every, secondelement)
import List exposing (concatMap, foldl, head,member,filter,length,minimum,concat,map,map2,tail)
import List.Extra exposing (minimumBy, andThen)
import String exposing (join)
import Html as H
import Html.Attributes as HA
import Html.AppTime exposing (programPosix, every)
import Time exposing (Time,every, second)
import Svg exposing (rect, line, svg, g)
import Svg.Events exposing (onClick)
Line 2,537 ⟶ 2,539:
rowCount=20
colCount=20
dt = 0.03
 
type alias Cell = (Int, Int)
 
type alias Model =
{ path : List Cell
, board : List Cell
}
 
type Msg
type Msg = NoOp | Tick Time | SetStart Cell
= NoOp
| Tick Time.Posix
| SetStart Cell
 
init : () -> (Model,Cmd Msg)
init =_ =
let board = [(List.range 0.. (rowCount-1] `andThen` \r ->))
[0..colCount-1] `andThen` \c - |> andThen
[ (\r, c)]->
(List.range 0 (colCount-1))
|> andThen
(\c ->
[(r, c)]
)
)
path = []
in (Model path board, Cmd.none)
 
view : Model -> H.Html Msg
view model =
let
showChecker row col =
rect [ x <| toStringString.fromInt col
, y <| toStringString.fromInt row
, width "1"
, height "1"
, fill <| if modBy 2 (row + col) % 2 == 0 then "blue" else "grey"
, onClick <| SetStart (row, col)
]
[]
 
showMove (row0,col0) (row1,col1) =
line [ x1 <| toStringString.fromFloat ((toFloat col0) + 0.5)
, y1 <| toStringString.fromFloat ((toFloat row0) + 0.5)
, x2 <| toStringString.fromFloat ((toFloat col1) + 0.5)
, y2 <| toStringString.fromFloat ((toFloat row1) + 0.5)
, style "stroke:yellow;stroke-width:0.05"
]
[]
 
render modelmdl =
let checkers = modelmdl.board `andThen` \(r,c) ->
[showChecker r c] |> andThen
moves = case List.tail model.path of (\(r,c) ->
[showChecker r c]
)
moves = case List.tail mdl.path of
Nothing -> []
Just tl -> List.map2 showMove modelmdl.path tl
in checkers ++ moves
 
unvisited = length model.board - length model.path
 
center = [ HA.style [ ( "text-align", "center") ]
 
in
H.div
[]
[ H.h2 [center] [H.text "Knight's Tour"]
, H.h2 [center] [H.text <| "Unvisited count : " ++ toStringString.fromInt unvisited ]
, H.h2 [center] [H.text "(pick a square)"]
, H.div
[center]
[ svg
[ version "1.1"
, width (toStringString.fromInt w)
, height (toStringString.fromInt h)
, viewBox (join " "
[ toStringString.fromInt 0
, toStringString.fromInt 0
, toStringString.fromInt colCount
, toStringString.fromInt rowCount ])
]
[ g [] <| render model]
]
]
 
nextMoves : Model -> Cell -> List Cell
nextMoves model (stRow,stCol) =
let c = [ 1, 2, -1, -2]
 
km = c `andThen` \cRow ->
c `andThen` \cCol -|> andThen
if abs(cRow) == abs(cCol) then [] else [(\cRow,cCol)] ->
c
|> andThen
(\cCol ->
if abs(cRow) == abs(cCol) then [] else [(cRow,cCol)]
)
)
 
jumps = List.map (\(kmRow,kmCol) -> (kmRow + stRow, kmCol + stCol)) km
Line 2,625 ⟶ 2,644:
 
bestMove : Model -> Maybe Cell
bestMove model =
case List.head (model.path) of
Nothing -> Nothing
Line 2,633 ⟶ 2,652:
update msg model =
let mo = case msg of
SetStart start ->
{model | path = [start]}
Tick tposix ->
case model.path of
[] -> model
Line 2,645 ⟶ 2,664:
 
subscriptions : Model -> Sub Msg
subscriptions _ =
Time.every (dt * second)10 Tick
 
main =
element
program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}</lang>
 
 
Link to live demo: http://dc25.github.io/knightsTourElm/
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.