From: Benjamin David Lunt on

"io_x" <a(a)b.c.invalid> wrote in message
news:4ac9886b$0$828$4fafbaef(a)reader5.news.tin.it...
>
>> example n > x.txt
>> entry n > e.txt
>> fc e.txt x.txt
>> where n is a number from 0 to 100
>
> Are you saying that the program "entry n" has to be the same output
> of the "example n" for n from 0 to 100 ?
>
> but where it is written in the rules??

Sorry. The rules may not specifically say that. We have
been doing this for many years, and it has just been a
given. Each compo much pass a test suite of some kind.
We have always had a test suite.

Also, we have had many discussion about the current and
previous compos on the forum and email list. Again,
sorry about that, but we usually don't get many new entrants.

However, I would bet that if you change your code to produce
the same random number as the example, it will pass the test.

Thanks,
Ben


From: io_x on

"io_x" <a(a)b.c.invalid> ha scritto nel messaggio
news:4ac833e4$0$1114$4fafbaef(a)reader1.news.tin.it...


; Costruttore di Labirinti
%define L 25
%define H 10

;%define L 97
;%define H 97

;%define L 10
;%define H 749

%define BytesMemory ((L+1)*(H+2)*6)
%define H21 (2*H+1)

%define sopra (L+1)*6
%define sopra2 (L+1)*3

%define LineareMax 3*((L-1)+2*(L+1)*H)+1
%define passi (LineareMax-sopra-1)/3

org 100h
Start:
; ****************************
; *** Prende il numero with the help by Esra Sdrawkcab
; ****************************
; assumo che ax==0
i=081h|bl=' ' ; punta alla size riga comando
..0: aad 10 ; al+=10*ah e ah=0
ah=al
lodsb|al-=bl
bl='0' ; prima ' ' poi '0'
>=?#.0 ; o un char minore di '0'
al=ah ; ritorna numeri del tipo al:ah=n:n
*seed=a ; inizializza il seed per rand
; 21
; *******************************************
; *** Fa la griglia
; *******************************************
j=arr|c=BytesMemory
al=10|i=&*j+sopra|rep stosb ; tutto 10 [visitato] qui cx=0
j=&*i-sopra2|b=H21 |a="+-"|r="|N" ; le caselle NN: non visitate
..2: c=L ; altrimenti visitate
..3: stosw|B*j=ah|++j|loop .3|stosb|B*j=0Dh|++j|++j ; fa la linea
a<->r|--b#.2 ; passa alla linea successiva
B*j='$'|B*j-sopra2-3=07fh|B*i=02h ; ritorna in si la casella iniziale
; *******************************************
; *** Fa il labirinto
; *******************************************
; suppone all'ingresso che cx==0
; parte dalla casella puntata da si
++i ; punta all'interno della casella, dove c'e' 'N'
..4: W*i=" " ; " " significa visitata
..5: a=*seed|mul W*298 ; rand()
--a|*seed=a
aad 1 ; al=al+ah ed ah=0; valore casuale in al
cl=4 ; le caselle confinanti sono 4
..6: al&=03h ; al=0[sotto],1[alto],2[sinistra],3[destra]
j=a |k=a|b=*muro+j+k ; in bx offset del muro; se bp=2*bx-(al/2)
j>>=1|k=b|k+=b|k-=j ; => in bp offset della prossima casella
B*i+k=='N'#.a ; se tale casella non e' visitata va in .a
++a|loop .6 ; vai alla prossima casella
; ** caso le caselle sono tutte visitate
s>=0FFFEh#.z ; se lo stack e' vuoto esci[ e'in casella iniziale]
pop i ; altrimenti prende la casella precedente
#.5
%if BytesMemory>24000
..e: s=0FFFEh|ret ; nel caso di errore non stampa proprio niente:
; ritorna al DOS
%endif
..a: ; ** caso vi � una casella non visitata
W*i+b=" " ; leva il muro di divisione [ed eventualemente una N]
; che verra' in ogni caso levata dall'istruzione in .4
%if BytesMemory>24000
s<=fine#.e ; lo stack non puo' invadere questo file in memoria
%endif
push i
i+=k
#.4
..z: ; usa la casella iniziale in si e la ritorna
; ******************************
; *** Stampa sullo schermo
; ******************************
r=&*i-sopra2-1|ah=09h|int 21h ; usa si per stampare l'array
ret ; to Dos
align 2
; 0 1 2 3
muro dw sopra2, -sopra2, 2, -1

Section .bss
seed resw 1
arr resb BytesMemory
fine resb 512 ; for to be sure

-----------------
%define L 25
%define H 10

;%define L 97
;%define H 97

;%define L 10
;%define H 749

%define BytesMemory ((L+1)*(H+2)*6)
%define H21 (2*H+1)

%define sopra (L+1)*6
%define sopra2 (L+1)*3

%define LineareMax 3*((L-1)+2*(L+1)*H)+1
%define passi (LineareMax-sopra-1)/3

org 100h
Start:
; ****************************
; *** Prende il numero with the help by Esra Sdrawkcab
; ****************************
; assumo che ax==0
mov si, 081h ; punta a fine riga o spazio
mov bl, ' '
..0: aad 10 ; al+=10*ah e ah=0
mov ah, al
lodsb
sub al, bl
mov bl, '0' ; prima ' ' poi '0'
jge .0 ; o un char minore di '0'
mov al, ah ; ritorna numeri del tipo al:ah=n:n
mov [seed], ax ; inizializza il seed per rand
; 21
; *******************************************
; *** Fa la griglia
; *******************************************
mov di, arr
mov cx, BytesMemory
mov al, 10
lea si, [di+sopra]
rep stosb ; tutto 10 [visitato] qui cx=0
lea di, [si-sopra2]
mov bx, H21
mov ax, "+-"
mov dx, "|N" ; le caselle NN: non visitate
..2: mov cx, L ; altrimenti visitate
..3: stosw
mov byte[di], ah
inc di
loop .3
stosb
mov byte[di], 0Dh
inc di
inc di ; fa la linea
xchg ax, dx
dec bx
jnz .2 ; passa alla linea successiva
mov byte[di], '$'
mov byte[di-sopra2-3], 07fh
mov byte[si], 02h ; ritorna in si la casella iniziale
; *******************************************
; *** Fa il labirinto
; *******************************************
; suppone all'ingresso che ch==0
; parte dalla casella puntata da si
inc si ; punta all'interno della casella, dove c'e' 'N'
..4: mov word[si], " " ; " " significa visitata
..5: mov ax, [seed]
mul word[298] ; rand()
dec ax
mov [seed], ax
aad 1 ; al=al+ah ed ah=0; valore casuale in al
mov cl, 4 ; le caselle confinanti sono 4
..6: and al, 03h ; al=0[sotto],1[alto],2[sinistra],3[destra]
mov di, ax
mov bp, ax
mov bx, [muro+di+bp] ; in bx offset del muro; se bp=2*bx-(al/2)
shr di, 1
mov bp, bx
add bp, bx
sub bp, di ; => in bp offset della prossima casella
cmp byte[si+bp], 'N'
je .a ; se tale casella non e' visitata va in .a
inc ax
loop .6 ; vai alla prossima casella
; ** caso le caselle sono tutte visitate
cmp sp, 0FFFEh
jae .z ; se lo stack e' vuoto esci[ e'in casella
iniziale]
pop si ; altrimenti prende la casella precedente
jmp short .5
%if BytesMemory>24000
..e: mov sp, 0FFFEh
ret ; nel caso di errore non stampa proprio niente:
; ritorna al DOS
%endif
..a: ; ** caso vi � una casella non visitata
; leva il muro di divisione [ed eventualemente una N]
mov word[si+bx], " "
; che verra' in ogni caso levata dall'istruzione in .4
%if BytesMemory>24000
cmp sp, fine
jbe .e ; lo stack non puo' invadere questo file in
memoria
%endif
push si
add si, bp
jmp short .4
..z: ; usa la casella iniziale in si e la ritorna
; ******************************
; *** Stampa sullo schermo
; ******************************
lea dx, [si-sopra2-1]
mov ah, 09h
int 21h ; usa si per stampare l'array
ret
align 2
; 0 1 2 3
muro dw sopra2,-sopra2, 2,-1

Section .bss
seed resw 1
arr resb BytesMemory
fine resb 512 ; for to be sure





From: Benjamin David Lunt on

"io_x" <a(a)b.c.invalid> wrote in message
news:4aca2836$0$1102$4fafbaef(a)reader3.news.tin.it...
>
> "io_x" <a(a)b.c.invalid> ha scritto nel messaggio
> news:4ac833e4$0$1114$4fafbaef(a)reader1.news.tin.it...
>
>

Sorry. Still doesn't pass the test.bat test.

Thanks,
Ben


From: io_x on

"Benjamin David Lunt" <zfysz(a)frontiernet.net> ha scritto nel messaggio
news:%2oym.93874$u76.41064(a)newsfe10.iad...
>
> "io_x" <a(a)b.c.invalid> wrote in message
> news:4ac9886b$0$828$4fafbaef(a)reader5.news.tin.it...
>>
>>> example n > x.txt
>>> entry n > e.txt
>>> fc e.txt x.txt
>>> where n is a number from 0 to 100
>>
>> Are you saying that the program "entry n" has to be the same output
>> of the "example n" for n from 0 to 100 ?
>>
>> but where it is written in the rules??
>
> Sorry. The rules may not specifically say that. We have
> been doing this for many years, and it has just been a
> given. Each compo much pass a test suite of some kind.
> We have always had a test suite.
>
> Also, we have had many discussion about the current and
> previous compos on the forum and email list. Again,
> sorry about that, but we usually don't get many new entrants.
>
> However, I would bet that if you change your code to produce
> the same random number as the example, it will pass the test.

what to change for to past test0.bat?
change the random number generator, the association cell numbers 0..4,
the function that calculate from the wall the position,
and push/pop the current cell number (it should be 204 byte)

%define L 25
%define H 10

;%define L 97
;%define H 97

;%define L 10
;%define H 749

%define BytesMemory ((L+1)*(H+2)*6)
%define H21 (2*H+1)

%define sopra (L+1)*6
%define sopra2 (L+1)*3

%define LineareMax 3*((L-1)+2*(L+1)*H)+1
%define passi (LineareMax-sopra-1)/3

org 100h
Start:
; ****************************
; *** Prende il numero with the help by Esra Sdrawkcab
; ****************************
; assumo che ax==0
mov si, 081h
mov bl, ' '
..0: aad 10 ; al+=10*ah e ah=0
mov ah, al
lodsb
sub al, bl
mov bl, '0' ; prima ' ' poi '0'
jge .0 ; o un char minore di '0'
mov [seed], ah ; inizializza il seed per rand
; *******************************************
; *** Fa la griglia
; *******************************************
mov di, arr
mov cx, BytesMemory
mov al, 10
lea si, [di+sopra]
rep stosb ; tutto 10 [visitato] qui cx=0
lea di, [si-sopra2]
mov bx, H21
mov ax, "+-"
mov dx, "|N" ; le caselle NN: non visitate
..2: mov cx, L ; altrimenti visitate
..3: stosw
mov byte[di], ah
inc di
loop .3
stosb
mov byte[di], 0Dh
inc di
inc di ; fa la linea
xchg ax, dx
dec bx
jnz .2 ; passa alla linea successiva
mov byte[di], '$'
mov byte[di-sopra2-3], 07fh
mov byte[si], 02h ; ritorna in si la casella iniziale
; **************************************
; *** Trova una casella casuale
; **************************************
; P(x,y)=i_inz+y*(L+1)*6+x*3
mov cx, L
call ran
mov di, dx
add di, dx
add di, dx ; x*3
mov cx, H
call ran
mov ax, sopra
mul dx ; y*(L+1)*6
add ax, di
add si, ax ; in si la casella iniziale del labirinto
; *******************************************
; *** Fa il labirinto
; *******************************************
; suppone all'ingresso che cx==0
; parte dalla casella puntata da si
inc si ; punta all'interno della casella, dove c'e' 'N'
..4: mov word[si], " " ; " " significa visitata
..5: mov cl, 4
call ran ; le caselle confinanti sono 4
..6: and dx, 03h ; dl=0[destra],1[basso],2[sinistra],3[alto]
mov di, dx
mov bp, dx
mov bx, [muro+di+bp] ; in bx offset del muro
not di
and di, 1
mov bp, bx
add bp, bx ; se bp=2*bx-(not(di)&1)
sub bp, di ; => in bp offset della prossima casella
cmp byte[si+bp], 'N'
je .a ; se tale casella non e' visitata va in .a
..7: inc dx
loop .6 ; vai alla prossima casella
; ** caso le caselle sono tutte visitate
cmp sp, 0FFFEh
jae .z
; se lo stack e' vuoto esci[ e'in casella iniziale]
pop dx
pop si ; altrimenti prende la casella precedente
mov cl, 4
jmp short .7
%if BytesMemory>24000
..e: mov sp, 0FFFEh
ret ; nel caso di errore non stampa proprio niente:
; ritorna al DOS
%endif
..a: ; ** caso vi � una casella non visitata
; leva il muro di divisione [ed eventualemente una N]
mov word[si+bx], " "
; che verra' in ogni caso levata dall'istruzione in .4
%if BytesMemory>24000
cmp sp, limite
jbe .e ; lo stack non puo' invadere questo file in memoria
%endif
push si
push dx
add si, bp
jmp short .4
..z:
; ******************************
; *** Stampa sullo schermo
; ******************************
lea dx, [arr+sopra2]
mov ah, 09h
int 21h ; usa si per stampare l'array
ret

; ritorna un numero 0..cx in dx
ran:
mov ax, 04e35h
imul word[seed]
inc ax
mov [seed], ax
shr ax, 8
xor dx, dx
idiv cx
ret

align 2
seed dw 0
;;
; +--+--+--+
; | |3 | |
; +--+--+--+
; | 2|NN|0 |
; +--+--+--+
; | |1 | |
; +--+--+--+
; dl=0[destra],1[basso],2[sinistra],3[alto]
;;

; 0 1 2 3
muro dw 2, sopra2, -1, -sopra2

Section .bss
arr resb BytesMemory
fine resb 512 ; for to be sure
limite resb 4




From: io_x on

"io_x" <a(a)b.c.invalid> ha scritto nel messaggio
news:4acaf615$0$830$4fafbaef(a)reader5.news.tin.it...
> what to change for to past test0.bat?
> change the random number generator, the association cell numbers 0..4,
> the function that calculate from the wall the position,
> and push/pop the current cell number (it should be 204 byte)

and to read the code in the example.asm :)