DOCTYPE html> how i won the 2019 apl problem solving competition
    ┌────────┐     ┌────────────────────────────────────────────────────┐
    │ title  ├─────┤ how i won the 2019 apl problem solving competition │
    └────────┘     └────────────────────────────────────────────────────┘

    ┌────────┐     ┌────────────────────────────────────────────────────┐
    │ by     ├─────┤ jamin wu                                           │
    └────────┘     └────────────────────────────────────────────────────┘

    ┌───────────┐     ┌─────────────────────────────────────────────────┐
    │ thank you ├──┬──┤ Dyalog!                                         │
    └───────────┘  │  └─────────────────────────────────────────────────┘
                   │
                   │  ┌───────────────────────┐     ┌───────────────────┐
                   ├──┤ competition sponsors  ├──┬──┤ Fiserv            │
                   │  └───────────────────────┘  │  └───────────────────┘
                   │                             │
                   │                             │  ┌───────────────────┐
                   │                             └──┤ SimCorp           │
                   │                                └───────────────────┘
                   │
                   │  ┌─────────────────────────────────────────────────┐
                   └──┤ competition organisers & writers                │
                      └─────────────────────────────────────────────────┘
            

contents

01/13

┌────────────────────┐ ┌──────────────────────────────┐
│ contents           ├┬┤ background                   │
└────────────────────┘│└──────────────────────────────┘
                      │┌──────────────────────────────┐ ┌──────┬─────────────────────────┐
                      ├┤ problems                     ├┬┤ E1.1 │ Cooking on the Grille   │
                      │└──────────────────────────────┘│└──────┴─────────────────────────┘
                      │                                │┌──────┬─────────────────────────┐
                      │                                ├┤ E1.3 │ When in Prison...       │
                      │                                │└──────┴─────────────────────────┘
                      │                                │┌──────┬─────────────────────────┐
                      │                                ├┤ E3.3 │ Watch Out for that Mine │
                      │                                │└──────┴─────────────────────────┘
                      │                                │┌──────┬─────────────────────────┐
                      │                                ├┤ M2.1 │ Trapezoid Rule          │
                      │                                │└──────┴─────────────────────────┘
                      │                                │┌──────┬─────────────────────────┐
                      │                                ├┤ M2.3 │ Romberg's Method        │
                      │                                │└──────┴─────────────────────────┘
                      │                                │┌──────┬─────────────────────────┐
                      │                                ├┤ D3.1 │ Construction & Unfold.. │
                      │                                │└──────┴─────────────────────────┘
                      │                                │┌──────┬─────────────────────────┐
                      │                                └┤ D3.2 │ Twist & Shout           │
                      │                                 └──────┴─────────────────────────┘
                      │┌──────────────────────────────┐ ┌────────────────────────────────┐
                      └┤ reflection                   ├┬┤ good things                    │
                       └──────────────────────────────┘│└────────────────────────────────┘
                                                       │┌────────────────────────────────┐
                                                       └┤ thoughts                       │
                                                        └────────────────────────────────┘
                

background

02/13

┌──────────────────────┐ ┌──────────────────────┐
│ studying             ├┬┤ med @ Monash (AU)    │
└──────────────────────┘│└──────────────────────┘
                        │┌──────────────────────┐
                        └┤ hobby programmer     │
                         └──────────────────────┘
┌──────────────────────┐ ┌──────────────────────┐
│ languages            ├┬┤ python               │
└──────────────────────┘│└──────────────────────┘
                        │┌──────────────────────┐
                        └┤ elm                  │
                         └──────────────────────┘
┌──────────────────────┐ ┌──────────────────────┐
│ preferences          ├┬┤ static types         │
└──────────────────────┘│└──────────────────────┘
                        │┌──────────────────────┐
                        ├┤ functional           │
                        │└──────────────────────┘
                        │┌──────────────────────┐
                        └┤ emacs + evil         │
                         └──────────────────────┘
┌──────────────────────┐ ┌──────────────────────┐
│ intro to apl/j/k     ├┬┤ project euler forums │
└──────────────────────┘│└──────────────────────┘
                        │┌──────────────────────┐
                        ├┤ news aggregators     │
                        │└──────────────────────┘
                        │┌──────────────────────┐
                        └┤ game of life video   │
                         └──────────────────────┘
                

E1.1 - Cooking on the Grille

03/13

Define Grille which takes a left argument grille and a right argument character grid and returns the hidden message corresponding to positions of spaces in the grille, e.g.
    grille grid
┌──────┬──────┐
│##### │ESVWGT│
│#### #│HOWTHZ│
│# # # │HIVSAI│
│## ###│CASSAC│
│ ## ##│FAAUCM│
│ #####│NYMPCE│
└──────┴──────┘

    grille Grille grid
THISISFUN
                        
      ┌──────┐
      │grille├──→  ∊ ──→  ' '=  ──┐
      └──────┘                    ↓      ┌─────────┐
                                  /  ──→ │ message │
      ┌──────┐                    ↑      └─────────┘
      │ grid ├──→  ∊  ────────────┘
      └──────┘
                        

Grille←{(' '=∊⍺)/∊⍵}

E1.3 - When in Prison, Do as the Prisoners Do

04/13

Define TapEnc and TapDec which converts between a message and a tap encoding as defined by the following polybius square:

1 2 3 4 5
1 A B C D E
2 F G H I/J K
3 L M N O P
4 Q R S T U
5 V W X Y Z

(I/J both map to the same encoding. When decoding, always produce I instead of J.) e.g.
        TapEnc 'APL'
* * *** ***** *** *

        TapDec '* * *** ***** *** *'
APL
TapEnc ──────────→

        TapLocate              TapKnocks                    Render
┌─────────┐    ┌──────────────────┐   ┌──────────────────────┐    ┌─────────────────┐
│ message ├────┤ alphabet indices ├───┤ polybius coordinates ├────┤ rendered knocks │
└─────────┘    └──────────────────┘   └──────────────────────┘    └─────────────────┘
        TapLocate⍣¯1          TapKnocks⍣¯1                   Parse

                                                               ←────────────── TapDec


TapAlpha←'ABCDEFGHIKLMNOPQRSTUVWXYZJ'
TapKnocks←↓∘⍉1+5 5⊤-∘1
TapLocate←(⊢-(17×∘⌊26÷⍨⊢))(TapAlpha∘⍳)

Render←' '(1↓∘∊,¨)'*'/⍨¨∊
TapEnc←Render TapKnocks∘TapLocate

Parse←(⍴∘1 0∘≢⊂⊢)(≢¨' '∘(≠⊆⊢))
TapDec←(TapKnocks∘TapLocate⍣¯1)Parse

E3.3 Watch Out for That Mine!

05/13

Define MakeMines which takes a left argument number of mines and a right argument board size and returns a random minesweeper board, and define CountMines which fills non-mine cells with a number indicating how many mines surround it, e.g.
      ⊢ board ← 11 MakeMines 5 8
¯1  0 0  0 ¯1  0 ¯1 0
 0  0 0 ¯1 ¯1  0  0 0
¯1 ¯1 0  0  0 ¯1  0 0
¯1 ¯1 0  0  0  0  0 0
 0  0 0  0  0  0 ¯1 0

      CountMines board
¯1  1 1  3 ¯1  3 ¯1 1
 3  3 2 ¯1 ¯1  4  2 1
¯1 ¯1 3  2  3 ¯1  1 0
¯1 ¯1 2  0  1  2  2 1
 2  2 1  0  0  1 ¯1 1
                        
┌────────────┐
│no. of mines├┐
└────────────┘│
              └→┌───────────┐
                │   ⍺?×/⍵   ├┐
              ┌→└───────────┘└→┌───────┐                   ┌──────────────┐
              │                │  ¯1@  ├┐                ┌→│{1++/|∊⍵}⌺3 3 ├─┐
┌─────┐       │ ┌───────────┐┌→└───────┘└→┌───┐  ┌─────┐ │ └──────────────┘ └→┌───┐   ┌─────┐
│shape├───────┴→│ ⍴∘0∘(×/)  ├┘            │ ⍴ │  │board├─┤                    │ × ├──→│ -∘1 │
└──┬──┘         └───────────┘           ┌→└───┘  └─────┘ │ ┌───┐            ┌→└───┘   └─────┘
   │                                    │                └→│0∘=├────────────┘
   └────────────────────────────────────┘                  └───┘
                        

 MakeMines←{⍵∘⍴¯1@(⍺?×/⍵)⍴∘0∘(×/)⍵}
 CountMines←-∘1({1++/|∊⍵}⌺3 3)×0∘=
                       
                    

E2.1 Trapezoid Rule

06/13

                  ┌────────┐
             ┌───→│ coeffs ├─────┐
             │    └────────┘     │
             │                   │
    ┌───┐    ├───→┌───────┐      │
    │ n ├────┤    │   Δx  ├──────┤
    └───┘    ├───→└───┬───┘      │   ┌───────────────────────────────────────┐
             │        ↓          ├──→│ (Δx÷2) × +/ ( coeffs × f  x₀ ... xn ) │
    ┌─────┐  ├───→┌───┴───────┐  │   └───────────────────────────────────────┘
    │ a b ├──┤    │ x₀ ... xn ├──┤
    └─────┘  └───→└───────────┘  │
                                 │
    ┌───┐                        │
    │ f ├────────────────────────┘
    └───┘
                        

Trapezoid←{
     Coeffs←1⌽¯2↓1 1,2⍴⍨1+⊢
     Width←-(-/⊢)÷⊣
     Intervals←{(2⊃⍵),⍨(⊃⍵)+(⍺ Width ⍵)×(⍳⍺)-1}
     (2÷⍨⍺ Width ⍵)×+/(Coeffs ⍺)×⍺⍺ ⍺ Intervals ⍵
 }
                       
                    

E2.3 Romberg's Method

07/13