53 lines
1.5 KiB
Text
53 lines
1.5 KiB
Text
PROGRAM JOSEPHUS
|
|
|
|
!
|
|
! for rosettacode.org
|
|
!
|
|
|
|
!$INTEGER
|
|
|
|
DIM DEAD[100]
|
|
|
|
PROCEDURE MAIN(N,K,S->ERRORS)
|
|
! n - number of prisoners
|
|
! k - kill every k'th prisoner
|
|
! s - number of survivors
|
|
LOCAL KILLED$,SURVIVED$,FOUND,P,NN,I
|
|
ERRORS=0
|
|
FOR I=0 TO 100 DO
|
|
DEAD[I]=0
|
|
END FOR ! prepare array
|
|
PRINT("N=";N,"K=";K,"S=";S) ! show arguments
|
|
IF S>N THEN PRINT("S>N";) ERRORS+=1 END IF
|
|
IF K<=0 THEN PRINT("K<=0";) ERRORS+=1 END IF
|
|
IF ERRORS>0 THEN EXIT PROCEDURE END IF
|
|
NN=N ! wrap around boundary
|
|
P=-1 ! start here
|
|
WHILE N<>S DO ! until survivor count is met
|
|
FOUND=0 ! start looking
|
|
WHILE FOUND<>K DO ! until we have the k-th prisoner
|
|
P+=1
|
|
IF P=NN THEN P=0 END IF ! wrap around
|
|
IF DEAD[P]<>1 THEN
|
|
FOUND+=1
|
|
END IF ! if prisoner is alive increment found
|
|
END WHILE
|
|
DEAD[P]=1 ! kill the unlucky one
|
|
KILLED$=KILLED$+STR$(P) ! build killed list
|
|
N-=1 ! reduce size of circle
|
|
END WHILE
|
|
FOR I=0 TO NN-1 DO
|
|
IF DEAD[I]<>1 THEN
|
|
SURVIVED$=SURVIVED$+STR$(I) ! build survivor list
|
|
END IF
|
|
END FOR
|
|
PRINT("Killed:";KILLED$)
|
|
PRINT("Survived:";SURVIVED$)
|
|
END PROCEDURE
|
|
|
|
BEGIN
|
|
ERRORS=0
|
|
MAIN(5,2,1->ERRORS)
|
|
MAIN(41,3,1->ERRORS)
|
|
MAIN(41,3,3->ERRORS)
|
|
END PROGRAM
|