Esquerda Centro Direita (LCR) código golf

10

Em uma festa, fui apresentado ao jogo LCR. Agora não é um ótimo jogo, pois não há habilidade, mas apenas chance aleatória. Mas isso me fez pensar: eu poderia codificar isso e fiz um rápido programa em R para modelar o jogo.

Regras do jogo modificadas da Wikipedia para combinar com a forma como jogamos:

Cada jogador recebe pelo menos 3 fichas. Os jogadores jogam três dados de seis lados, cada um deles marcado com "L", "C", "R" de um lado e um ponto nos três lados restantes. Para cada "L" ou "R" jogado, o jogador deve passar uma ficha para o jogador à sua esquerda ou direita, respectivamente. Um "C" indica um chip para o centro (pote). Um ponto não tem efeito.

Se um jogador tiver menos de três fichas restantes, ele ainda estará no jogo, mas seu número de fichas é o número de dados que eles jogam no turn, em vez de jogar as três. Quando um jogador tem zero fichas, eles passam os dados no seu turno, mas podem receber fichas de outros e fazer o próximo turno de acordo. O vencedor é o último jogador a colocar fichas no centro.

Concurso: escreva um programa no seu idioma de escolha que inclua o número de jogadores e o número de fichas iniciais e simule um jogo de LCR, mostrando o estado do jogo após o lançamento de cada jogador.

Por exemplo, um jogo pode ser exibido como:

[[[3,3,3,3],0],[[1,4,3,4],0],[[1,4,3,4],0],[[1,4,1,4],2],[[1,4,1,2],4],
[[0,4,1,3],4],[[0,3,2,3],4],[[0,3,0,3],6],[[0,3,1,1],7],[[0,3,1,1],7],
[[2,0,1,1],8],[[2,0,0,1],9],[[2,0,0,0],10],[[0,1,0,0],11],
[[1,0,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[0,0,0,0],12]]

ht: JonathanAllan

A saída não precisa ser exatamente assim, mas deve ser fácil discernir a rolagem de dados, quantas fichas cada jogador tem e quantas fichas o centro tem para cada turno.

É código de golfe, então o código mais curto vence.

CT Hall
fonte
3
"deve ser fácil discernir o lançamento de dados" - é implícito (portanto, fácil de discernir) os estados das fichas, assim como o jogador que rolou, uma vez que é baseado em turnos. Eu diria que este exemplo de saída tem tudo o necessário: [[[3,3,3,3],0],[[1,4,3,4],0],[[1,4,3,4],0],[[1,4,1,4],2],[[1,4,1,2],4],[[0,4,1,3],4],[[0,3,2,3],4],[[0,3,0,3],6],[[0,3,1,1],7],[[0,3,1,1],7],[[2,0,1,1],8],[[2,0,0,1],9],[[2,0,0,0],10],[[0,1,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[0,0,0,0],12]]- é esse o caso?
Jonathan Allan
11
@ JonathanAllan, isso funciona para mim.
CT Hall
11
@KevinCruijssen, boa pergunta, acho que vou permitir de qualquer maneira.
CT Hall
11
@CTHall Nesse caso, editei minhas respostas (Java e 05AB1E) e incluí tanto com e sem. :)
Kevin Cruijssen 20/02/19
11
Eu quase quero fazer isso no Runic, onde cada ponteiro de instrução atua como um determinado jogador. Não tenho certeza de que posso (mesmo ignorando o número de jogadores), mas seria legal se eu pudesse.
Draco18s não confia mais em SE 20/02/19

Respostas:

4

Emacs Lisp , 279 bytes

(defmacro n(i)`(incf(nth ,i c)))
(defun f(p s)(g(let((a'(0)))(dotimes(i p)(push s a))(princ a))0 p))
(defun g(c v p)(dotimes(i(min(nth v c)3))(decf(nth v c))(case(random 6)(0(n(mod(1- v)p)))(1(n(mod(1+ v)p)))(2(n p))(t(n v))))(princ c)(or(eq(-sum c)(nth p c))(g c(mod(1+ v)p)p)))

Use esta função como (f 4 3).

Versão melhor legível:

(defmacro n (i) `(incf (nth ,i c)))

(defun f(p s)
  (g
   (let ((a '(0)))
     (dotimes (i p)
       (push s a))
     (princ a))
   0
   p))

(defun g (c v p)
  (dotimes (i (min (nth v c) 3))
    (decf (nth v c))
    (case (random 6)
      (0 (n (mod (1- v) p)))
      (1 (n (mod (1+ v) p)))
      (2 (n p))
      (t (n v))))
    (princ c)
    (or (eq (-sum c) (nth p c))
    (g c (mod (1+ v) p) p)))

Exemplo de saída:

(3 3 3 3 0)(1 4 3 4 0)(2 2 4 4 0)(2 2 2 5 1)(4 2 2 3 1)(2 2 2 4 2)(2 1 3 4 2)(2 2 0 4 4)(2 2 0 4 4)(1 2 0 4 5)(2 1 0 4 5)(2 1 0 4 5)(2 1 1 3 5)(0 1 1 3 7)(1 0 1 3 7)(1 0 1 3 7)(1 0 3 1 7)(1 0 3 1 7)(1 0 3 1 7)(1 1 2 1 7)(1 1 3 0 7)(0 1 3 0 8)(1 0 3 0 8)(1 1 1 1 8)(1 1 2 0 8)(0 1 2 1 8)(0 1 2 1 8)(0 1 1 1 9)(0 1 1 1 9)(0 1 1 1 9)(0 1 1 1 9)(0 1 1 1 9)(0 1 1 0 10)(0 1 1 0 10)(0 0 1 0 11)(0 0 1 0 11)(0 0 1 0 11)(0 0 1 0 11)(0 0 1 0 11)(0 0 0 0 12)
adl
fonte
3

Java 8, 281 277 275 274 253 bytes

Versão que gera o mesmo estado quando um jogador do turno tem 0 fichas restantes:

p->n->{java.util.Arrays A=null;int c[]=new int[p],i=0,t,r,s=1,u,f=9;for(A.fill(c,n);s>0;f=0,System.out.print(A.toString(c)))for(t=c[++i%p],t=t>3?3:t;t-->f;r*=Math.random(),c[i%p]-=1-r/3,s=c[u=(i+r-1+p)%p]+=1-r&1-r/4,c[u]=s<0?0:s,s=A.stream(c).sum())r=6;}

Inicia com o terceiro jogador na matriz.

Experimente online.

Versão que pula jogadores com 0 fichas restantes (274 bytes):

p->n->{java.util.Arrays A=null;int c[]=new int[p],i=p,t,r,s=1,u,f=9;for(A.fill(c,n);s>0;f=0,System.out.print(A.toString(c))){for(t=c[i%p],t=t>3?3:t;t-->f;r*=Math.random(),c[i%p]-=1-r/3,s=c[u=(i+r-1+p)%p]+=1-r&1-r/4,c[u]=s<0?0:s)r=6;for(s=A.stream(c).sum();s>0&c[++i%p]<1;);}}

Inicia no primeiro jogador da matriz.

Experimente online.

-7 bytes graças a @ OlivierGrégoire .

Explicação (da segunda versão):

p->n->{                      // Method with two integer parameters and no return-type
  java.util.Arrays A=null;   //  Create a static Arrays-object to save bytes
  int c[]=new int[p],        //  Integer-array with chips of each player (0 by default)
      i=p,                   //  Index integer, starting at the amount of players
      t,                     //  Temp integer to roll 3 dice
      r,                     //  Temp integer for the dice-result
      s=1,u,                 //  Temp integers (and `s` is also the total-sum integer)
      f=9;                   //  Flag integer, starting at a single digit above 3
  for(A.fill(c,n);           //  Give each player in the array the chips
      s>0                    //  Loop as long as the total-sum is not 0 yet
      ;                      //    After every iteration:
       f=0,                  //     Set the flag to 0
       System.out.print(A.toString(c))){
                             //     Print the current state
    for(t=c[i%p],            //   Set `t` to the current player's chips
        t=t>3?3:t;           //   If this is larger than 3: set it to 3 instead
        t-->f                //   Loop that many times (1, 2, or 3)
                             //   (the flag is used to skip this loop the first iteration,
                             //   so we can print the initial state)
        ;                    //     After every iteration:
         r*=Math.random(),   //      Roll the dice in the range [0,5]
         c[i%p]-=r<3?        //      If the dice-roll is 0, 1 or 2:
                  1          //       Remove a chip from this player
                 :0,         //      Else: Leave the chip-amount the same
         s=c[u=(i+r-1+p)%p]  //      If the dice-roll is 0, go to the player left
                             //      If the dice-roll is 2, go to the player right
             +=1-r&1-r/4,    //       And add a chip to this player
         c[u]=s<0?0:s)       //      Change negative amount of chips to 0
      r=6;                   //    Reset the dice-roll to 6 so we can roll again
    for(s=A.stream(c).sum(); //   Calculate the total sum of the chips of the players
        s>0&                 //   If this sum is larger than 0:
         c[++i%p]<1;);}}     //    Determine the next player in line with at least 1 chip
Kevin Cruijssen
fonte
11
Poderia deixar o meu upvote sem uma (pequena) de golfe: D s=0;for(int C:c)s+=C;(21 bytes) pode ser substituída por s=A.stream(c).sum();(20 bytes)
Olivier Grégoire
Além disso, não tenho certeza se está totalmente ok: c[i%p]-=r<3?1:0c[i%p]-=1-r/3. Isso economizaria 2 bytes.
Olivier Grégoire
11
@ OlivierGrégoire Ah, maneira inteligente de reutilizar o Ade java.util.Arrays. : D E colocando-o no loop para economizar o ponto e vírgula, é de -2 bytes. E 1-r/3é realmente correto ( veja aqui ). Obrigado.
Kevin Cruijssen 20/02/19
Bom truque com a comparação de loop decrescente. Eu posso roubar isso.
Stackstuck
11
Ignore meu comentário excluído anterior: minha tabela de verdade estava desativada. Esta é a única fixa: s=c[u=(i+r-1+p)%p]+=1-r&1-r/4(salva 2 bytes, em comparação com s=c[u=(i+r%2*2-1+p)%p]+=r<2?1:0)
Olivier Grégoire
2

Python 2 , 159 148 bytes

from random import*
n,c=input()
g=[c]*n;i=0
while sum(g):exec"r=randrange(6);g[i]-=1;g[i-[0,1,~-n][max(0,r-3)]]+=r>0;"*min(3,g[i]);i=(i+1)%n;print g

Experimente online!

Imprime todas as fichas dos jogadores após cada jogada

TFeld
fonte
Boa tentativa, mas o código não mostra a quantidade de chips no centro.
CT Hall
3
@CTHall Os chips no centro são sempre iguais a n*c - sum(players). Se eu precisar escrever explicitamente, eu irei #
TFeld 19/02/19
isso é verdade. Eu permitirei.
CT Hall
2

Geléia , 39 bytes

+2 para corrigir o comportamento de repetição ( ¡deve ser precedido por um nilad, para «3Ḣ$-> ⁸FḢ«3)

Se pudermos definir as listas de saída a serem rotacionadas para que as fichas pertencentes ao jogador que agiu anteriormente à esquerda, podemos eliminar a posição mais à direita 6 bytes por 33 bytes (no entanto, na minha opinião, é um pouco estranho ler isso).

ẋµ’1¦‘.,2ŻX¤¦$¹Ø.X¤?⁸FḢ«3¤¡ṙ1µSпṙ"JC$$

Um link diádico aceitando fichas por jogador à esquerda e número de jogadores à direita, que gera uma lista de fichas de jogadores no início do jogo e após cada turno (incluindo turnos em que 0 fichas força um passe) .

Experimente online!

Como?

Cada jogador, por sua vez, até três vezes, dependendo da contagem de fichas, joga uma moeda. Quando um jogador vira cara, ele não faz nada, mas se vira coroa, joga um dado de três lados, perdendo uma ficha para L, C ou R. (Observe que 0 vira quando um jogador tem 0 fichas é equivalente a passar.)
Isso é repetido até que a soma das fichas dos jogadores seja 0.
A implementação gira os jogadores deixados um lugar a cada turno e, em seguida, gira os estados resultantes de volta para todos estarem alinhados como se não estivessem.

ẋµ’1¦‘.,2ŻX¤¦$¹Ø.X¤?⁸«3Ḣ¤¡ṙ1µSпṙ"JC$$ - Link: chipsPerPlayer, C; numberOfPlayers, P
ẋ                                      - repeat C P times (making a list of P Cs)
                              п       - collect up results in a list while...
                             S         - ...п condition: sum (while players have chips)
 µ                          µ          - ...п do: the monadic chain:
                         ¡             -   repeat...
                        ¤              -   ...¡ number of times: nilad and link(s) as a nilad:
                    ⁸                  -     chain's left argument (the chip list)
                     «3                -     minimum with three (vectorises)
                       Ḣ               -     head -- i.e. min(left-most player's chips, 3)
                   ?                   -   ...¡ action: if...
                  ¤                    -     ...? clause: nilad and link(s) as a nilad:
               Ø.                      -       the list [0,1]
                 X                     -       random choice (0 is falsey while 1 is truthy)
             $                         -     ...? then: last two links as a monad:
    ¦                                  -       sparsely apply...
   1                                   -       ...¦ to indices: one (the left-most)
  ’                                    -       ...¦ action: decrement (player lost a chip)
            ¦                          -       sparsely apply...
           ¤                           -       ...¦ to indices: nilad and link(s) as a nilad:
      .,2                              -         literal pair of literals .5 and two = [.5,2]
         Ż                             -         prepend a zero = [0,0.5,2]
          X                            -         random choice
                                       -         -- Note application to index .5 is a no-op
                                       -                 index 0 is the right-most entry (L) 
                                       -                 index 2 is the second entry (R) 
                          ṙ1           -   rotate the list left by one for the next п loop
                                     $ - last two links as a monad:
                                    $  -   last two links as a monad:
                                  J    -     range of length -- i.e. [1,2,3,...,turns+1]
                                   C   -     complement = 1-x        [0,-1,-2,...,-turns]
                                 "     -   zipped-appliction of:
                                ṙ      -     rotate left by
                                       -   -- i.e. rotate 1st left by 0, 2nd left by -1, ...)
Jonathan Allan
fonte
Estou um pouco impressionado com a forma como as pessoas codificam nessas linguagens que parecem ruído de linha. :) Mas então eu só conheço algumas línguas, talvez com mais experiência.
CT Hall
2
Você pode conferir o tutorial no wiki, é muito bom. Uma vez que eu postar a repartição de código você venha a seguir o que eu fiz ...
Jonathan Allan
... esse é um comportamento sutilmente incorreto? Por especificação, você precisa rolar todos os três dados, não apenas uma moeda. A menos que a descrição esteja incorreta e o código esteja correto.
21719 Stackstuck
@Stackstuck - a descrição geral é um pouco enganadora, a moeda é lançada a cada vez; Vou consertar - obrigado. FWIW, a descrição do código está correta - a ramificação da moeda Ø.X¤?está aninhada na instrução de repetição até 3 vezes ⁸«3Ḣ¤¡,.
Jonathan Allan
Ah ok. Ainda bem que pude ajudar.
Stackstuck 22/02/19
1

C #, 356? +13? Bytes

Requer using System;um total de +13 bytes para o código mostrado abaixo, se precisar contar isso. Caso contrário, basta digitar em qualquer classe e ligar L(players, starting chips);.

static int i,j,k,l;public static void L(int p,int s){var r=new Random();var x=new int[p];for(i=0;i<p;i++)x[i]=s;
for(i=0;i<s*p;){for(j=0;j<p;j++){for(l=0;l<x[j]&l<3;l++){k=r.Next(-1,5);if(k<2){if(k==0){x[j]--;i++;}else{x[(p+j+k)%p]++;x[j]--;}}}Console.Write(a(x)+i);}}}public static string a(int[] x){var n="|";for(l=0;l<x.Length;)n+=x[l++]+" ";
return n;}

Exemplo de saída para um jogo de 2,2:

|1 3 0|2 2 0|1 3 0|1 3 0|0 4 0|0 3 1|0 3 1|2 1 1|1 2 1|1 2 1|0 3 1|0 3 1|0 3 1|1 1 2|1 1 2|1 1 2|0 2 2|1 1 2|0 1 3|1 0 3|0 1 3|0 1 3|0 1 3|1 0 3|1 0 3|1 0 3|0 1 3|1 0 3|0 1 3|0 0 4

Versão menos golfe:

using System;
//class omitted.
static int i,j,k,l;
public static void LCR(int pl, int sc){
var r=new Random();
var state = new int[pl];
for(i=0;i<pl;i++)state[i]=sc;
for(i=0;i<sc*pl;){
    for(j=0;j<pl;j++){
        for(l=0;l<state[j] && l<3;l++){
            k=r.Next(-1,5);
            if(k<2){
                if(k==0){state[j]--;i++;}else{state[(pl+j+k)%pl]++;state[j]--;}
            }
        }
        Console.Write(a(state)+i);
    }
}
}
public static string a(int[] x){
    var n="|";
    for(l=0;l<x.Length;)n+=x[l++]+" ";
    return n;
}
Stackstuck
fonte
Bem, esta é minha primeira resposta aqui. Por favor não me coma.
Stackstuck
Ah, droga. Eu confundi meu comportamento de impressão em matriz com Java. Eu voltarei ... com uma revisão.
Stackstuck 20/02/19
Ok, isso é fixo, a saída definitivamente deve funcionar.
Stackstuck
... ah, não, há mais um erro.
Stackstuck 20/02/19
As pessoas que dizem módulo quando o comportamento é realmente remanescente não devem ... fazer isso. Lá, tenho 90% de certeza de que isso funciona agora.
Stackstuck 20/02/19
1

C # (compilador interativo do Visual C #) , 201 199 bytes

n=>m=>{var r=new Random();var j=Enumerable.Repeat(n,m).ToList();for(int i=0;j.Any(c=>c>0);i++,Print(j))for(int k=0,x=r.Next(6);k++<Math.Min(j[i%m],3);j[((x<1?-1:1)+i+m)%m]+=x<2?1:0,j[i%m]-=x<3?1:0);}

Experimente online!

startingChips=>playerNum=>{
//Instantiate a new random number generator
var rng = new Random();
//Create a list of chips
var players = Enumerable.Repeat(startingChips, playerNum ).ToList();
//Loop as long any player still has chips
for(int turnNum = 0;players.Any(c=>c>0);
//And print the result every iteration
i++,Print(j))
//Get a random number within the range of 0-5 and loop for...
for(int k = 0,randomNum = rng.Next(6);
//either 3 or the amount of chips we have, whichever is smaller
k++<Math.Min(players[turnNum % playerNum ],3);
//Increment either the right player if the random number is 1, else increment the right player if it is 0
players[((randomNum<1?-1:1)+ turnNum + playerNum ) % playerNum ]+=x<2?1:0,
//Decrement current player if the die roll is under 3
players[ turnNum % playerNum ]-=x<3?1:0);}
Modalidade de ignorância
fonte
1

Carvão , 61 bytes

≔⁰ηWΣθ«≔Eθ⭆⌊⟦κ׳⁼λη⟧‽⁶ιUMθ⁻⁺⁺κ№§ι⊕λ3№§ι⊖λ5LΦ§ιλ›μ2≔﹪⊕ηLθη⟦⪫θ,

Experimente online! Link é a versão detalhada do código. Alterna entre a saída dos dados e fichas restantes (nem o número inicial de fichas nem o número de fichas no centro estão incluídos na saída). Explicação:

≔⁰η

Comece com o primeiro jogador.

WΣθ«

Repita até que ninguém tenha mais fichas.

≔Eθ⭆⌊⟦κ׳⁼λη⟧‽⁶ι

Jogue até três dados para o jogador atual. Esses dados são rotulados como 0-5, onde 0-2 representa o ponto, 3 é passado para a esquerda, 4 é para o centro, 5 é para a direita.

UMθ⁻⁺⁺κ№§ι⊕λ3№§ι⊖λ5LΦ§ιλ›μ2

Adicione o número de fichas que o jogador à direita passou à esquerda e o número de fichas que o jogador à esquerda passou à direita, mas subtraia o número de fichas que o próprio jogador passou.

≔﹪⊕ηLθη

Avança para o próximo jogador.

⟦⪫θ,

Saída o novo número de fichas mantidas pelos jogadores.

Na verdade, é mais fácil para todos rolar seus dados simultaneamente, o que pode ser feito em 50 bytes, incluindo a impressão dos dados e as fichas restantes:

WΣθ«≔Eθ⭆⌊⟦κ³⟧‽⁶ιUMθ⁻⁺⁺κ№§ι⊕λ3№§ι⊖λ5LΦ§ιλ›μ2⟦⪫ι,⪫θ,

Experimente online! Link é a versão detalhada do código.

Neil
fonte
Não tenho certeza, mas não parece que isso explique o número de fichas mantidas após cada função, não a cada rodada.
CT Hall
@CTHall Ah, você quer dizer que cada jogador rola individualmente e depois o número de fichas é atualizado? Desculpe, eu esqueci isso. Atualizarei minha resposta assim que tiver tempo.
Neil
1

05AB1E (herdado) , 58 50 49 52 bytes

Versão que gera o mesmo estado quando um jogador do turno tem 0 fichas restantes ( 50 49 52 bytes ):

и[=ÐO_#¾è3‚Ws\F5ÝΩ©3‹iε¾¹%NQ-}®≠iε®<¾+¹%NQ+}}}}D0›*¼

Experimente online.

Versão que pula jogadores com 0 fichas restantes ( 58 57 60 bytes ):

и[=DO_#[D¾èDĀ#\¼}3‚Ws\F5ÝΩ©3‹iε¾¹%NQ-}®≠iε®<¾+¹%NQ+}}}}D0›*¼

Experimente online.

Ambos os +3 bytes usando a versão herdada, porque a nova versão 05AB1E tem um bug estranho. Ele deve funcionar com Ws\(push mínimo sem pular; troca; lista de descarte) substituído por ß(lista pop e push mínimo) e 0›(verifique se maior que 0) e substituído por d(verifique se não é negativo / maior que ou igual a 0) no nova versão, mas por algum motivo a ordem da lista é alterada após o final ¼!! : S (e a nova versão também é extremamente lenta e atinge o tempo limite após 60 segundos antes de terminar o resultado ..>.>)

A primeira entrada é a quantidade de jogadores, a segunda entrada, a quantidade de fichas por jogador.

Explicação (da segunda versão):

и                    # Create a list with a size of the (first) implicit input,
                     # filled with the second (implicit) input
[                    # Start an infinite loop:
 =                   #  Print the list with trailing newline, without popping the list
 DO_#                #  If the total amount of chips is 0: stop the infinite loop
 [                   #  Start an inner infinite loop:
  D¾è                #   Get the chips of the I'th player (I is 0 by default)
     D               #   Duplicate this
      Ā#             #   If it is NOT 0: stop the inner infinite loop
        \            #   Remove the duplicated chips for the next iteration
         ¼           #   And increase I by 1
 }                   #  After the inner infinite loop:
 3Ws\               #  If the amount of chips is larger than 3: use 3 instead
      F              #  Loop that many times:
       5ÝΩ           #   Roll a random dice in the range [0,5]
       ©3i          #   If the dice-roll is 0, 1, or 2:
           ε¾¹%NQ-}  #    Remove a chip from the I'th player
           ®≠i       #    If the dice-roll is NOT 1:
              ε®<¾+  #     Go to the player left if 0; or right if 2
              ¹%NQ+} #     And increase that player's chips by 1
      }}}            #  Close both if-statements and the loop
         D0›*        #  Make any negative amount of chips 0
             ¼       #  Increase I by 1
Kevin Cruijssen
fonte
Não tenho certeza se está funcionando corretamente. Parece que os jogadores podem ganhar fichas no seu turno, o que não deve acontecer.
CT Hall
@CTHall Você tem certeza? Em qual das quatro versões do TIO você viu isso? Eu verifiquei apenas a última (versão herdada que pula jogadores com 0 fichas), mas a única vez que aumenta um jogador é quando outro jogador está no turno. Aqui está o último com a linha de depuração adicionada, para que você possa ver qual jogador (indexado 0) está por vez.
Kevin Cruijssen 8/03/19
11
Os legados parecem estar corretos, mas o não legado parece ter o erro que mencionei.
CT Hall
@ CTHall Ah, você está realmente certo. Eu vejo uma linha [2, 3, 3, 3]seguida por [2, 2, 2, 6]..: S Vou ver se consigo encontrar a causa e corrigi-la. Se não, eu sempre pode excluí-lo e só usar o legado, uma vez que gera muito mais de qualquer maneira .. A nova versão é bastante lento com loops complexos, por algum motivo ..>>.
Kevin Cruijssen
@CTHall Consegui identificar o problema, mas não foi possível corrigi-lo. Por algum motivo, a ordem da lista foi alterada logo após o aumento do global counter_variable. Tentei reproduzir o problema em um exemplo mais simples, mas não consigo. Tem algo a ver com as instruções if e os mapas aninhados dentro do loop infinito, mas é definitivamente estranho. De qualquer forma, removi essa versão e agora resta apenas a versão legada (e mais rápida), que funciona conforme o esperado.
Kevin Cruijssen 8/03/19