Skip to content

Instantly share code, notes, and snippets.

@jooyunghan
Created September 16, 2015 16:03
Show Gist options
  • Save jooyunghan/f818437fca9024964468 to your computer and use it in GitHub Desktop.
Save jooyunghan/f818437fca9024964468 to your computer and use it in GitHub Desktop.
import Graphics.Collage exposing (filled, rect, collage, toForm)
import Graphics.Element exposing (image, beside, below, above, empty, Element, spacer, color)
import Graphics.Input exposing (customButton, button)
import Color exposing (red, yellow)
import Signal exposing ((<~))
import Markdown
off_bulb = collage 30 30 [
toForm (image 28 28 "data:image/jpeg;base64,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")
]
on_bulb = collage 30 30 [
toForm (image 28 28 "data:image/jpeg;base64,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")
]
type alias Switch = {row:Int, col:Int}
type Click = Reset | Toggle Switch
click : Signal.Mailbox Click
click = Signal.mailbox Reset
switch_up = collage 30 30 [toForm (image 20 20 "http://www.rw-designer.com/icon-image/10454-128x128x32.png")]
switch_hover = collage 30 30 [toForm (image 22 22 "http://www.rw-designer.com/icon-image/10455-128x128x32.png")]
switch_down = collage 30 30 [toForm (image 20 20 "http://www.rw-designer.com/icon-image/10456-128x128x32.png")]
switch : {row:Int, col:Int} -> Element
switch link = customButton (Signal.message click.address (Toggle link)) switch_up switch_hover switch_down
isOdd n = n % 2 == 1
isEven n = n % 2 == 0
-- model
type alias Cell = {row:Int, col:Int, on:Bool, target:Bool}
type alias Model = List (List Cell)
input = {n=5, on=[(0,4), (1,0)]}
model {n,on} =
List.foldl (\(row,col) model -> target (row*2+1) (col*2+1) model) (List.map (\row -> make_row row n) [1 .. 3]) on
make_row row cols = List.map (\col -> {row=row, col=col, on=False, target=False }) [1 .. (cols*2+1)]
model0 = model input
toggle : Int -> Int -> Model -> Model
toggle row col model =
List.map (\line -> List.map (\cell -> if .row cell == row && .col cell == col then {cell | on <- not (.on cell)} else cell) line ) model
target : Int -> Int -> Model -> Model
target row col model =
List.map (\line -> List.map (\cell -> if .row cell == row && .col cell == col then {cell | target <- True} else cell) line ) model
app_state = {model=model, count=0}
-- view
view model =
Markdown.toElement markdown
`above`
List.foldl above empty (List.map view_line model)
`above`
spacer 20 20
`above`
button (Signal.message click.address Reset) "Reset"
view_line line =
List.foldl beside empty (List.map view_cell line)
view_cell {row,col,on,target} =
if | isOdd row && isOdd col ->
let bulb = if on then on_bulb else off_bulb
in if target then color yellow bulb else bulb
| isEven row && isEven col -> spacer 30 30
| otherwise -> switch {row=row, col=col}
markdown = """
# 전구 켜기
각 전구들 사이에 있는 스위치는 이웃한 전구 두 개를 켜거나 끌 수 있다.
노란 테두리로 표시된 전구들만 모두 켜려면 스위치를 최소한 몇번 눌러야 할까?
"""
-- update
step click model =
case click of
Reset -> model0
Toggle {row,col} ->
if | isOdd row && isEven col -> toggle row (col+1) (toggle row (col-1) model)
| isEven row && isOdd col -> toggle (row-1) col (toggle (row+1) col model)
| otherwise -> model
main = view <~ Signal.foldp step model0 click.signal
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment