การตีกอล์ฟแบบ Code Center ซ้าย (LCR)


10

ในงานปาร์ตี้ฉันได้รู้จักกับเกม LCR ตอนนี้มันไม่ใช่เกมที่ยอดเยี่ยมเพราะไม่มีทักษะ แต่มีโอกาสสุ่มเท่านั้น แต่มันทำให้ฉันคิดว่าฉันสามารถรหัสนี้และฉันทำโปรแกรมอย่างรวดเร็วใน R เพื่อจำลองเกม

กฎของเกมได้รับการแก้ไขจาก Wikipedia เพื่อให้ตรงกับวิธีที่เราเล่น:

ผู้เล่นแต่ละคนจะได้รับชิปอย่างน้อย 3 ชิป ผู้เล่นจะหมุนลูกเต๋าหกด้านสามด้านแต่ละอันมีเครื่องหมาย "L", "C", "R" อยู่ด้านเดียวและจุดเดียวที่เหลืออยู่ทั้งสามด้าน สำหรับการโยน "L" หรือ "R" แต่ละครั้งผู้เล่นจะต้องส่งชิปหนึ่งชิปไปยังผู้เล่นไปทางซ้ายหรือขวาตามลำดับ "C" หมายถึงชิปที่ตรงกลาง (หม้อ) จุดไม่มีผลกระทบ

หากผู้เล่นเหลือชิปน้อยกว่าสามพวกเขายังคงอยู่ในเกม แต่จำนวนชิปของพวกเขาคือจำนวนของลูกเต๋าที่พวกเขากลิ้งไปตามเทิร์นแทนที่จะหมุนทั้งสาม เมื่อผู้เล่นมีชิปเป็นศูนย์พวกเขาจะส่งลูกเต๋าเมื่อถึงตาของพวกเขา แต่อาจได้รับชิปจากผู้อื่นและเทิร์นถัดไปของพวกเขา ผู้ชนะคือผู้เล่นคนสุดท้ายที่นำชิปเข้าไปในศูนย์

การแข่งขัน: เขียนโปรแกรมในภาษาที่คุณเลือกซึ่งป้อนข้อมูลตามจำนวนผู้เล่นและจำนวนชิปเริ่มต้นและจำลองเกม 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
@JanathanAllan ที่เหมาะกับฉัน
ฮอลล์ CT

1
@KevinCruijssen เป็นคำถามที่ดีฉันเดาว่าฉันจะอนุญาตวิธีใด
CT Hall Hall

1
@CTHall ในกรณีนี้ฉันได้แก้ไขทั้งคำตอบของฉัน (Java และ 05AB1E) และรวมทั้งทั้งที่มีและไม่มี :)
Kevin Cruijssen

1
ฉันเกือบต้องการทำสิ่งนี้บน Runic ที่ตัวชี้คำสั่งแต่ละตัวทำหน้าที่เป็นผู้เล่นที่กำหนด ไม่แน่ใจว่าฉันสามารถทำได้ (แม้จะไม่สนใจจำนวนผู้เล่นที่ป้อน) แต่มันก็น่าจะเรียบร้อยถ้าทำได้
Draco18 ไม่ไว้วางใจ SE

คำตอบ:


4

Emacs Lisp , 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

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

เริ่มที่ผู้เล่นคนแรกในแถวลำดับ

ลองออนไลน์

-7 ไบต์ขอบคุณที่@ OlivierGrégoire

คำอธิบาย (ของรุ่นที่สอง):

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 bytes) สามารถถูกแทนที่ด้วยs=A.stream(c).sum();(20 bytes)
Olivier Grégoire

นอกจากนี้ยังไม่แน่ใจว่าตกลงทั้งหมด: →c[i%p]-=r<3?1:0 c[i%p]-=1-r/3สิ่งนี้จะประหยัดได้ 2 ไบต์
Olivier Grégoire

1
@ OlivierGrégoire Ah วิธีที่ชาญฉลาดในการใช้งานซ้ำAจาก java.util.Arrays: D และโดยใส่ไว้ในลูปเพื่อบันทึกในเซมิโคลอนคือ -2 ไบต์ และ1-r/3ถูกต้องแน่นอน ( ดูที่นี่ ) ขอบคุณ
Kevin Cruijssen

เคล็ดลับดีกับการลดการเปรียบเทียบลูป ฉันอาจขโมยสิ่งนั้น
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)
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

ลองออนไลน์!

พิมพ์ชิปผู้เล่นทุกคนหลังจากทุกม้วน


พยายามดี แต่รหัสไม่แสดงจำนวนชิปที่อยู่ตรงกลาง
CT Hall Hall

3
@CTHall n*c - sum(players)ชิปในศูนย์อยู่เสมอเท่ากับ ถ้าฉันต้องการเขียนมันออกมาอย่างชัดเจนฉันจะ
TFeld

นั่นเป็นเรื่องจริง ฉันจะอนุญาต
CT Hall Hall

2

เยลลี่ 39 ไบต์

+2 เพื่อแก้ไขพฤติกรรมการทำซ้ำ ( ¡ต้องนำหน้าด้วย nilad ดังนั้น«3Ḣ$-> ⁸FḢ«3)

หากเราสามารถกำหนดรายการเอาท์พุทที่จะหมุนเพื่อให้ชิปที่เป็นของผู้เล่นที่ทำหน้าที่ก่อนหน้านี้อยู่ด้านซ้ายสุดเราสามารถทำได้ด้วยขวาสุด 6 ไบต์สำหรับ33 ไบต์ (ในความคิดของฉันมันค่อนข้างอึดอัดใจที่จะอ่านมัน)

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

ลิงก์ dyadic ยอมรับชิปต่อผู้เล่นทางด้านซ้ายและจำนวนผู้เล่นทางด้านขวาซึ่งให้รายชื่อผู้เล่นชิปนับเมื่อเริ่มเกมและหลังการเลี้ยวแต่ละครั้ง (รวมถึงเทิร์นที่ 0 ชิปบังคับให้ผ่าน) .

ลองออนไลน์!

อย่างไร?

ผู้เล่นแต่ละคนในทางกลับกันถึงสามครั้งขึ้นอยู่กับจำนวนชิปของพวกเขาพลิกเหรียญ เมื่อผู้เล่นพลิกหัวพวกเขาไม่ทำอะไรเลย แต่ถ้าพวกเขาพลิกก้อยพวกเขาจะทอยสามลูกที่สูญเสียชิปไปที่ L, C หรือ R (โปรดทราบว่า 0 โยนเมื่อผู้เล่นที่มี 0 ชิปเทียบเท่ากับการผ่าน)
นี่เป็นการทำซ้ำ จนกว่าผลรวมของชิปผู้เล่นคือ 0
การใช้งานจะหมุนผู้เล่นที่ละหนึ่งที่จากนั้นหมุนจากนั้นหมุนสถานะที่เป็นผลลัพธ์กลับไปเป็นแนวเดียวกันราวกับว่าพวกเขาไม่ใช่

ẋµ’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 Hall

2
คุณสามารถตรวจสอบการสอนที่วิกินั้นทำได้ค่อนข้างดี เมื่อฉันโพสต์รายละเอียดของรหัสคุณจะหวังว่าจะทำตามสิ่งที่ฉันได้ทำไปแล้ว ...
Jonathan Allan

... นี่เป็นพฤติกรรมที่ไม่ถูกต้องอย่างละเอียดใช่มั้ย ตามสเป็คคุณจะต้องทอยลูกเต๋าทั้งสามลูก ยกเว้นว่าคำอธิบายมีข้อผิดพลาดและรหัสไม่เป็นไร
Stackstuck

@Stackstuck - ภาพรวมคำอธิบายจะทำให้เข้าใจผิดเล็กน้อยเหรียญถูกพลิกทุกครั้ง ฉันจะแก้ไขมัน - ขอบคุณ FWIW คำอธิบายรายละเอียดรหัสที่ถูกต้อง - พลิกเหรียญแยกØ.X¤?เป็นซ้อนอยู่ภายในคำสั่งซ้ำ-up-to-3 ⁸«3Ḣ¤¡ครั้ง
Jonathan Allan

อ่าโอเค. ดีใจที่ฉันสามารถช่วย
Stackstuck

1

C #, 356? +13? ไบต์

ต้องusing System;มีจำนวนทั้งหมด +13 ไบต์ถึงรหัสที่แสดงด้านล่างหากฉันจำเป็นต้องนับ ไม่งั้นก็แค่เอามันไปไว้ในชั้นเรียนใดก็ได้แล้วโทร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

รุ่น golfed น้อยกว่า:

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

อ่า drat ฉันมีพฤติกรรมการพิมพ์อาร์เรย์ของฉันสับสนกับ Java ฉันจะเป็น ... กลับมาพร้อมกับการแก้ไข
Stackstuck

โอเคที่ได้รับการแก้ไขผลลัพธ์ควรได้ผลแน่นอน
Stackstuck

... โอ้ไม่นี่มีข้อผิดพลาดอีกหนึ่งข้อ
Stackstuck

ผู้คนพูดว่าโมดูโล่เมื่อพฤติกรรมนั้นเหลืออยู่จริง ๆ ... ไม่ควรทำอย่างนั้น ที่นั่นฉัน 90% แน่ใจว่างานนี้ได้ในขณะนี้
Stackstuck

1

C # (Visual C # Interactive Compiler) , 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θ⭆⌊⟦κ׳⁼λη⟧‽⁶ι

หมุนลูกเต๋าสามลูกสำหรับผู้เล่นปัจจุบัน ลูกเต๋าเหล่านี้มีป้ายกำกับ 0-5 โดยที่ 0-2 แทนจุด 3 ผ่านไปทางซ้าย 4 คือถึงกึ่งกลาง 5 คือไปทางขวา

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

เพิ่มจำนวนชิปของผู้เล่นทางด้านขวาที่ผ่านไปทางซ้ายและจำนวนชิปที่ผู้เล่นทางด้านซ้ายผ่านไปทางขวา แต่ลบจำนวนชิปที่ผู้เล่นผ่านไป

≔﹪⊕ηLθη

เลื่อนไปยังผู้เล่นถัดไป

⟦⪫θ,

ส่งออกจำนวนชิปใหม่ที่ถือโดยผู้เล่น

มันง่ายกว่าสำหรับทุกคนในการทอยลูกเต๋าในเวลาเดียวกันซึ่งสามารถทำได้ 50 ไบต์รวมถึงการพิมพ์ลูกเต๋าและชิปที่เหลือ:

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด


ฉันไม่แน่ใจ แต่ดูเหมือนว่ามันจะไม่เกี่ยวข้องกับจำนวนชิปที่ถือครองหลังจากแต่ละบทบาทไม่ใช่แต่ละรอบ
CT Hall Hall

@CTH ทุกท่านหมายถึงผู้เล่นแต่ละคนหมุนเป็นรายบุคคลแล้วจำนวนชิปที่มีการปรับปรุง? ขออภัยฉันมองข้ามสิ่งนั้น ฉันจะอัปเดตคำตอบของฉันทันทีที่ฉันมีเวลา
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›*¼

ลองออนไลน์

ทั้งสอง +3 ไบต์โดยใช้รุ่นดั้งเดิมเนื่องจากรุ่น 05AB1E ใหม่มีข้อผิดพลาดแปลก ๆ มันควรจะทำงานกับWs\(กดต่ำสุดโดยไม่ popping; swap; ยกเลิกรายการ) แทนที่ด้วยß(รายการป๊อปและดันต่ำสุด) และ0›(ตรวจสอบว่ามากกว่า 0) แทนที่ด้วยd(ตรวจสอบว่าไม่ใช่ลบ / ใหญ่กว่าหรือเท่ากับ 0) ใน เวอร์ชันใหม่ แต่ด้วยเหตุผลบางอย่างลำดับรายการจะเปลี่ยนไปหลังจากการตามหลัง¼! .. : 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

@CTH คุณแน่ใจหรือไม่ คุณเห็นเวอร์ชัน TIO สี่เวอร์ชันใด ฉันตรวจสอบล่าสุดเท่านั้น (เวอร์ชั่นดั้งเดิมซึ่งข้ามผู้เล่นที่มีชิป 0 ตัว) แต่เวลาเดียวที่เพิ่มผู้เล่นคือเมื่อผู้เล่นอื่นหันมา นี่คืออันสุดท้ายที่มีการเพิ่ม debug-line เพื่อให้คุณสามารถดูว่าผู้เล่น (ดัชนี 0) อยู่ที่ใด
Kevin Cruijssen

1
รายการดั้งเดิมดูเหมือนจะถูกต้อง แต่ดูเหมือนว่าข้อผิดพลาดจะมีข้อผิดพลาดที่ฉันกล่าวถึง
CT Hall

@CTH ทั้งหมด Ah คุณพูดถูก ฉันเห็นบรรทัด[2, 3, 3, 3]ตามด้วย[2, 2, 2, 6].. : S ฉันจะดูว่าฉันสามารถหาสาเหตุและแก้ไขได้หรือไม่ ถ้าไม่ฉันสามารถลบได้ตลอดเวลาและใช้เพียงมรดกเพราะมันส่งออกมากขึ้นแล้ว .. รุ่นใหม่ค่อนข้างช้าด้วยลูปที่ซับซ้อนด้วยเหตุผลบางอย่าง .. >.>
Kevin Cruijssen

@CTH ทั้งหมดฉันสามารถระบุปัญหาได้ แต่ไม่สามารถแก้ไขได้ ด้วยเหตุผลบางอย่างลำดับของรายการเปลี่ยนแปลงทันทีหลังจากที่เพิ่มทั่วโลกcounter_variable.. ฉันพยายามทำซ้ำปัญหาในตัวอย่างที่ง่ายกว่า แต่ไม่สามารถทำได้ มันมีบางอย่างเกี่ยวกับคำสั่ง if -ested และ maps ภายใน infinite loop แต่มันแปลกมาก .. อย่างไรก็ตามฉันได้ลบเวอร์ชันนั้นและตอนนี้เหลือเพียงรุ่นดั้งเดิม (และเร็วกว่า) ซึ่งยังคงใช้ได้ตามที่ตั้งใจไว้
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.