Golf kode Kiri Tengah Kanan (LCR)

10

Di sebuah pesta, saya diperkenalkan dengan game LCR. Sekarang ini bukan permainan yang hebat karena tidak ada keterampilan tetapi hanya kesempatan acak. Tapi itu membuat saya berpikir, saya bisa kode ini, dan saya membuat program cepat di R untuk model permainan.

Aturan permainan dimodifikasi dari Wikipedia agar sesuai dengan cara kami bermain:

Setiap pemain menerima setidaknya 3 chip. Para pemain secara bergiliran memutar tiga dadu enam sisi, yang masing-masing ditandai dengan "L", "C", "R" di satu sisi, dan satu titik di ketiga sisi yang tersisa. Untuk setiap "L" atau "R" yang dilemparkan, pemain harus mengoper masing-masing satu chip ke pemain ke kiri atau kanan. A "C" menunjukkan sebuah chip ke tengah (pot). Titik tidak memiliki efek.

Jika seorang pemain memiliki kurang dari tiga chip yang tersisa, mereka masih dalam permainan tetapi jumlah chip mereka adalah jumlah dadu yang mereka roll pada giliran mereka, daripada menggulirkan ketiga. Ketika seorang pemain memiliki nol chip, mereka memberikan dadu pada giliran mereka, tetapi dapat menerima chip dari orang lain dan mengambil giliran berikutnya sesuai. Pemenangnya adalah pemain terakhir yang menempatkan chip ke tengah.

Kontes: tulis sebuah program dalam bahasa pilihan Anda yang mengambil input untuk jumlah pemain dan jumlah chip awal dan mensimulasikan permainan LCR, menunjukkan keadaan permainan setelah setiap pemain bergulir.

Sebagai contoh, sebuah game mungkin menjadi output sebagai:

[[[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: Jonathan Allan

Outputnya tidak harus terlihat persis seperti ini, tetapi harus mudah untuk membedakan roll dadu, berapa banyak chip yang dimiliki masing-masing pemain, dan berapa banyak chip yang dimiliki center untuk setiap belokan.

Ini kode golf sehingga kode terpendek menang.

CT Hall
sumber
3
"Seharusnya mudah untuk membedakan dadu roll" - itu implisit (karenanya mudah untuk membedakan) dari status chip, seperti pemain yang menggulung, karena berbasis giliran. Saya berpendapat bahwa contoh output ini memiliki semua yang diperlukan: [[[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]]- apakah itu masalahnya?
Jonathan Allan
1
@ Jonathan Allan, itu bekerja untuk saya.
CT Hall
1
@KevinCruijssen, pertanyaan bagus, saya kira saya akan mengizinkannya.
CT Hall
1
@ CTHall Dalam hal ini saya telah mengedit jawaban saya (Java dan 05AB1E) dan termasuk dengan dan tanpa. :)
Kevin Cruijssen
1
Saya hampir ingin melakukan ini di Runic di mana setiap penunjuk instruksi bertindak sebagai pemain yang diberikan. Tidak yakin saya bisa (bahkan mengabaikan jumlah pemain yang dimasukkan), tetapi akan rapi jika saya bisa.
Draco18s tidak lagi mempercayai SE

Jawaban:

4

Emacs Lisp , 279 byte

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

Gunakan fungsi ini sebagai (f 4 3).

Versi lebih mudah dibaca:

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

Contoh keluaran:

(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
sumber
3

Java 8, 281 277 275 274 253 byte

Versi yang menampilkan keadaan yang sama ketika pemutar belok memiliki 0 chip tersisa:

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

Mulai dengan pemain ketiga dalam array.

Cobalah online.

Versi yang melewatkan pemain dengan sisa 0 chip (274 byte):

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

Mulai dari pemain pertama dalam array.

Cobalah online.

-7 byte terima kasih kepada @ OlivierGrégoire .

Penjelasan (dari versi kedua):

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
sumber
1
Bisa membiarkan upvote saya tanpa golf (kecil): D s=0;for(int C:c)s+=C;(21 byte) dapat digantikan oleh s=A.stream(c).sum();(20 byte)
Olivier Grégoire
Juga, tidak yakin apakah sepenuhnya ok: c[i%p]-=r<3?1:0c[i%p]-=1-r/3. Ini akan menghemat 2 byte.
Olivier Grégoire
1
@ OlivierGrégoire Ah, cara cerdas menggunakan kembali Adari java.util.Arrays. : D Dan dengan meletakkannya di loop untuk menghemat titik koma itu -2 byte. Dan 1-r/3memang benar ( lihat di sini ). Terima kasih.
Kevin Cruijssen
Trik yang bagus dengan decrementing perbandingan loop. Saya mungkin mencuri itu.
Stackstuck
1
Abaikan komentar saya yang dihapus sebelumnya: tabel kebenaran saya tidak aktif. Ini adalah yang sudah diperbaiki: s=c[u=(i+r-1+p)%p]+=1-r&1-r/4(menghemat 2 byte, dibandingkan dengan s=c[u=(i+r%2*2-1+p)%p]+=r<2?1:0)
Olivier Grégoire
2

Python 2 , 159 148 byte

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

Cobalah online!

Mencetak semua chip pemain setelah setiap roll

TFeld
sumber
Usaha yang bagus, tetapi kode tidak menunjukkan jumlah chip di tengah.
CT Hall
3
@ CTHall Chip di tengah selalu sama dengan n*c - sum(players). Jika saya perlu menuliskannya secara eksplisit, saya akan
TFeld
itu benar. Saya akan mengizinkannya.
CT Hall
2

Jelly , 39 byte

+2 untuk memperbaiki perilaku pengulangan ( ¡harus didahului oleh nilad jadi «3Ḣ$-> ⁸FḢ«3)

Jika kita dapat mendefinisikan daftar output yang akan diputar untuk memiliki chip milik pemain yang bertindak sebelumnya di sebelah kiri kita dapat menyingkirkan yang paling kanan 6 byte untuk 33 byte (namun, menurut saya, agak canggung untuk membaca itu).

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

Link diadik yang menerima chip per pemain di sebelah kiri dan jumlah pemain di sebelah kanan yang menghasilkan daftar jumlah pemain chip pada awal permainan dan setelah setiap belokan (termasuk belokan di mana 0 chip memaksa lulus) .

Cobalah online!

Bagaimana?

Setiap pemain pada gilirannya, hingga tiga kali, tergantung pada jumlah chip mereka, membalik koin. Ketika seorang pemain membalik kepala mereka tidak melakukan apa-apa tetapi jika mereka membalikkan ekor mereka kemudian melempar dadu tiga sisi kehilangan chip ke L, C atau R. (Perhatikan bahwa 0 membalik ketika pemain memiliki 0 chip setara dengan passing.)
Ini diulang sampai jumlah chip pemain 0.
Implementasi memutar pemain yang ditinggalkan oleh satu tempat setiap belokan dan kemudian memutar status yang dihasilkan kembali ke semua disejajarkan seolah-olah tidak.

ẋµ’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
sumber
Saya agak terkesan dengan bagaimana orang kode dalam bahasa-bahasa ini yang terlihat seperti derau baris. :) Tapi kemudian saya hanya tahu beberapa bahasa, jadi mungkin dengan lebih banyak pengalaman akan datang.
CT Hall
2
Anda bisa melihat tutorialnya di wiki, cukup bagus. Setelah saya memposting uraian kode, semoga Anda akan mengikuti apa yang telah saya lakukan ...
Jonathan Allan
... meskipun ini perilaku yang agak salah? Per spek, Anda harus melempar ketiga dadu, bukan hanya satu koin. Kecuali jika deskripsi salah dan kodenya baik-baik saja.
Stackstuck
@Stackstuck - gambaran umum deskripsi sedikit menyesatkan, koin diputar setiap kali; Saya akan memperbaikinya - terima kasih. FWIW deskripsi uraian kode benar - percabangan flip koin Ø.X¤?,, bersarang di dalam instruksi repeat-up-to-3-times ⁸«3Ḣ¤¡,.
Jonathan Allan
Ah, baiklah. Senang bisa membantu.
Stackstuck
1

C #, 356? +13? Bytes

Membutuhkan using System;total +13 byte untuk kode yang ditunjukkan di bawah ini, jika saya harus menghitungnya. Kalau tidak, cukup plonk di kelas dan panggilan apa pun 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;}

Contoh hasil untuk gim 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

Versi yang kurang golf:

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
sumber
Nah, ini jawaban pertama saya di sini. Tolong jangan makan saya.
Stackstuck
Ah, sial. Saya mendapatkan perilaku pencetakan array saya bingung dengan Java. Saya hanya akan ... segera kembali dengan revisi.
Stackstuck
Oke, itu sudah diperbaiki, output pasti harus bekerja.
Stackstuck
... oh, tidak, ada satu kesalahan lagi.
Stackstuck
Orang-orang mengatakan modulo ketika perilaku sebenarnya tetap harus ... tidak melakukan itu. Di sana, saya yakin 90% ini berfungsi sekarang.
Stackstuck
1

C # (Visual C # Interactive Compiler) , 201 199 byte

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

Cobalah 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);}
Perwujudan Ketidaktahuan
sumber
1

Arang , 61 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Bergantian antara mengeluarkan dadu dan chip yang tersisa (baik jumlah awal chip maupun jumlah chip di tengah tidak termasuk dalam output). Penjelasan:

≔⁰η

Mulai dengan pemain pertama.

WΣθ«

Ulangi sampai tidak ada chip yang tersisa.

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

Gulung hingga tiga dadu untuk pemain saat ini. Dadu ini diberi label 0-5, di mana 0-2 mewakili titik, 3 dilewati ke kiri, 4 di tengah, 5 di kanan.

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

Tambahkan jumlah chip pemain di sebelah kanan melewati kiri dan jumlah chip pemain di sebelah kiri melewati kanan, tetapi kurangi jumlah chip pemain itu sendiri melewati.

≔﹪⊕ηLθη

Maju ke pemain berikutnya.

⟦⪫θ,

Keluarkan jumlah baru chip yang dipegang oleh para pemain.

Sebenarnya lebih mudah bagi semua orang untuk melempar dadu secara bersamaan, yang dapat dilakukan dalam 50 byte, termasuk mencetak dadu serta chip yang tersisa:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode.

Neil
sumber
Saya tidak yakin, tapi sepertinya itu bukan jumlah chip yang dimiliki setelah masing-masing peran, bukan setiap putaran.
CT Hall
@ CTHall Oh, maksud Anda setiap pemain memutar secara individual, dan kemudian jumlah chip diperbarui? Maaf, saya mengabaikannya. Saya akan memperbarui jawaban saya begitu saya punya waktu.
Neil
1

05AB1E (legacy) , 58 50 49 52 byte

Versi yang menampilkan keadaan yang sama ketika pemutar belok memiliki 0 chip tersisa ( 50 49 52 byte ):

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

Cobalah online.

Versi yang melewatkan pemain dengan sisa 0 chip ( 58 57 60 byte ):

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

Cobalah online.

Keduanya +3 byte dengan menggunakan versi lawas, karena versi 05AB1E baru memiliki bug yang aneh. Ini harus bekerja dengan Ws\(push minimum tanpa popping; swap; buang daftar) diganti dengan ß(daftar pop dan push minimum) dan 0›(periksa apakah lebih besar dari 0) diganti dengan d(periksa apakah non-negatif / lebih besar dari atau sama dengan 0) di versi baru, tetapi karena suatu alasan urutan daftar diubah setelah trailing ¼! .. : S (dan versi baru juga sangat lambat dan waktu habis setelah 60 detik sebelum menyelesaikan hasilnya ..>.>)

Input pertama adalah jumlah pemain, input kedua jumlah chip per pemain.

Penjelasan (dari versi kedua):

и                    # 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
sumber
Saya tidak yakin itu berfungsi dengan benar. Tampaknya pemain dapat memperoleh chip pada gilirannya mereka yang seharusnya tidak terjadi.
CT Hall
@ CTall, Apakah Anda yakin? Di manakah dari empat versi TIO yang Anda lihat ini? Saya hanya memeriksa yang terakhir (versi lawas yang melompati pemain dengan 0 chip), tetapi satu-satunya waktu meningkatkan pemain adalah ketika pemain lain pada gilirannya. Ini adalah yang terakhir dengan menambahkan garis-debug sehingga Anda dapat melihat pemain (0-diindeks) mana yang pada gilirannya.
Kevin Cruijssen
1
Warisan yang tampaknya benar, tetapi nonlegasi tampaknya memiliki kesalahan yang saya sebutkan.
CT Hall
@ CTHall Ah, Anda memang benar. Saya melihat garis [2, 3, 3, 3]diikuti oleh [2, 2, 2, 6]..: S Saya akan melihat apakah saya dapat menemukan penyebabnya dan memperbaikinya. Jika tidak, saya selalu dapat menghapusnya dan hanya menggunakan warisan, karena itu tetap menghasilkan lebih banyak lagi .. Versi baru ini cukup lambat dengan loop yang rumit untuk beberapa alasan ..>.>
Kevin Cruijssen
@ CTHall Saya sudah bisa menentukan masalah, tetapi tidak dapat memperbaikinya. Untuk beberapa alasan, urutan daftar dapat diubah segera setelah meningkatkan global counter_variable.. Saya mencoba mereproduksi masalah dalam contoh yang lebih sederhana, tetapi saya tidak dapat melakukannya. Ini ada hubungannya dengan pernyataan dan peta bersarang di dalam infinite loop, tapi ini benar-benar aneh .. Bagaimanapun, saya telah menghapus versi itu dan sekarang hanya versi lawas (dan lebih cepat) yang tersisa, yang berfungsi seperti yang dimaksudkan.
Kevin Cruijssen