Skip to content

Instantly share code, notes, and snippets.

@bakenezumi
Last active September 23, 2018 12:33
Show Gist options
  • Save bakenezumi/83380d7a6b15effdc74eb6c3c0484e1d to your computer and use it in GitHub Desktop.
Save bakenezumi/83380d7a6b15effdc74eb6c3c0484e1d to your computer and use it in GitHub Desktop.

EXAPUNKS最適化Tips

  1. ファイルは1サイクルで2項目読める

    Before(2 cycle)

    COPY F X
    ADDI X F X
    

    After(1 cycle)

    ADDI F F X
    

    Mは無理

  2. 繰り返し回数が決まっている場合はインラインで

    Before(13 cycle)

    COPY * Mは2cycle

    COPY 3 T
    MARK LOOP
     COPY F M
     SUBI T 1 T
    TJMP LOOP
    

    After(6 cycle)

    COPY F M
    COPY F M
    COPY F M
    
  3. ループ終了判定を外に出して殺させる

    Before(7 * X + 1 cycle)

    COPY X T
    MARK LOOP
     COPY F M
     COPY F M
     SEEK 2
     SUBI T 1 T
    TJMP LOOP
    

    After(6 * X + 3 cycle)

    COPY X T
    REPL KILLER
    NOOP
    MARK LOOP
     COPY F M
     COPY F M
     SEEK 2
    JUMP LOOP
    
    MARK KILLER
     NOOP
     NOOP
     NOOP
     NOOP
     SUBI T 1 T
    TJMP KILLER
    KILL
    

    次の処理に移る前に殺すのがポイント

  4. 2個づつ処理

    Before(4 * X + 1 cycle)

    COPY X T
    MARK LOOP
     COPY F M
     SUBI T 1 T
    TJMP LOOP
    

    After(6 * X / 2 + 6 cycle)

    MODI X 2 T
    FJMP EVEN
    COPY F M
    MARK EVEN
    SUBI X T T
    MARK LOOP
     COPY F M
     COPY F M
     SUBI T 2 T
    TJMP LOOP
    
  5. 行数の許す限りまとめて処理

    Before(4 * X + 1 cycle)

    COPY X T
    MARK LOOP
     COPY F M
     SUBI T 1 T
    TJMP LOOP
    

    After(28 * (X / 13) + 4 * (X mod 13) + 2 cycle)

    13個まとめる場合の例

    DIVI X 13 T
    MARK LOOP1
     @REP 13
     COPY F M
     @END
     SUBI T 1 T
    TJMP LOOP1
    MODI X 13 T
    MARK LOOP
     COPY F M
     SUBI T 1 T
    TJMP LOOP
    
  6. 通信するより持って歩いたほうが速い場合もある

    Before(3 * N + 3 cycle)

    REPL RECV
    MARK SEND_LOOP
     COPY #IN M
    JUMP SEND_LOOP
    
    MARK RECV
    LINK 800
    LINK 800
    MARK RECV_LOOP
     COPY M #OUT
    JUMP RECV_LOOP
    

    After(N + 4 cycle)

    MARK WALKER
    REPL WALKER
    COPY #IN X
    LINK 800
    LINK 800
    COPY X #OUT
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment