RosettaCodeData/Task/Josephus-problem/ERRE/josephus-problem.erre
2016-12-05 23:44:36 +01:00

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