Sobre o problema de Josephus

A macro simula várias rodadas do jogo, até sobrar só um.

Link para download.

Um array para armazenar quem está vivo ou não:

ReDim arrMorto(1 To n)

Rodar isso n-1 vezes

For i = 1 To n – 1 ‘Para cada rodada

    count = 0

    While count < passo

        ‘A formula complicada abaixo é para considerar quando a contagem dá a volta no círculo e volta para o primeiro

        pos = ((pos + 1 – 1) Mod (n)) + 1

       ‘só incrementa o contador se a pessoa na posição estiver viva

        If arrMorto(pos) = 0 Then

            count = count + 1

        End If

      ‘A pessoa que estiver exatamente na posição escolhida para ser eliminada, executa a instrução abaixo

        If count = passo Then

            arrMorto(pos) = 1 ‘A pessoa nesta posição morre

            colore (pos) ‘subrotina para colorir a bolinha

            timeout (0.5) ‘espera 0,5 segundo para criar efeito de animação

        End If

    Wend

Next i


Ideias técnicas com uma pitada de filosofia: https://ideiasesquecidas.com

Ferramentas Excel-VBA: https://ferramentasexcelvba.wordpress.com/

Teste: O problema de Josephus

O problema de Josephus é um jogo com dois parâmetros: número de participantes e distância entre eliminações.

Diz a lenda que um certo Flavius Josephus, durante uma guerra, se encontrava entre um bando de 41 judeus rebeldes encurralados pelos romanos em uma caverna.

Os rebeldes formam um círculo e começam a partir de certo ponto a executar a terceira pessoa numa direção.
Sabe-se que Josephus sobreviveu. Em que posição ele estava para ser o último?

Por exemplo, para 7 participantes e eliminar a cada 3:

Na primeira rodada, elimina o número 3.

Pulando mais três, eliminar o número 6.

Depois, é a vez do número 2.

Depois, o número 7 – note que o 3 e o 6 já tinham sido eliminados.

Na sequência, o 5 e o 1.

No final das contas, o número 4 é o vencedor. Neste jogo, Josephus deveria ficar na posição 4 para sobreviver!

Desafio: criar uma função Josephus(n, p), que receba o número de participantes (n) e a distância a eliminar (p), e retorne qual a posição vencedora.

A resposta foi publicada aqui.


Ideias técnicas com uma pitada de filosofia: https://ideiasesquecidas.com

Ferramentas Excel-VBA: https://ferramentasexcelvba.wordpress.com/