きのうの記事に著者さんがくれたコメントを参考に、練習としてもういっこプログラムかいてみた。

数をかく練習なら、ひたすら数をかけばいいじゃない。
こいつの機能は、上下キーで数字が上下;左右キーで移動(赤いのが編集中の数字);スペースキーで編集中の数字が0になる、というもの。何かの役に立つの? 知るか!
かき始めたときプログラムの目標は「座標と数字を指定してその数字を出す」ってだけだったんだけれど、いつの間にか外部入力まで受け付けるようになってた。とくに頭をひねった上下左右まわりを抜き出すとこう。

while 1 
    #上
    if (pre_up = 0) * (now_up = 1)
        letter(y, x, 0)
        number -> number + 1
        if number >= 10
            number -> 0
        number_save(y, x, number)
        letter(y, x, 996666)
        number_save(y, x, number)
    pre_up -> now_up
    #右
    if (pre_right = 0) * (now_right = 1)
        letter(y, x, 669966)
        x -> x + 1
        if (x >= 20) * (y = 15)
            x -> 19
        if (x >= 20) * (y <= 14)
            y -> y + 1 x -> 0
        letter(y, x, 996666)
        number -> memory[10000 + (y * 20) + x]
        number_save(y, x, number)
    pre_right -> now_right
def number_save(y, x, number)
    memory[10000 + (y * 20) + x] -> number
def letter(y, x, color)
    a -> memory[10000 + (y * 20) + x] #A
    memory[0] -> 60000 + (100 * (y * 6)) + (x * 5)
    z -> - memory[0] + 1
    if a = 0
        letter_2(1, 2, 100, 103, 200, 203, 300, 303, 401, 402, z, color)
    if a = 1
        letter_2(2, 101, 102, 202, 302, 401, 402, 403, z, z, z, color)
    {9まで}
def letter_2(a, b, c, d, e, f, g, h, i, j, k, l)
    memory[memory[0] + a] -> l
    memory[memory[0] + b] -> l
    {kまで}
    memory[0] -> 0
    memory[1] -> 0 

数字を変更したら memory[10000]~[10319] に記録(number_save)し、表示するときには「現在の座標の数値を memory[10000]~[10319] から引っ張ってくる(A)」→「数値ごとのドットパターンを letter_2 へ送る」という作り。苦労したのは記録のタイミングと、部分プログラム letter にある z に関すること。数字によって使うドット数が違うので、余った letter_2 内の k などが邪魔になる。そんならその変数はとりあえず memory[1] に放り込んじまえ、という発想。

プログラムを短くする作業というのは基本的に 2a + 2b を 2(a + b) にするとか、あるいは 1024a + b を c = 1024, ac + b にするものだと感じる。そういう作業って片付けに似てて結構好き。