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,