|  | @@ -0,0 +1,100 @@
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +module Collatz exposing (..)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import Html exposing (..)
 | 
	
		
			
				|  |  | +import Html.Events exposing (..)
 | 
	
		
			
				|  |  | +import Html.Attributes exposing (id, class, style)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import Hex
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type alias Model =
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +initModel : Model
 | 
	
		
			
				|  |  | +initModel =
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type Msg
 | 
	
		
			
				|  |  | +    = NoOp
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +box : Int -> List Int -> Html Msg
 | 
	
		
			
				|  |  | +box n p =
 | 
	
		
			
				|  |  | +    let
 | 
	
		
			
				|  |  | +        truval = List.length p
 | 
	
		
			
				|  |  | +        val = round (atan (toFloat truval) * 2670177)
 | 
	
		
			
				|  |  | +        code = "#" ++ (String.padLeft 6 '0' (Hex.toString val))
 | 
	
		
			
				|  |  | +        fore =
 | 
	
		
			
				|  |  | +            if truval < 127 then
 | 
	
		
			
				|  |  | +                "#ffffff"
 | 
	
		
			
				|  |  | +            else
 | 
	
		
			
				|  |  | +                "#000000"
 | 
	
		
			
				|  |  | +    in
 | 
	
		
			
				|  |  | +        div
 | 
	
		
			
				|  |  | +            [ class "box"
 | 
	
		
			
				|  |  | +            , style
 | 
	
		
			
				|  |  | +                [ ("background-color", code)
 | 
	
		
			
				|  |  | +                , ("color", fore)
 | 
	
		
			
				|  |  | +                ]
 | 
	
		
			
				|  |  | +            ]
 | 
	
		
			
				|  |  | +            [ text (toString n) ]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +collatzSteps : Int -> Int
 | 
	
		
			
				|  |  | +collatzSteps n =
 | 
	
		
			
				|  |  | +    let
 | 
	
		
			
				|  |  | +        inner (n, c) =
 | 
	
		
			
				|  |  | +            case n of
 | 
	
		
			
				|  |  | +                1 ->
 | 
	
		
			
				|  |  | +                    (n, c)
 | 
	
		
			
				|  |  | +                _ ->
 | 
	
		
			
				|  |  | +                    if (rem n 2) == 0 then
 | 
	
		
			
				|  |  | +                        inner ((n // 2), (c + 1))
 | 
	
		
			
				|  |  | +                    else
 | 
	
		
			
				|  |  | +                        inner ((n * 3 + 1), (c + 1))
 | 
	
		
			
				|  |  | +        (one, steps) = inner (n, 0)
 | 
	
		
			
				|  |  | +    in
 | 
	
		
			
				|  |  | +        steps
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +collatzPath : Int -> List Int
 | 
	
		
			
				|  |  | +collatzPath n =
 | 
	
		
			
				|  |  | +    let
 | 
	
		
			
				|  |  | +        helper n p =
 | 
	
		
			
				|  |  | +            case n of
 | 
	
		
			
				|  |  | +                1 ->
 | 
	
		
			
				|  |  | +                    (n :: p)
 | 
	
		
			
				|  |  | +                _ ->
 | 
	
		
			
				|  |  | +                    if (rem n 2) == 0 then
 | 
	
		
			
				|  |  | +                        helper (n // 2) (n :: p)
 | 
	
		
			
				|  |  | +                    else
 | 
	
		
			
				|  |  | +                        helper (n * 3 + 1) (n :: p)
 | 
	
		
			
				|  |  | +    in
 | 
	
		
			
				|  |  | +        helper n []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +view : Model -> Html Msg
 | 
	
		
			
				|  |  | +view model =
 | 
	
		
			
				|  |  | +    div
 | 
	
		
			
				|  |  | +        []
 | 
	
		
			
				|  |  | +        <|
 | 
	
		
			
				|  |  | +        List.map (\n -> (box n (collatzPath n))) (List.range 1 777)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +update : Msg -> Model -> (Model, Cmd Msg)
 | 
	
		
			
				|  |  | +update msg model =
 | 
	
		
			
				|  |  | +    ( model, Cmd.none )
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +--subscriptions : Model -> Sub Msg
 | 
	
		
			
				|  |  | +--subscriptions model =
 | 
	
		
			
				|  |  | +--    Sub.batch
 | 
	
		
			
				|  |  | +--        [
 | 
	
		
			
				|  |  | +--        ]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +main =
 | 
	
		
			
				|  |  | +    Html.program
 | 
	
		
			
				|  |  | +        { init = (initModel, Cmd.none)
 | 
	
		
			
				|  |  | +        , view = view
 | 
	
		
			
				|  |  | +        , update = update
 | 
	
		
			
				|  |  | +        , subscriptions = \_ -> Sub.none
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 |