Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
48
Task/Josephus-problem/REXX/josephus-problem-1.rexx
Normal file
48
Task/Josephus-problem/REXX/josephus-problem-1.rexx
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
/* REXX **************************************************************
|
||||
* 15.11.2012 Walter Pachl - my own solution
|
||||
* 16.11.2012 Walter Pachl generalized n prisoners + w killing distance
|
||||
* and s=number of survivors
|
||||
* 09.05.2013 Walter Pachl accept arguments n w s and fix output
|
||||
* thanks for the review/test
|
||||
* I see no need for specifying a start count (actually a start number)
|
||||
* This task states: n prisoners are standing on a circle,
|
||||
* sequentially numbered from 0 to n-1. The 1st prisoner is 0.
|
||||
* This program should work on EVERY REXX.
|
||||
* Pls report if this is not the case and let us know what's a problem.
|
||||
**********************************************************************/
|
||||
Parse Arg n w s .
|
||||
If n='?' Then Do
|
||||
Say 'Invoke the program with the following arguments:'
|
||||
Say 'n number of prisoners (default 41)'
|
||||
Say 'w killing count (default 3)'
|
||||
Say 's number of prisoners to survive (default 1)'
|
||||
Exit
|
||||
End
|
||||
If n='' Then n=41 /* number of alive prisoners */
|
||||
If w='' Then w=3 /* killing count */
|
||||
If s='' Then s=1 /* nuber of survivors */
|
||||
dead.=0 /* nobody's dead yet */
|
||||
nn=n /* wrap around boundary */
|
||||
p=-1 /* start here */
|
||||
killed='' /* output of killings */
|
||||
Do until n=s /* until one alive prisoner */
|
||||
found=0 /* start looking */
|
||||
Do Until found=w /* until we have the third */
|
||||
p=p+1 /* next position */
|
||||
If p=nn Then p=0 /* wrap around */
|
||||
If dead.p=0 Then /* a prisoner who is alive */
|
||||
found=found+1 /* increment found count */
|
||||
End
|
||||
dead.p=1
|
||||
/*
|
||||
Say 'killing' p 'now'
|
||||
*/
|
||||
n=n-1 /* shoot the one on this pos. */
|
||||
killed=killed p /* add to output */
|
||||
End /* End of main loop */
|
||||
Say 'killed:'killed /* output killing sequence */
|
||||
s=''
|
||||
Do i=0 To nn-1 /* look for the surviving p's */
|
||||
If dead.i=0 Then s=s i /* found one */
|
||||
End
|
||||
Say 'Survivor(s):'s /* show */
|
||||
24
Task/Josephus-problem/REXX/josephus-problem-2.rexx
Normal file
24
Task/Josephus-problem/REXX/josephus-problem-2.rexx
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
/*REXX program solves Josephus problem: N men standing in a circle, every Kth kilt.*/
|
||||
parse arg N K Z R . /*obtain optional arguments from the CL*/
|
||||
if N=='' | N=="," then N= 41 /* men not specified? Use default.*/
|
||||
if K=='' | K=="," then K= 3 /* kilt " " " " */
|
||||
if Z=='' | Z=="," then Z= 0 /* start " " " " */
|
||||
if R=='' | R=="," then R= 1 /*remaining " " " " */
|
||||
$=; do i=Z for N; $= $ i; end /*i*/ /*populate prisoner's circle (with a #)*/
|
||||
x= /*the list of prisoners to be removed. */
|
||||
do c=k by k; p= words($) /*keep removing until R are remaining*/
|
||||
if c>p then do /* [↓] remove (kill) some prisoner(s)*/
|
||||
do j=1 for words(x); $= delword($, word(x, j) + 1 - j, 1)
|
||||
if words($)==R then leave c /*The slaying finished? (R people left)*/
|
||||
end /*j*/
|
||||
c= (c//p) // words($); x= /*adjust prisoner count-off and circle.*/
|
||||
end
|
||||
if c\==0 then x=x c /*the list of prisoners to be removed. */
|
||||
end /*c*/ /*remove 'til R prisoners are left.*/
|
||||
|
||||
say 'removing every ' th(K) " prisoner out of " N ' (starting at' Z") with ",
|
||||
R ' survivor's(R)", leaving prisoner"s(R)':' $
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
s: if arg(1)==1 then return arg(3); return word( arg(2) 's', 1) /*plurals*/
|
||||
th: y= arg(1); return y || word('th st nd rd', 1+ y // 10 * (y//100%10\==1) * (y//10<4))
|
||||
Loading…
Add table
Add a link
Reference in a new issue