Created
          September 16, 2015 16:03 
        
      - 
      
- 
        Save jooyunghan/f818437fca9024964468 to your computer and use it in GitHub Desktop. 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | 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