|
@@ -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
|
|
|
+ }
|
|
|
+
|
|
|
+
|