102 lines
3.5 KiB
Plaintext
102 lines
3.5 KiB
Plaintext
* Balanced brackets 28/04/2016
|
|
BALANCE CSECT
|
|
USING BALANCE,R13 base register and savearea pointer
|
|
SAVEAREA B STM-SAVEAREA(R15)
|
|
DC 17F'0'
|
|
STM STM R14,R12,12(R13)
|
|
ST R13,4(R15)
|
|
ST R15,8(R13)
|
|
LR R13,R15 establish addressability
|
|
LA R8,1 i=1
|
|
LOOPI C R8,=F'20' do i=1 to 20
|
|
BH ELOOPI
|
|
MVC C(20),=CL20' ' c=' '
|
|
LA R1,1
|
|
LA R2,10
|
|
BAL R14,RANDOMX
|
|
LR R11,R0 l=randomx(1,10)
|
|
SLA R11,1 l=l*2
|
|
LA R10,1 j=1
|
|
LOOPJ CR R10,R11 do j=1 to 2*l
|
|
BH ELOOPJ
|
|
LA R1,0
|
|
LA R2,1
|
|
BAL R14,RANDOMX
|
|
LR R12,R0 m=randomx(0,1)
|
|
LTR R12,R12 if m=0
|
|
BNZ ELSEM
|
|
MVI Q,C'[' q='['
|
|
B EIFM
|
|
ELSEM MVI Q,C']' q=']'
|
|
EIFM LA R14,C-1(R10) @c(j)
|
|
MVC 0(1,R14),Q c(j)=q
|
|
LA R10,1(R10) j=j+1
|
|
B LOOPJ
|
|
ELOOPJ BAL R14,CHECKBAL
|
|
LR R2,R0
|
|
C R2,=F'1' if checkbal=1
|
|
BNE ELSEC
|
|
MVC PG+24(2),=C'ok' rep='ok'
|
|
B EIFC
|
|
ELSEC MVC PG+24(2),=C'? ' rep='? '
|
|
EIFC XDECO R8,XDEC i
|
|
MVC PG+0(2),XDEC+10
|
|
MVC PG+3(20),C
|
|
XPRNT PG,26
|
|
LA R8,1(R8) i=i+1
|
|
B LOOPI
|
|
ELOOPI L R13,4(0,R13)
|
|
LM R14,R12,12(R13)
|
|
XR R15,R15 set return code to 0
|
|
BR R14 -------------- end
|
|
CHECKBAL CNOP 0,4 -------------- checkbal
|
|
SR R6,R6 n=0
|
|
LA R7,1 k=1
|
|
LOOPK C R7,=F'20' do k=1 to 20
|
|
BH ELOOPK
|
|
LR R1,R7 k
|
|
LA R4,C-1(R1) @c(k)
|
|
MVC CI(1),0(R4) ci=c(k)
|
|
CLI CI,C'[' if ci='['
|
|
BNE NOT1
|
|
LA R6,1(R6) n=n+1
|
|
NOT1 CLI CI,C']' if ci=']'
|
|
BNE NOT2
|
|
BCTR R6,0 n=n-1
|
|
NOT2 LTR R6,R6 if n<0
|
|
BNM NSUP0
|
|
SR R0,R0 return(0)
|
|
B RETCHECK
|
|
NSUP0 LA R7,1(R7) k=k+1
|
|
B LOOPK
|
|
ELOOPK LTR R6,R6 if n=0
|
|
BNZ ELSEN
|
|
LA R0,1 return(1)
|
|
B RETCHECK
|
|
ELSEN SR R0,R0 return(0)
|
|
RETCHECK BR R14 -------------- end checkbal
|
|
RANDOMX CNOP 0,4 -------------- randomx
|
|
LR R3,R2 i2
|
|
SR R3,R1 ii=i2-i1
|
|
L R5,SEED
|
|
M R4,=F'1103515245'
|
|
A R5,=F'12345'
|
|
SRDL R4,1 shift to improve the algorithm
|
|
ST R5,SEED seed=(seed*1103515245+12345)>>1
|
|
LR R6,R3 ii
|
|
LA R6,1(R6) ii+1
|
|
L R5,SEED seed
|
|
LA R4,0 clear
|
|
DR R4,R6 seed//(ii+1)
|
|
AR R4,R1 +i1
|
|
LR R0,R4 return(seed//(ii+1)+i1)
|
|
BR R14 -------------- end randomx
|
|
SEED DC F'903313037'
|
|
C DS 20CL1
|
|
Q DS CL1
|
|
CI DS CL1
|
|
PG DC CL80' '
|
|
XDEC DS CL12
|
|
REGS
|
|
END BALANCE
|