NOTA
Este problema foi retirado deste tópico do reddit (alerta de spoiler!) E eu o ajustei para ajustá-lo ao formato deste site. Todo o crédito vai para o usuário do reddit "Coder_d00d".
Nesse problema, simularemos uma floresta.
Para esta floresta simulada, trataremos de três aspectos.
- Árvores que podem ser um rebento, uma árvore ou uma árvore mais velha.
- Lenhadores (Ele corta árvores, almoça e vai ao Lava-try)
- Ursos (Ele derruba os lenhadores que cheiram a panquecas)
Um aviso prévio: essas regras provavelmente não são perfeitas. Veja-os como uma diretriz e, se você precisar ajustar algo que esteja bom (as taxas de desova foram apontadas como um problema, veja a resposta de kuroi neko como exemplo disso.
Ciclo de tempo:
A simulação será simulada por meses. Você avançará progressivamente no tempo com um "tique". Cada "marca" representa um mês. A cada 12 "ticks" representa um ano. Nossa floresta mudará e estará em constante mudança. Vamos registrar o progresso de nossa floresta e analisar o que acontece com ela.
Floresta:
A floresta será uma floresta bidimensional. Exigiremos uma entrada de N para representar o tamanho da floresta em uma grade com tamanho N x N. Em cada local, você pode segurar Árvores, Ursos ou Lenhadores. Eles podem ocupar o mesmo local, mas geralmente ocorrem eventos quando ocupam o mesmo local.
Nossa floresta será gerada aleatoriamente com base no tamanho. Por exemplo, se o seu valor for N = 10. Você terá uma floresta de 10 por 10 e 100 pontos.
- 10% da floresta terá um lenhador em 10 pontos aleatórios. (usando nossa floresta de 100 pontos, deve ser 10 lenhadores)
- 50% da floresta conterá árvores (as árvores podem ser de três tipos e começarão como a do meio da "árvore") em pontos aleatórios.
- 2% da floresta terá ursos.
A decisão de como você recebe o tamanho da floresta depende de você (leia a partir de stdin, um arquivo ou codifique-o). Eu recomendaria manter N como 5 ou superior. Pequenas florestas não são muito divertidas.
Eventos:
Durante a simulação, haverá eventos. Os eventos ocorrem com base em alguma lógica que explicarei abaixo. Descreverei os eventos abaixo em cada descrição dos 3 elementos de nossa floresta.
Os eventos seguem a ordem das árvores primeiro, os lenhadores em segundo e os ursos por último.
Árvores:
Todo mês, uma árvore tem 10% de chance de gerar um novo "rebento". Em um espaço aberto aleatório adjacente a uma árvore, você tem 10% de chance de criar um "rebento".
Por exemplo, uma árvore no meio da floresta tem 8 outros pontos ao seu redor. Um deles (se estiver vazio) se tornará um "rebento".
Após 12 meses de existência, um "Rebento" será atualizado para uma "Árvore". Um "rebento" não pode gerar outras árvores até que tenha amadurecido em uma "árvore".
Uma vez que uma "muda" se torne uma árvore, ela poderá gerar outras novas "mudas".
Quando uma "Árvore" existe há 120 meses (10 anos), ela se torna uma "Árvore Mais Velha".
Árvores mais velhas têm 20% de chance de gerar um novo "rebento" em vez de 10%.
Se não houver pontos adjacentes abertos a uma Árvore ou Árvore Ancião, ela não gerará novas Árvores.
Lenhadores:
Os lenhadores cortam árvores, pulam e pulam, gostam de pressionar flores silvestres.
Todo mês os lenhadores vagam. Eles serão movidos até 3 vezes para um local escolhido aleatoriamente, adjacente em qualquer direção. Por exemplo, um lenhador no meio da sua grade tem 8 pontos para mover. Ele vagará para um local aleatório. Então de novo. E finalmente pela terceira vez. NB: Pode ser qualquer local (para que eles possam entrar em ursos, resultando em um maul).
Quando o lenhador se move, se ele encontra uma Árvore (não uma muda), ele para e sua peregrinação naquele mês chega ao fim. Ele então colherá a árvore para madeira serrada. Retire a árvore. Ganhe 1 pedaço de madeira.
Os lenhadores não colhem "Mudas".
As lenhagens também colhem árvores mais velhas. Árvores mais velhas valem 2 pedaços de madeira.
Rastreamento de madeira:
A cada 12 meses, a quantidade de madeira colhida é comparada ao número de madeireiros na floresta.
Se a madeira coletada for igual ou superior à quantidade de madeireiros na floresta, um número de novos madeireiros será contratado e gerado aleatoriamente na floresta.
Calcule o número de lenhadores para contratar:
floor(lumber_collected / number_of_lumberjacks)
No entanto, se após um período de 12 meses a quantidade de madeira coletada estiver abaixo do número de lenhadores, um lenhador será deixado para economizar dinheiro e um lenhador aleatório será removido da floresta. Observe que você nunca reduzirá sua força de trabalho do Lenhador abaixo de 0.
Ursos:
Os ursos vagam pela floresta como um lenhador. No entanto, em vez de 3 espaços, um urso percorre até 5 espaços.
Se um urso se deparar com um lenhador, ele parará de perambular pelo mês. (Por exemplo, após 2 movimentos, o urso cai em um espaço com um lenhador, ele não fará mais movimentos neste mês)
Lenhadores cheiram a panquecas. Ursos adoram panquecas. Por isso, infelizmente, o urso espancará e ferirá o lenhador. O lenhador será removido da floresta (ele voltará para casa e fará compras às quartas-feiras e terá bolinhos amanteigados para o chá).
Vamos acompanhar isso como um acidente "Maul".
Observe que a população de lenhador nunca pode cair abaixo de 1 - portanto, se o último lenhador for atacado, basta gerar outro.
Rastreamento de Maul:
Durante 12 meses, se houver 0 acidentes "Maul", a população do Urso aumentará em 1. Se, no entanto, houver algum acidente "Maul", os Lenhadores contratarão um Zoológico para prender e levar um Urso. Remova 1 urso aleatório. Observe que se sua população de ursos chegar a 0 ursos, não haverá acidentes com "Maul" no próximo ano e, portanto, você gerará um novo urso no próximo ano.
Se houver apenas 1 lenhador na floresta e ele for atacado, ele será mandado para casa, mas um novo será contratado imediatamente e reaparecido em outro lugar da floresta. A população do lenhador nunca pode cair abaixo de 1.
Tempo:
A simulação ocorre por 4800 meses (400 anos), ou até que não haja mudas, árvores ou árvores mais velhas.
Resultado:
Todo mês você imprime um mapa da floresta - talvez usando um mapa ASCII ou gráficos e cores.
Extras opcionais
- Você pode produzir as populações de árvores, lenhadores e ursos a cada carrapato.
- Você pode produzir sempre que um evento ocorrer (por exemplo: "Um urso atacou um lenhador".)
Pontuação
Este é um concurso de popularidade, por isso a maioria dos upvotes vence!
EDIT - As pessoas apontaram várias falhas nas minhas regras e, embora você possa se sentir à vontade para me fazer perguntas, também é bom ajustar as regras um pouco para se adequar ao seu próprio programa ou interpretação do programa.
fonte
Note that you will never reduce your Lumberjack labor force below 0
no item 3. da lista da seção de lenhador, talvez mude para 1 para ficar de acordo com o que você menciona na seção de ursos?Respostas:
Javascript + HTML - experimente
Atualizado conforme solicitação popular
Comportamento geral
O programa agora é um pouco interativo.
O código fonte é completamente parametrizado, para que você possa ajustar mais alguns parâmetros internos com o seu editor de texto favorito.
Você pode alterar o tamanho da floresta.
É necessário um mínimo de 2 para ter espaço suficiente para colocar uma árvore, um lenhador e um urso em 3 locais diferentes, e o máximo é arbitrariamente fixado em 100 (o que fará o computador médio rastejar).
Você também pode alterar a velocidade da simulação.
A exibição é atualizada a cada 20 ms; portanto, um intervalo de tempo maior produzirá animações mais refinadas.
Os botões permitem parar / iniciar a simulação ou executá-la por um mês ou um ano.
O movimento dos habitantes da floresta agora é um pouco animado. Eventos de corte e corte de árvores também são figurados.
Um log de alguns eventos também é exibido. Mais algumas mensagens estão disponíveis se você alterar o nível de verbosidade, mas isso o inundaria com notificações "Bob corta mais uma árvore".
Eu preferiria não fazer isso se fosse você, mas não sou, então ...
Ao lado do playground, um conjunto de gráficos em escala automática é desenhado:
A legenda também exibe as quantidades atuais de cada item.
Estabilidade do sistema
Os gráficos mostram que as condições iniciais não escalam tão graciosamente. Se a floresta é muito grande, muitos ursos dizimam a população de lenhadores até que muitos amantes de panquecas sejam colocados atrás das grades. Isso causa uma explosão inicial de árvores mais velhas, que por sua vez ajuda a população de lenhadores a se recuperar.
Parece que 15 é o tamanho mínimo para a floresta sobreviver. Uma floresta de tamanho 10 geralmente será destruída após algumas centenas de anos. Qualquer tamanho acima de 30 produzirá um mapa quase cheio de árvores. Entre 15 e 30, você pode ver a população de árvores oscilando significativamente.
Alguns pontos de regra discutíveis
Nos comentários do post original, parece que vários bípedes não devem ocupar o mesmo lugar. Isso contradiz de alguma forma a regra de um caipira vagando em um amador de panqueca.
De qualquer forma, não segui essa diretriz. Qualquer célula da floresta pode conter qualquer número de desidratantes (e exatamente zero ou uma árvore). Isso pode ter algumas conseqüências na eficiência do lenhador: suspeito que permita que eles cavem mais facilmente um grupo de árvores mais velhas. Quanto aos ursos, não espero que isso faça muita diferença.
Também optei por sempre ter pelo menos um lenhador na floresta, apesar do argumento de que a população caipira poderia chegar a zero (disparar o último lenhador no mapa se a colheita fosse realmente ruim, o que nunca acontecerá, a menos que a floresta tenha sido destruída). cortada até a extinção).
Tweaking
Para alcançar a estabilidade, adicionei dois parâmetros de ajustes:
1) taxa de crescimento dos lenhadores
um coeficiente aplicado à fórmula que fornece o número de lenhadores extras contratados quando há madeira suficiente. Defina como 1 para voltar à definição original, mas achei um valor de cerca de 0,5 que permitia que a floresta (especialmente as árvores mais velhas) se desenvolvesse melhor.
2) critério de remoção de ursos
um coeficiente que define a porcentagem mínima de lenhadores atacados para enviar um urso ao zoológico. Defina como 0 para voltar à definição original, mas essa eliminação drástica do urso basicamente limitará a população a um ciclo de oscilação de 0-1. Eu o defino em 0,15 (ou seja, um urso é removido apenas se 15% ou mais dos lenhadores foram atacados este ano). Isso permite uma população moderada de ursos, suficiente para impedir que os caipiras limpem a área, mas ainda permitindo que uma parte considerável da floresta seja cortada.
Como nota lateral, a simulação nunca para (mesmo após os 400 anos necessários). Poderia facilmente fazê-lo, mas não o faz.
O código
O código está totalmente contido em uma única página HTML.
Ele deve ser codificado em UTF-8 para exibir os símbolos unicode adequados para ursos e lenhadores.
Para sistemas com problemas de Unicode (por exemplo, Ubuntu): encontre as seguintes linhas:
e alterar os pictogramas para personagens mais fácil de display (
#
,*
, qualquer que seja)Qual o proximo?
Mais comentários ainda são bem-vindos.
NB: Estou ciente de que o número de árvores jovens / maduras / mudas ainda é um pouco confuso, mas que diabos.
Além disso, acho document.getElementById mais legível que $, portanto, não é necessário reclamar da falta de jQueryisms. É jQuery grátis de propósito. Cada um na sua, certo?
fonte
AngularJS
Aqui está a minha versão , que ainda é um trabalho em andamento: o código é um pouco ... bem ... feio. E bem devagar. Também pretendo adicionar mais opções para parametrizar a evolução e analisar o estado da floresta. Comentários e propostas de melhoria são bem-vindos!
Demonstração
fonte
getEntitiesAt
parece ser um porco da CPU! executar o sistema com uma grade de 50x50 leva mais de um segundo por mês no meu PC. Também existe um caso em que todas as árvores são cortadas, todos os lenhadores são disparados e o mapa se enche lentamente de ursos :). Tente um tamanho pequeno (10 ou menos) para ver isso acontecer.Forest.tick()
, seForest.lumberjackList.length == 0
, entãoLumberjack.create(<number>, <number>)
.Javascript
Eu acho que isso funciona principalmente. Há um comportamento vacilante em que eu procuro todos os novos ursos / lenhadores em sincronia e próximos um do outro por preguiça nas inserções.
Essa implementação não permite que os lenhadores se apoiem nas mudas, porque você sabe que pisar nas mudas é ruim. A arte do violino usa retângulos coloridos por padrão, altere a segunda linha para false para usar letras para desenhar.
violino
HTML:
Js:
fonte
n = 50
, por exemplo).Pitão
Nada chique. Continuei adicionando coisas, então a refatoração pode estar em ordem. (E eu não fiz unitest, então os bugs ainda podem estar presentes).
Dei nomes aleatórios a lenhadores e ursos. As árvores são
i
, entãoI
, em seguida#
, Lumberjacks sãox
, ursos sãoo
Algumas saídas:
Final do ano
Fim do jogo
fonte