A Maple egy fejlett matematikai problémamegoldó és programozói szoftver.
-
xDJCx #490
Egy kis animációval kiegészítettem az előző megoldást a Josephus-problémára.
Egy további M paraméter is megadható az eljárás hívásakor: M egy opcionális paraméter, ha n>M akkor nem rajzol, csak kiír (ha túl nagy lenne n a szép rajzoláshoz). Ha nem adjuk meg M-et, akkor 100-nak veszi.
A futtatáskor a megjelenő animációs ablakba kattintva megjelenik egy animációs menüsor a Maple ablakában. Innen indítható az animáció, vagy lépésenként futtatható, illetve az FPS mezőben megadható, hogy milyen gyors legyen (pl. FPS 1-nél másodpercenként léptet). Szintén Maple 14-ben készült.
Az eljárás:
Josephus2 := proc (n::posint, k::posint,M::posint:=100)
local L, m,p1,t1,p2,p3,kiv;
description "Josephus-probléma: n-en állnak körben, minden k-adikat kivégzik, amíg egy marad csak (Josephus).";
# M opcionális paraméter: ha n>M, akkor nem rajzol, csak kiír, ha nincs megadva, akkor M=100
uses plots; gc();
L := [$1 .. n];
m := 0;
p2:=Array(1..n):
t1 := textplot({seq([.9, (-2*Pi*(i-1))*(1/n)-3*Pi*(1/2), i], i = 1 .. n)}, coords = polar, color = blue, axes = none):
setoptions(title="Josephus-probléma",font=[Times,roman,11], axes=none,symbolsize = 20,symbol = soliddiamond,view=[-1.3..1.3,-1.3..1.3]);
while 1 < nops(L) do
m := m+1;
L := ListTools[Rotate](L, k-1);
if n<=M then
kiv:={L[]} minus {L[1]};
p2[m]:=display( textplot([0,0, cat(convert(m,string),". kivégzett: ",convert(L[1],string))], coords = polar,color = blue, axes = none),pointplot({seq([1, (-2*Pi*(i-1))*(1/n)-3*Pi*(1/2)], i in kiv)},coords = polar, color = blue),pointplot([1, (-2*Pi*(L[1]-1))*(1/n)-3*Pi*(1/2)], coords = polar, color = red)):
else
print(cat(m, ". kivégzett: ", L[1]));
end if:
L := L[2..-1]:
end do;gc();
if n>M then print(cat("Josephus ", L[1], "-ik a körben."));
else;
p3:=display( textplot([0,0, cat("Josephus helye: ",convert(L[1],string))], coords = polar, color = blue),pointplot([1, (-2*Pi*(L[1]-1))*(1/n)-3*Pi*(1/2)], coords = polar, symbolsize = 20, color = green)):
display(t1,display([ seq(p2[i],i=1..m),p3],insequence = true));
end if;
end proc;
Josephus2(40,7);# megjelenít
Josephus2(40,7,39);# így csak kiírja a lépéseket,