왼쪽 중앙 오른쪽 (LCR) 코드 골프


10

파티에서 나는 게임 LCR을 소개 받았다. 이제는 기술이없고 무작위 기회 만 있기 때문에 훌륭한 게임이 아닙니다. 그러나 나는 이것을 코딩 할 수 있었고 R을 게임을 모델링하기 위해 빠른 프로그램을 만들었습니다.

게임 방식에 맞게 Wikipedia에서 수정 된 게임 규칙 :

각 플레이어는 최소 3 개의 칩을받습니다. 플레이어는 차례로 6면 주사위 3 개를 굴립니다. 각 주사위에는 한쪽에 "L", "C", "R"이 표시되고 나머지 3 개의쪽에 하나의 점이 표시됩니다. 던져진 각각의 "L"또는 "R"에 대해, 플레이어는 각각 하나의 칩을 왼쪽 또는 오른쪽으로 플레이어에게 전달해야합니다. "C"는 칩이 중앙 (포트)에 있음을 나타냅니다. 점은 효과가 없습니다.

만약 플레이어가 남은 칩이 3 개 미만이면 여전히 게임에 있지만 칩의 수는 3 개를 모두 굴리는 것이 아니라 자신의 차례에 굴리는 주사위의 수입니다. 플레이어가 칩이없는 경우, 턴에 주사위를 통과하지만 다른 사람으로부터 칩을 받아 다음 턴을 할 수 있습니다. 승자는 칩을 중앙에 놓은 마지막 플레이어입니다.

컨테스트 : 선택한 언어로 플레이어 수와 시작 칩 수를 입력하고 LCR 게임을 시뮬레이트하여 각 플레이어가 굴린 후 게임 상태를 보여주는 프로그램을 작성하십시오.

예를 들어 게임은 다음과 같이 출력 될 수 있습니다.

[[[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

결과는 정확히 이와 같을 필요는 없지만 주사위 굴림, 각 플레이어의 칩 수 및 각 턴마다 센터의 칩 수를 쉽게 식별 할 수 있어야합니다.

코드 골프이므로 가장 짧은 코드가 승리합니다.


3
"주사위 롤을 식별하기 쉬워야한다"-턴 기반이기 때문에 롤한 플레이어와 마찬가지로 칩 상태에서 암시 적 (따라서 식별하기 쉽다)이다. 이 예제 출력에 필요한 모든 것이 있다고 주장합니다 [[[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]].- 그렇 습니까?
Jonathan Allan

1
@JonathanAllan, 저에게 효과적입니다.
CT Hall

1
@ KevinCruijssen, 좋은 질문, 나는 어느 쪽이든 허용 할 것 같아요.
CT Hall

1
@CTHall이 경우 내 답변 (Java 및 05AB1E)을 모두 편집하고 포함하거나 포함하지 않고 포함했습니다. :)
Kevin Cruijssen

1
각 지시 포인터가 주어진 플레이어 역할을하는 Runic에서 거의 이것을하고 싶습니다. 내가 할 수있는 것은 확실하지 않지만 (플레이어 수를 무시하더라도) 가능하다면 깔끔합니다.
Draco18s는 더 이상

답변:


4

이맥스 리스프 , 279 바이트

(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)))

이 기능을로 사용하십시오 (f 4 3).

더 읽기 쉬운 버전 :

(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)))

출력 예 :

(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)

3

자바 8, 281 277 275 274 253 바이트

턴 플레이어에 칩이 0 개있을 때 동일한 상태를 출력하는 버전 :

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;}

배열에서 세 번째 플레이어로 시작합니다.

온라인으로 사용해보십시오.

칩이 0 인 플레이어를 건너 뛰는 버전 (274 바이트) :

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;);}}

배열의 첫 번째 플레이어에서 시작합니다.

온라인으로 사용해보십시오.

@ OlivierGrégoire 덕분에 -7 바이트 .

설명 (두 번째 버전) :

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

1
(작은) 골프없이 나의 투표를 떠날 수 있었다 : D s=0;for(int C:c)s+=C;(21 바이트)는 s=A.stream(c).sum();(20 바이트) 로 대체 될 수있다
Olivier Grégoire

또한 완전히 정상인지 확실하지 않은 경우 : c[i%p]-=r<3?1:0c[i%p]-=1-r/3. 이렇게하면 2 바이트가 절약됩니다.
Olivier Grégoire

1
OlivierGrégoire 아의 현명한 방법 @를 다시 사용 A에서 java.util.Arrays. : D 그리고 세미콜론을 절약하기 위해 루프에 넣으면 -2 바이트입니다. 그리고 1-r/3실제로 정확합니다 ( 여기 참조 ). 감사.
Kevin Cruijssen '12

루프 비교가 감소하는 좋은 트릭. 나는 그것을 훔칠 수 있습니다.
Stackstuck

1
이전에 삭제 된 주석을 무시하십시오. 내 진리표가 꺼져 있습니다. :이 고정 된 하나 s=c[u=(i+r-1+p)%p]+=1-r&1-r/4(에 비해 2 바이트를 저장 s=c[u=(i+r%2*2-1+p)%p]+=r<2?1:0)
올리비에 그레 구 아르

2

파이썬 2 , 159 148 바이트

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

온라인으로 사용해보십시오!

롤마다 모든 플레이어 칩을 인쇄합니다


좋은 시도이지만 코드에 센터의 칩 양이 표시되지 않습니다.
CT Hall

3
@CTHall 중앙의 칩은 항상 같습니다 n*c - sum(players). 명시 적으로 작성해야 할 경우,
TFeld

사실입니다. 내가 허락 할게
CT Hall

2

젤리 , 39 바이트

반복 동작을 수정하기 위해 +2 ( ¡앞에 nilad가 있어야 함 «3Ḣ$-> ⁸FḢ«3)

출력 목록을 회전하여 이전에 왼쪽에서 행동했던 플레이어의 칩이 회전하도록 정의하면 가장 오른쪽으로 멀리 할 수 ​​있습니다 33 바이트에 대해 6 바이트 (그러나 내 의견으로는 그것을 읽는 것이 다소 어색합니다).

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

왼쪽에 플레이어 당 칩 수와 오른쪽에 플레이어 당 칩 수를 수용하는 Dyadic Link는 게임 시작과 매 턴마다 플레이어 칩 수를 표시합니다 (0 칩이 패스하는 턴 포함) .

온라인으로 사용해보십시오!

어떻게?

각 플레이어는 칩 수에 따라 최대 3 번씩 동전을 뒤집습니다. 플레이어가 머리를 뒤집 으면 아무것도하지 않지만 꼬리를 뒤집 으면 3 면체 주사위를 굴려 칩을 L, C 또는 R로 잃습니다. (플레이어가 칩이 0이면 0이 넘습니다.)
이것은 반복됩니다. 플레이어 칩의 합이 0
이 될 때까지 구현은 플레이어를 1 턴씩 왼쪽으로 회전시킨 다음 결과 상태를 다시 회전하지 않은 것처럼 정렬합니다.

ẋµ’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, ...)

사람들이 라인 노이즈처럼 보이는 이러한 언어로 코드를 작성하는 방법에 대해 약간 감동했습니다. :) 그러나 나는 단지 몇 가지 언어를 알고 있기 때문에 더 많은 경험이있을 것입니다.
CT Hall

2
위키에서 튜토리얼 을 확인할 수 있습니다 . 꽤 좋습니다. 내가 코드 고장을 게시 후에는 잘하면 내가 ... 무슨 짓을했는지 따를 것이다
조나단 앨런

...하지만 이것은 미묘하게 잘못된 동작입니까? 스펙에 따라 하나의 코인 플립이 아닌 세 개의 주사위를 모두 굴려야합니다. 설명에 오류가 있고 코드에 문제가없는 한.
Stackstuck

@Stackstuck-설명 개요가 약간 잘못되어 동전이 매번 뒤집어집니다. 고치겠습니다-고마워 코드 분류 설명이 맞습니다. 동전 뒤집기 분기 Ø.X¤?는 반복 반복 명령 안에 중첩되어 ⁸«3Ḣ¤¡있습니다.
Jonathan Allan

아, 알았어요 기꺼이 도와 드리겠습니다.
Stackstuck

1

C #, 356? +13? 바이트

필요 using System;나는 그것을 계산하는 데 필요한있어 경우 코드 13 바이트의 총, 다음과 같이하십시오. 그렇지 않으면 모든 클래스에서 plonk하고 호출하십시오 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;}

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

덜 골프 버전 :

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

아. 배열 인쇄 동작이 Java와 혼동되었습니다. 난 그냥 ... 개정판으로 돌아올거야.
Stackstuck

좋아, 그것은 고정되어 있으며, 출력은 확실히 작동해야합니다.
Stackstuck

... 아, 아뇨, 오류가 하나 더 있습니다.
Stackstuck

사람들이 행동이 실제로 남아있을 때 모듈로를 말하는 것은 그렇게해서는 안됩니다. 거기, 나는 이것이 지금 작동한다고 확신합니다.
Stackstuck

1

C # (Visual C # 대화식 컴파일러) , 201 199 바이트

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);}

온라인으로 사용해보십시오!

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);}

1

, 61 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 주사위 롤과 남은 칩 출력 사이의 대안 (초기 칩 수나 중앙 칩 수는 출력에 포함되지 않음). 설명:

≔⁰η

첫 번째 플레이어부터 시작하십시오.

WΣθ«

남은 칩이 없을 때까지 반복하십시오.

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

현재 플레이어의 주사위를 3 개까지 굴립니다. 이 주사위는 0-5로 표시되며, 0-2는 점을 나타내고, 3은 왼쪽으로, 4는 가운데, 5는 오른쪽입니다.

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

오른쪽에있는 플레이어가 왼쪽으로 통과 한 칩 수와 왼쪽에있는 플레이어가 오른쪽을 통과 한 칩 수를 더하지만 플레이어가 전달한 칩 수는 빼십시오.

≔﹪⊕ηLθη

다음 선수에게 전진하십시오.

⟦⪫θ,

플레이어가 보유한 새로운 칩 수를 출력합니다.

모든 사람이 주사위를 동시에 굴리는 것이 더 간단합니다. 주사위 롤과 남은 칩 인쇄를 포함하여 50 바이트로 수행 할 수 있습니다.

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다.


확실하지는 않지만 각 라운드가 아닌 각 역할을 수행 한 칩 수를 설명하는 것처럼 보이지 않습니다.
CT Hall

@CTHall 오, 각 플레이어가 개별적으로 롤을 한 다음 칩 수가 업데이트된다는 것을 의미합니까? 미안, 나는 그것을 간과했다. 시간이 되 자마자 답변을 업데이트하겠습니다.
Neil

1

05AB1E (레거시) , 58 50 49 52 바이트

턴 플레이어에 칩이 0 남았을 때 ( 50 49 52 바이트 ) 동일한 상태를 출력하는 버전 :

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

온라인으로 사용해보십시오.

칩이 0 인 플레이어를 건너 뛰는 버전 ( 58 57 60 바이트 ) :

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

온라인으로 사용해보십시오.

새로운 05AB1E 버전에는 이상한 버그가 있기 때문에 레거시 버전을 사용하여 +3 바이트 모두. 이 작동한다 Ws\(; 스왑; 펑없이 푸시 최소 폐기리스트)로 대체 ß(POP에서 푸시 최소) 및 0›교체 (0보다 큰 경우에 선택) d(0이보다 더 많이 또는 체크 음수 / IF)에있는 새 버전이지만 어떤 이유로 든 목록 순서는 후행 ¼! .. : S 후에 변경됩니다 (그리고 새 버전도 매우 느리고 60 초 후에 결과가 완료되기 전에 시간이 초과됩니다 ..>.>)

첫 번째 입력은 플레이어의 양이고, 두 번째 입력은 플레이어 당 칩의 양입니다.

설명 (두 번째 버전) :

и                    # 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

제대로 작동하는지 잘 모르겠습니다. 플레이어는 자신의 차례에 칩을 얻을 수있는 것 같습니다.
CT Hall

@CTHall 확실합니까? 네 가지 TIO 버전 중 어느 것을 보았습니까? 나는 마지막 (0 칩으로 플레이어를 건너 뛰는 레거시 버전) 만 확인했지만 플레이어를 늘리는 유일한 시간은 다른 플레이어가 켜질 때입니다. 다음은 디버그 라인이 추가 된 마지막 것이므로 어떤 (0 인덱싱 된) 플레이어가 회전하는지 확인할 수 있습니다.
Kevin Cruijssen

1
레거시 것들은 옳은 것 같지만, 비 레거시에는 내가 언급 한 오류가있는 것 같습니다.
CT Hall

@CTHall 아, 당신 말이 맞아요. 나는 라인 [2, 3, 3, 3]다음에[2, 2, 2, 6] .. : S가 표시됩니다. 원인을 찾아서 고칠 수 있는지 확인해 보겠습니다. 그렇지 않다면, 어쨌든 훨씬 더 많이 출력하기 때문에 항상 삭제하고 레거시 만 사용할 수 있습니다. 새로운 버전은 어떤 이유로 복잡한 루프로 인해 느립니다 ..>.>
Kevin Cruijssen

@CTHall 문제를 정확하게 지적했지만 해결할 수는 없습니다. 어떤 이유로 든 글로벌을 증가시킨 직후 목록의 순서가 변경 counter_variable됩니다. 간단한 예제에서 문제를 재현하려고 시도했지만 실패했습니다. 무한 루프 내부의 중첩 if 문 및 맵과 관련이 있지만 확실히 이상합니다. 어쨌든, 나는 그 버전을 제거했고 이제는 레거시 (그리고 더 빠른) 버전 만 남아 있습니다.
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.