z80 golf(5)
他の問題も片っ端から記録を塗り替えてやろうと挑戦してみた。
・Rule 30
http://golf.shinh.org/p.rb?Rule+30
Koderaさんのところのソース*1をパクって参考にしてトップを塗り替えて25Bにはなったが、内容は全くわかってない。ごめん。
以下のように、JP NZ,8000H の 8000H は、time outにならない程度に小さな値で構わないので意味のあるコード埋め込んで、ここを利用するが合理的である。ここでは、76h(halt)を埋め込む。
XOR A
CALL 8003H
RR B
BIT 6,B
JR NZ,HALTLABEL+2
RRA
RL C
LD A,C
DEC A
AND 4
LD A,' '
PUSH DE
HALTLABEL:
JP NZ,7600H
LD A,'#'
・chemical equation
http://golf.shinh.org/p.rb?chemical+equation
同じくKoderaさんのソース*2を書き換えて3バイト縮めて67B。
ソースは以下のような感じになった。tbltbl(テーブルのテーブル)の値がうまい命令になるようにテーブル(tbl1,tbl2,tble3)を移動させたり、スキャン方向を逆順にしたり大変だった。あと、rra(右ローテイト)でそのまま終了判定が出来るように文字列コードは 2倍してある。
tbltbl:
db tbl1,tbl2,tbl3,tbl3db 21,158,100,144,100,124,90,100,158,86,100,144,100
tbl1:call 8003h
and 3ld l,a
ld l,(hl)
loop:
dec hl
ld a,(hl)
rra
call 8000h
jr nc,loop
haltdb 21,158,206,154,100,124,90,100,158,86,206,154,100
tbl2:
db 21,158,100,144,100,86,100,158,134
db 104,124,90,100,158,106,86,100,144,100,134,100
tbl3:
・delete blank lines
http://golf.shinh.org/p.rb?delete+blank+lines
どうにか、トップと同じ14B達成。8000hにfall throughするコードにしていたらtime outになるので参った。私はこの手の文字列操作は苦手だ。
・even lines
http://golf.shinh.org/p.rb?even+lines
・odd lines
http://golf.shinh.org/p.rb?odd+lines
ちょっと考えたが、トップの13バイトにならない。ySasさんによると*3
even lines と odd lines は自己書き換えがきれいに填っていい感じに。
こりゃ簡単には無理ぽ…。