2^n

 


Написал от скуки программу, которая считает степени двойки:

r$="1"
OpenConsole()
For k=0 To 42
  
;Debug Str(k)+":"+ReverseString(r$)
PrintN(Str(k)+":"+ReverseString(r$))
  
  d2=0
  t$=""
  For n=1 To Len(r$)
    dd=Val( Mid( r$,n,1 ) )*2+d2
    t$=t$+Str(dd%10)
    d2=Int(dd/10)
  Next n
  If d2
    t$=t$+Str(d2)
  EndIf
  r$=t$
Next k
Input()
CloseConsole()


На следующий день написал программу для zx, вышло 104 байта без учета костыля для sjasmplus


device zxspectrum128
        ORG #6000
begin

;костылек ужясма
  LD            HL ,$5CB6
  LD            ($5C4F),HL
  LD            DE ,$15AF
  LD            BC ,$0015
  EX            DE ,HL
  LDIR
  EX            DE ,HL
  DEC           HL
  LD            ($5C57),HL
  INC           HL
  LD            ($5C53),HL
  LD            ($5C4B),HL
  LD            (HL)  ,$80
  INC           HL
  LD            ($5C59),HL;E-LINE
;2
 ld hl,$15C6
 ld de,$5C10
 ld bc,$0E
 ldir
;открытие потока
 ld a,2
 call $1601
ld a,22
rst 10h
xor a;ld a,2
rst 10h
; ld a,2
rst 10h
ei
;-------------------------------------------------------------------------
mm equ $8000
;zero memory
ld hl,mm
ld de,mm+1
ld bc,16383
ld (hl),0
ldir
;2^0=1
ld a,$31,(mm),a
xor a
; jr $
clp:
push af
ld c,a,b,0
call 6683
ld a,":"
rst 10h
;print string
ld hl,mm-1
fz: ;find zero
inc hl
ld a,(hl)
or a
jr nz,fz
push hl
ld de,mm
or a:sbc hl,de
ld bc,hl
pop hl
ld de,prs
push bc
dec hl
rs: ;reverse string
ld a,(hl)
ld (de),a
dec hl
inc de
dec bc
ld a,b:or c:jr nz,rs

ld de,prs
pop bc
    call 8252           ; print our string,DE=adr,BC=len
    ld a,13
    rst 16
;*2
ld d,0
ld hl,mm
m2: ;*2
ld a,(hl)
sub $30
add a,a
add a,d
ld d,-1
d10: ;/10
inc d
sub 10
jr nc, d10
add a,10+$30
ld (hl),a
inc hl
ld a,(hl)
or a
jr nz,m2
ld a,d
or a
jr z,nocy
add a,$30
ld (hl),a
nocy:
pop af
inc a
cp 43
jp nz,clp
jr $
prs:
end
display /d,end-begin
savesna "power2.sna",begin


Простой алгоритм, и после вечерней прогулки я решил сократить прогу до 64 байт:

device zxspectrum128
        ORG #6000
begin
;-------------------------------------------------------------------------
c_b:
;2^0=1
ld a,$31,($BFFF),a
xor a
ld bc,1
clp:
push af
push bc
ld hl,$C000
or a
sbc hl,bc
; push hl
ex de,hl
    call 8252           ; print our string,DE=adr,BC=len
;    jr $
    ld a,13
    rst 16
;*2
ex de,hl
dec hl
ld de,$30
; pop hl
; ld hl,$bfff
pop bc
push bc
m2: ;*2
ld a,(hl)
sub e;$30
add a,a
add a,d
ld d,-1
d10: ;/10
inc d
sub 10
jr nc, d10
add a,10+$30
ld (hl),a
dec hl
dec bc
ld a,b
or c
jr nz,m2
pop bc
ld a,d
or a
jr z,nocy
inc bc
add a,e;$30
ld (hl),a
nocy:
pop af
inc a
; cp 43
; ret z
jr nz,clp
ret
; jr $
c_e:
end
; display /d,end-begin
display /d,c_e-c_b
savesna "power2.sna",begin
savebin "p2.bin",c_b,c_e-c_b


Победа! Вечерком зашел SerzhSoft и подсократил программу

org #600a
;c=#0a
ld hl,#c001
ld (hl),l
lp1:
ld b,l
lp2:
ld a,(hl)
add a,#30 ;"0"
rst #10
dec l
jr nz,lp2
ld a,#0d
rst #10
lp3:
xor a
lp4:
inc l
ld a,(hl)
adc a,(hl)
ld e,a
sub c ;#0a
ld (hl),a
ccf
jr c,lp4
ld (hl),e
ld a,l
sub b
jr c,lp3
jr lp1

файлы тут


Комментарии