素因数分解(04/30追記・訂正)
65535以下の入力に対し、素因数分解をするプログラム
ゲームボーイのニモニックで書いてみた。
(GBプログラミングって普通Cか何かでやるらしいけど、ニモニック直書き楽しいれす(^q^)
画面描写については興味がなく、勉強してないので、サブルーチンを呼び出すことでごまかしてる。
素直な方針でやったので、どれくらい時間がかかるとかは特に考えていない。
ということで以下。全74byte。70byteに改良。
ゲームボーイのニモニックで書いてみた。
(GBプログラミングって普通Cか何かでやるらしいけど、ニモニック直書き楽しいれす(^q^)
画面描写については興味がなく、勉強してないので、サブルーチンを呼び出すことでごまかしてる。
素直な方針でやったので、どれくらい時間がかかるとかは特に考えていない。
ということで以下。
HLに入力された値が入ってる
前回からの変更
・HLが0001hかどうかの判定法(-4byte)
・HL/aが割り切れたあとの処理(時短)
1000 CB 45 bit 0,l
1002 20 0B jr nz,100F
1004 3E 02 ld a,02
1006 CD xx yy call yyxx #aを出力し改行
1009 CB 3C srl h
100B CB 1D rr l
100D 18 F1 jr 1000
100F 06 03 ld b,03
1011 7D ld a,l
1012 3D dec a
1013 B4 or h
1014 C9 ret z
1015 E5 push HL
1016 E1 pop HL
1017 E5 push HL
1018 78 ld a,b
1019 CD C1 16 call 1035 #HL=HL/a、a=mod(HL,a)
101C B7 or a
101D 20 07 jr nz,1026
101F 78 ld a,b
1020 ED xx yy call yyxx
1023 D1 pop de #スタック合わせ
1024 18 02 jr 1011
1026 04 inc b
1027 04 inc b
1028 7C ld a,h
1029 B7 or a
102A 20 EA jr nz,1016
102C 7D ld a,l
102D B8 cp b
102E 30 E6 jr nc,1016
1030 E1 pop HL
1031 CD pp qq call qqpp #HLを出力し改行
1034 C9 ret
1035 16 10 ld d,10
1037 5F ld e,a
1038 AF xor a
1039 29 add hl,hl
103A 17 rla
103B 38 03 jr c,1040
103D BB cp e
103E 38 02 jr c,1042
1040 93 sub e
1041 2C inc l
1042 15 dec d
1043 20 F4 jr nz,1039
1045 C9 ret
旧
1000 CB 45 bit 0,l
1002 20 0B jr nz,100F
1004 3E 02 ld a,02
1006 CD xx yy call yyxx #aを出力し改行
1009 CB 3C srl h
100B CB 1D rr l
100D 18 F1 jr 1000
100F 7C ld a,h
1010 B7 or a
1011 20 04 jr nz,1017
1013 3E 01 ld a,01
1015 BD cp l
1016 C9 ret z
1017 06 03 ld b,03
1019 E5 push HL
101A E1 pop HL
101B E5 push HL
101C 78 ld a,b
101D CD C1 16 call 1039 #HL=HL/a、a=mod(HL,a)
1020 B7 or a
1021 20 07 jr nz,102A
1023 78 ld a,b
1024 ED xx yy call yyxx
1027 C1 pop bc #スタック合わせ
1028 18 E5 jr 100F
102A 04 inc b
102B 04 inc b
102C 7C ld a,h
102D B7 or a
102E 20 EA jr nz,101A
1030 7D ld a,l
1031 B8 cp b
1032 30 E6 jr nc,101A
1034 E1 pop HL
1035 CD pp qq call qqpp #HLを出力し改行
1038 C9 ret
1039 16 10 ld d,10
103B 5F ld e,a
103C AF xor a
103D 29 add hl,hl
103E 17 rla
103F 38 03 jr c,1044
1041 BB cp e
1042 38 02 jr c,1046
1044 93 sub e
1045 2C inc l
1046 15 dec d
1047 20 F4 jr nz,103D
1049 C9 ret
前回からの変更
・HLが0001hかどうかの判定法(-4byte)
・HL/aが割り切れたあとの処理(時短)
1000 CB 45 bit 0,l
1002 20 0B jr nz,100F
1004 3E 02 ld a,02
1006 CD xx yy call yyxx #aを出力し改行
1009 CB 3C srl h
100B CB 1D rr l
100D 18 F1 jr 1000
100F 06 03 ld b,03
1011 7D ld a,l
1012 3D dec a
1013 B4 or h
1014 C9 ret z
1015 E5 push HL
1016 E1 pop HL
1017 E5 push HL
1018 78 ld a,b
1019 CD C1 16 call 1035 #HL=HL/a、a=mod(HL,a)
101C B7 or a
101D 20 07 jr nz,1026
101F 78 ld a,b
1020 ED xx yy call yyxx
1023 D1 pop de #スタック合わせ
1024 18 02 jr 1011
1026 04 inc b
1027 04 inc b
1028 7C ld a,h
1029 B7 or a
102A 20 EA jr nz,1016
102C 7D ld a,l
102D B8 cp b
102E 30 E6 jr nc,1016
1030 E1 pop HL
1031 CD pp qq call qqpp #HLを出力し改行
1034 C9 ret
1035 16 10 ld d,10
1037 5F ld e,a
1038 AF xor a
1039 29 add hl,hl
103A 17 rla
103B 38 03 jr c,1040
103D BB cp e
103E 38 02 jr c,1042
1040 93 sub e
1041 2C inc l
1042 15 dec d
1043 20 F4 jr nz,1039
1045 C9 ret
旧
1000 CB 45 bit 0,l
1002 20 0B jr nz,100F
1004 3E 02 ld a,02
1006 CD xx yy call yyxx #aを出力し改行
1009 CB 3C srl h
100B CB 1D rr l
100D 18 F1 jr 1000
100F 7C ld a,h
1010 B7 or a
1011 20 04 jr nz,1017
1013 3E 01 ld a,01
1015 BD cp l
1016 C9 ret z
1017 06 03 ld b,03
1019 E5 push HL
101A E1 pop HL
101B E5 push HL
101C 78 ld a,b
101D CD C1 16 call 1039 #HL=HL/a、a=mod(HL,a)
1020 B7 or a
1021 20 07 jr nz,102A
1023 78 ld a,b
1024 ED xx yy call yyxx
1027 C1 pop bc #スタック合わせ
1028 18 E5 jr 100F
102A 04 inc b
102B 04 inc b
102C 7C ld a,h
102D B7 or a
102E 20 EA jr nz,101A
1030 7D ld a,l
1031 B8 cp b
1032 30 E6 jr nc,101A
1034 E1 pop HL
1035 CD pp qq call qqpp #HLを出力し改行
1038 C9 ret
1039 16 10 ld d,10
103B 5F ld e,a
103C AF xor a
103D 29 add hl,hl
103E 17 rla
103F 38 03 jr c,1044
1041 BB cp e
1042 38 02 jr c,1046
1044 93 sub e
1045 2C inc l
1046 15 dec d
1047 20 F4 jr nz,103D
1049 C9 ret
コメント
コメントの投稿
トラックバック