Josephus problem with three inputs
Piet, 280 273 codels
Edit: I have golfed this down some more, and I think I can golf it down even further, but that is still to come. For now, I'm just glad it works, and that I had room to sign it in the bottom left-hand corner. Two ideas I have to save more codels are a) to change the end instructions be pop, push 1, add, out num
(pop n, output r+1) and b) to duplicate again at the bottom left corner to save codels in stack manipulation later on in the loop.
The picture above is my code at 8 pixels per codel. In general, it's the same algorithm as my Python answer, but with the inputs in the order of k, q, n. In practice, there is a also a great deal of stack manipulation. You can try it here by opening the image there and running the code with it.
Explanation
This is a step-by-step ungolfing of the solution.
in num get k
dup Stack: k k
push 1
subtract Stack: k k-1
in num get q
dup Stack: k k-1 q q
dup Stack: k k-1 q q q
push 4
push 2
roll Stack: k q q k-1 q
mod Stack: k q q r
in num get n
# note: the loop will return to the following codel
dup Stack: k q q r n n
push 4
push 3
roll Stack: k q r n n q
greater 1 or 0
pointer Here the loop begins. If q>n, the pointer moves clockwise.
Else, it points straight ahead
LOOP: Stack: k i r n (i=q at the start of the loop)
push 4
push 2
roll Stack: r n k i
push 1
add Stack: r n k i=i+1
push 2
push 1
roll Stack: r n i k
dup Stack: r n i k k
push 5
push 4
roll Stack: n i k k r
add Stack: n i k m=r+k
push 3
push 2
roll Stack: n k m i
dup Stack: n k m i i
push 3
# here it turns the corner
push 1
roll Stack: n k i m i
mod Stack: n k i r=m%i
push 4
# here it turns the corner and avoids the black codels
push 1
roll Stack: r n k i
dup Stack: r n k i i
push 5
push 3
roll Stack: k i i r n
dup Stack: k i i r n n
# and we meet up with the dark green codel once more
push 4
push 3
roll Stack: k i r n n i
greater Stack: k i r n (0 or 1)
pointer if else again
# else Stack: k i r n
push 2
push 1
roll Stack: k i n r
# and turn the corner
push 1
add Stack: k i n r+1
out num print r+1
# turn the corner into the end pattern (the shape with the black edges)
END
Pyth, 16 bytes
eu.<PGvzh-QvwShQ
Try it online: Demonstration or Test Suite
Input is of the form k<newline>n<newline>q
.
Explanation:
eu.<PGvzh-QvwShQ implicit: z = first input line (string)
Q = second input line (integer)
hQ Q + 1
S the range [1, 2, ..., Q+1]
u h-Qvw apply the following statement (Q-input()+1) times to G=^
PG remove the last number of G
.< vz and rotate eval(z) to the left
e print the last number of the resulting list
CJam, 22 20 19 bytes
q~_,@a@*{m<)\}%\~=)
This reads the input as q k n
. Try it online in the CJam interpreter.
How it works
q~ Read and evaluate all input. This pushes q, k, and n.
_, Push A := [0 ... n-1].
@a Rotate on top of the stack and wrap it in an array.
@* Rotate the original n on top and repeat [k] n times.
{ }% For each of the n k's:
m< Rotate A k units to the left.
)\ Pop the last element and swap it with A.
\~ Swap the resulting array with q and apply bitwise NOT.
=) Select the corresponding element and add 1 to it.