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,tbl3

db 21,158,100,144,100,124,90,100,158,86,100,144,100
tbl1:

call 8003h
and 3

ld l,a
ld l,(hl)
loop:
dec hl
ld a,(hl)
rra
call 8000h
jr nc,loop
halt

db 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 は自己書き換えがきれいに填っていい感じに。

こりゃ簡単には無理ぽ…。