คุณสามารถหมุนลูกเต๋าได้กี่ลูกโดยไม่หมุนไปได้มากที่สุด


26

ปัญหา

เริ่มต้นจากn=2ลูกเต๋า:

  • หมุนnลูกเต๋าโดยแต่ละหมายเลข 1 ถึง 6 มีโอกาสเท่ากันในแต่ละตาย
  • ตรวจสอบว่าผลรวมของพวกเขาเท่ากับผลรวมน่าจะเป็นที่สุดสำหรับลูกเต๋าที่เป็น n3.5*n
    • หากพวกเขาเท่าเทียมกันยุติ
    • มิฉะนั้นพิมพ์nและทำซ้ำตั้งแต่เริ่มต้นด้วยn+2ลูกเต๋า

รหัสของคุณไม่จำเป็นต้องทำตามขั้นตอนนี้อย่างแน่นอน แต่ควรให้ผลลัพธ์แบบสุ่มที่น่าจะเทียบเท่ากับมันโดยยึดตามคำจำกัดความของการสุ่มของเรา

โปรแกรมของคุณควรส่งออกตัวเลขทั้งหมดในบรรทัดของตนเอง ตัวอย่างเช่นหากโปรแกรมเพิ่มขึ้น 8 ลูกเต๋าและหมุนหมายเลขที่น่าจะเป็นที่สุดด้วย 8 ลูกเต๋าผลลัพธ์จะเป็น:

2
4
6

ตัวอย่าง Run

ใน 2 ลูกเต๋า7เป็นผลรวมที่เป็นไปได้มากที่สุด สมมติว่าตัวเลขที่รีดได้และ2 จากนั้นคุณจะพิมพ์32

ใน 4 ลูกเต๋า14เป็นผลรวมที่เป็นไปได้มากที่สุด สมมติว่าตัวเลขที่รีดได้3, 4, และ2 5จากนั้นผลรวมคือ14ดังนั้นโปรแกรมจะยุติที่นี่

"2"ผลลัพธ์สุดท้ายในกรณีนี้คือ

กฎระเบียบ


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

ยังไงก็ตามยินดีต้อนรับสู่ PPCG! :)
HyperNeutrino

ขอบคุณขออภัยฉันยังใหม่กับสิ่งนี้ อะไรจะทำให้ชัดเจนยิ่งขึ้น ไม่มีอินพุตคุณควรเริ่มด้วยตายหนึ่งตัวและไต่ระดับขึ้นไปให้สูงที่สุดเท่าที่จะทำได้
zoecarver

@pudility ดังนั้นถ้าฉันเข้าใจอย่างถูกต้องฉันควรจะเอาท์พุท2, 4, 6, 8, ...ที่มีลูกเต๋าจำนวนมากในแต่ละครั้งจนกว่าฉันจะไปถึงจำนวนที่เป็นไปได้มากที่สุดสำหรับการวนซ้ำ
HyperNeutrino

5
ขอขอบคุณที่สละเวลาแก้ไขความท้าทายของคุณตามความคิดเห็นของเรา! สำหรับบันทึกที่เรามีสถานที่ที่คุณสามารถโพสต์ความท้าทายในการทำงานออกรายละเอียดบางอย่างก่อนที่จะโพสต์: กล่องเครื่องมือ
FryAmTheEggman

คำตอบ:


17

Python 2 , 70 ไบต์

from random import*
n=2
while eval("+randrange(6)-2.5"*n):print n;n+=2

ลองออนไลน์!

เคล็ดลับคือการคำนวณผลรวมโดยevalการใช้สตริงที่มีลักษณะเหมือน

'+randrange(6)-2.5+randrange(6)-2.5'

พร้อมnสำเนาของนิพจน์ที่ต่อกัน randrange(6)ผลจำนวนสุ่มจาก[0,1,2,3,4,5]ซึ่งจะเลื่อนลงโดยจะมีค่าเฉลี่ยของ2.5 0เมื่อผลรวมถ้า0ที่whileสภาพล้มเหลวและยุติวง

อีกทางเลือกหนึ่งที่ใช้mapคือ 4 ไบต์อีกต่อไป:

from random import*
n=2
while sum(map(randrange,[6]*n))-2.5*n:print n;n+=2

ฉันพบว่ามีนิพจน์ที่มีความยาวเท่ากันสำหรับแม่พิมพ์เปลี่ยนเป็นค่าศูนย์ แต่ไม่มีสั้นกว่า

randrange(6)-2.5
randint(0,5)-2.5
randrange(6)*2-5
uniform(-3,3)//1

11
ฉันชอบอันนี้! ส่วนใหญ่เป็นเพราะเป็นสิ่งเดียวที่ฉันเข้าใจ
zoecarver

7

MATL , 13 ไบต์

`@E6y&Yrs@7*-

ลองออนไลน์!

คำอธิบาย

`       % Do...while top of the stack is truthy
  @E    %   Push 2*k, where k is the iteration index starting at 1
  6     %   Push 6
  y     %   Duplicate 2*k onto the top of the stack
  &Yr   %   Array of 2*k integers distributed uniformly in {1, 2, ..., 6}
  s     %   Sum
  @7*   %   Push 7*k
  -     %   Subtract
        % End (implicit). If the top of the stack is non-zero, the loop
        % proceeds with the next iteration. Else the loop is exited.
        % Display stack (implicit)

6

เยลลี่ ,  19  14 ไบต์

-5 ไบต์ด้วยความช่วยเหลือจาก Leaky Nun (การย้ายจากการนับเป็นการเรียกซ้ำ)

‘‘6ṗX_3.L⁶S?Ṅß

โปรแกรมเต็มรูปแบบการพิมพ์ผลลัพธ์ที่คั่นด้วยบรรทัดใหม่ (พื้นที่พิเศษและบรรทัดใหม่จะถูกพิมพ์ด้วยและข้อผิดพลาดของโปรแกรมในตอนท้าย)

ลองออนไลน์! - ทุกครั้งที่ทอยลูกเต๋า 6 ครั้งเกินกว่า TIO จะฆ่าสิ่งนี้เนื่องจากการใช้หน่วยความจำ แต่ใช้งานได้ตามหลักการ - มันใช้เวลาประมาณ 40 วินาทีในการทำเช่นนั้น

เวอร์ชัน 15 ไบต์ที่เป็นมิตรมากขึ้นซึ่งใช้เวลาไม่นานหรือต้องการหน่วยความจำจำนวนมากที่นี่ที่นี่

อย่างไร?

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

‘‘6ṗX_3.L⁶S?Ṅß - Main link: no arguments (implicit left=zero)
‘              - increment (initial zero or the previous result)
 ‘             - increment  (= # of dice to roll, n)
  6            - literal 6
   ṗ           - Cartesian power - all possible rolls of n 6-sided dice with faces 1-6
    X          - pick one of them
      3.       - literal 3.5
     _         - subtract 3.5 from each of the roll results
           ?   - if:
          S    -          sum the adjusted roll results (will be 0 for most common)
        L      - ...then: length (number of dice that were rolled)
         ⁶     - ...else: literal ' ' (causes error when incremented in next step)
            Ṅ  - print that plus a newline
             ß - call this link with the same arity (as a monad with the result)

ว้าวนั่นเป็นจำนวนน้อยมาก ทำได้ดี! ฉันกำลังรอการยอมรับจนกระทั่งมีคนตอบไม่กี่คน
zoecarver

ใช่เป็นเรื่องปกติที่จะต้องรอสักครู่ก่อนที่จะยอมรับแม้ว่าจะเคยทำเช่นนั้นก็ตาม หลายคนให้มันเป็นเวลาหนึ่งหรือสองสัปดาห์
Jonathan Allan

นอกจากนี้คุณควรที่จะแสดงผลการทำซ้ำทั้งหมด - ไม่ใช่เฉพาะการเรียงสุดท้าย
zoecarver

โอ้ฉันตอบการแก้ไขเก่า - ที่เปลี่ยนแปลงอย่างสมบูรณ์ฉันไม่สามารถใช้วิธีนี้ได้หลายวิธี
Jonathan Allan

โอ้รอเพียงแค่nโอเคบางทีมันอาจจะกู้ได้ ฉันคิดว่าคุณหมายถึงผลรวม :)
Jonathan Allan

6

TI-BASIC ขนาด 28 ไบต์

2→N
While mean(randInt(1,6,N)-3.5
Disp N
N+2→N
End

คำอธิบาย

  • randInt(1,6,N) สร้างรายการของตัวเลขสุ่ม N จาก 1 ถึง 6
  • mean(randInt(1,6,N)-3.5 ทำให้ค่าเฉลี่ยของม้วนลดลง 3.5
  • While ดำเนินการต่อไปจนกระทั่งนิพจน์เฉลี่ยเท่ากับศูนย์ (ผลรวมที่เป็นไปได้มากที่สุด)

5

R , 49 ไบต์

n=2
while(sum(sample(6,n,T)-3.5)){print(n)
n=n+2}

sample(6,n,T)สร้างnตัวอย่างสุ่ม (หลอก) จากช่วงที่1:6มีการแทนที่ การลบ 3.5 จากแต่ละองค์ประกอบให้ผลลัพธ์ที่มีsumค่า 0 (เท็จ) ถ้าหากเป็นค่าที่พบบ่อยที่สุดเท่านั้น

ลองออนไลน์!

ข้ามลูกเต๋าคี่


ดูเหมือนว่าจะส่งออก 80 ทุกครั้งสำหรับฉันข้อผิดพลาดที่เป็นไปได้?
zoecarver

@pudility คุณสามารถเพิ่มช่องว่างในตอนท้ายเพื่อลองอีกครั้ง มันกำลังแคชข้อมูลโค้ด / ในแต่ละครั้ง
Giuseppe

3
@Giuseppe คุณสามารถปิดการใช้งานแคชใน TIO ภายใต้การตั้งค่า
xnor

หลังจากที่ฉันปิดการใช้งานแคชเช่น @xnor กล่าวว่ามันทำงานได้ดีมาก ขอบคุณสำหรับคำตอบ!
zoecarver

@ xnor ใครจะรู้! ดีใจที่ได้รู้ในอนาคต
Giuseppe

4

Java 8, 123 149 113 108 ไบต์

()->{for(int n=0,s=1,i;s!=n*7;){for(i=s=++n*2;i-->0;s+=Math.random()*6);if(s!=n*7)System.out.println(n*2);}}

หรือ107 ไบต์ถ้าเราใช้เป็นพารามิเตอร์ที่ไม่ได้ใช้Object nullแทน

+26 ไบต์สำหรับการแก้ไขข้อผิดพลาดชี้อย่างถูกต้องโดย@Julesในความคิดเห็น
-41 ไบต์ขอบคุณสำหรับความคิดที่ยอดเยี่ยมของ@ OliverGrégoire !

คำอธิบาย:

ลองที่นี่

()->{                           // Method without parameter nor return-type
  for(int n=0,                  //  Amount of dice
          s=1,                  //  Sum
          i;                    //  Index
      s!=n*7;){                 //  Loop (1) as long as the sum doesn't equal `n`*7,
                                //  because we roll the dice per two, and 3.5*2=7
    for(i=s=++n*2;              //   Reset both the index and sum to `n`*2,
                                //   so we can use random 0-5, instead of 1-6
                                //   and we won't have to use `+1` at `Math.random()*6`
        i-->0;                  //   Inner loop (2) over the amount of dice
        s+=Math.random()*6      //    And increase the sum with their random results
    );                          //   End of inner loop (2)
    if(s!=n*7)                  //   If the sum doesn't equal `n`*7
      System.out.println(n*2);  //    Print the amount of dice for this iteration 
  }                             //  End of loop (1)
}                               // End of method

1
ฉันคิดว่ามีข้อผิดพลาดในฟังก์ชั่น หากrเท่ากับ3.5*nโปรแกรมควรยุติโดยตรง แต่ถ้าฉันเข้าใจฟังก์ชั่นอย่างถูกต้องมันจะพิมพ์nหนึ่งครั้งก่อนที่จะยกเลิก
raznagul

@raznagul ที่จริงแล้วมันไม่ได้พิมพ์เวลาเพิ่มเติม อย่างไรก็ตามมันก็บั๊ก สิ่งที่เคยทำมาก่อน: สุ่ม 1-12 (ข้อผิดพลาด 1: ควรมี 2-12) ตรวจสอบว่านี่เท่ากับ 7: ถ้าเป็น: เราเสร็จแล้วโดยไม่พิมพ์ ถ้าไม่ใช่: ทอยลูกเต๋า 2 ลูกอีกครั้ง (ข้อผิดพลาด 2, ควรเป็น 4 ลูกเต๋าแทนที่จะเป็น 2 อีกครั้ง); จากนั้นพิมพ์ 2 และเพิ่มเป็นn2 ดังนั้นมันจึงมีข้อบกพร่องสองตัว (1-12 แทน 2-12 และลูกเต๋าหมุนเหมือน 2 -> 2 -> 4 -> 6 -> 6 -> ... แทนที่จะเป็น 2 -> 4 -> 6 -> ... ) มันได้รับการพิมพ์อย่างถูกต้องอย่างไรเพราะมันจะไม่ได้ไปSystem.out.println(n),n+=2ถ้าแน่นอนเท่ากับr 3.5*n
Kevin Cruijssen

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

1
สั้นโดยไม่กี่ไบต์ (113) แต่อาจจะยังคง ()->{for(int n=2,s=0,e=7,i;s!=e;n+=2,e+=7){for(i=n,s=n;i-->0;)s+=Math.random()*6;if(s!=e)System.out.println(n);}}golfable: นอกจากนี้โปรดแก้ไขความคิดเห็นของจูลส์และคำอธิบายของฉันด้วย nคือ dices sคือผลรวมeคาดว่าiเป็นดัชนี ในที่สุดผลรวมเริ่มต้นด้วยnการหลีกเลี่ยง+1, a , nเวลาและs!=eทำซ้ำเพราะฉันไม่รู้วิธีหลีกเลี่ยงกรณีนี้
Olivier Grégoire

1
ฉันเล่นกอล์ฟอีกครั้ง;)()->{for(int i=0,s=1,j;s!=i*7;){for(j=s=++i*2;j-->0;)s+=Math.random()*6;if(s!=i*7)System.out.println(i*2);}}
โอลิเวียร์เกรโก

3

05AB1E , 22 20 ไบต์

-2 ไบต์ขอบคุณEmigna

[YF6L.RO}7Y*;ïQ#Y=ÌV

ลองออนไลน์!

คำอธิบาย

[YF6L.RO}7Y*;ïQ#Y=ÌV
[                    # Infinite loop start
 YF     }            # Y times... (Y defaults to 2)
   6L.R               # Push a random number between 1 and 6 (why does this have to be so looooong ._.)
       O              # Sum
         7Y*;ï       # Push 3.5 * Y as an int
              Q      # Is it equal to 3.5 * Y?
               #     # If so: Quit
                Y    # Push Y
                 =   # Print without popping
                  ÌV # Set Y to Y + 2

1
ถ้าคุณย้ายOหลังจากที่.Rคุณสามารถลบและ) s
Emigna

3

R, 48 44 42 ไบต์

การปรับปรุงที่ 5 ไบต์ในคำตอบของจูเซปเป้

while(sum(sample(6,F<-F+2,1)-3.5))print(F)

สิ่งนี้ (ab) ใช้ความจริงที่ว่าFเป็นตัวแปรโดยค่าเริ่มต้นที่กำหนดให้FALSEซึ่ง coerces 0และสามารถเพิ่มค่าได้ช่วยให้เราไม่จำเป็นต้องเริ่มต้นตัวแปรตัวนับ


1
แน่นอนคุณสามารถบันทึกสองไบต์ได้โดยการโทรsample(6)แทนsample(1:6)แต่ขีดฆ่า 44 ยังคงเป็น 44 .... codegolf.stackexchange.com/a/82343/67312
Giuseppe

@iuseppe แน่นอนขอบคุณ! ฉันได้แก้ไขคำตอบแล้ว
rturnbull

2

PHP , 75 ไบต์

for($d=2;(++$i*7/2-$r+=rand(1,6))||$i<$d;)$i%$d?:$d+=1+print"$d
".$r=$i="";

ลองออนไลน์!


1
5^2/++$i*$d+=rand()%6เป็นเงื่อนไขที่สั้นกว่าเล็กน้อยสำหรับลูป นอกจากนี้ฉันคิดว่าลูปปัจจุบันออกอย่างไม่ถูกต้องหากการทอยลูกเต๋าครั้งแรกเป็น "1" (มันจะสร้าง 0 สำหรับการเริ่มต้น$d)
user59178

@ user59178 แนวคิดที่ดี แต่มันสามารถทำการหารด้วยศูนย์ข้อผิดพลาดดังนั้นฉันต้องแก้ไข คุณถูกวิธีของฉันก่อนที่จะหยุดในกรณีนี้ซึ่งเป็นสิ่งที่ผิด
JörgHülsermann

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

@Pakk ใช่คำตอบ 45 ไบต์ไม่ถูกต้อง ฉันคิดว่าการคิดของคุณผิดพลาดเกิดอะไรขึ้นกับรุ่น 42 ไบต์ ดูรุ่นที่ขยาย am ลองออนไลน์!
JörgHülsermann

@ JörgHülsermannเวอร์ชันขยายที่ยืนยันสิ่งที่ฉันพูด ในการปรับใช้ที่เหมาะสมค่า $ r / $ i ควรใกล้เคียงกับ 3.5 สำหรับค่าที่มากกว่าของ $ i แต่ฉันไม่เห็นว่าเกิดขึ้นเลย ฉันได้ค่าเฉลี่ยของ 1.16 สำหรับ 9984 ลูกเต๋านั่นเป็นสถิติที่ไม่น่าเป็นไปได้มาก



1

05AB1E , 17 ไบต์

[N·ÌD6Lã.R7;-O_#,

ลองออนไลน์!

คำอธิบาย

[                   # loop over N in 0...
 N·Ì                # push N*2+2
    D               # duplicate
     6L             # push range [1 ... 6]
       ã            # cartesian product (combinations of N*2+2 elements in range)
        .R          # pick one at random
          7;-       # subtract 3.5 from each dice roll
             O_#    # if sum == 0 exit loop
                ,   # otherwise print the copy of N*2+2

1

แบตช์ 109 ไบต์

@set/an=%1+2,s=n*5/2
@for /l %%i in (1,1,%n%)do @call set/as-=%%random%%%%%%6
@if %s% neq 0 echo %n%&%0 %n%

ค่อนข้างน่ารำคาญrandomเป็นตัวแปรสภาพแวดล้อมเวทย์มนตร์ดังนั้นมันจะถูกแทนที่ด้วยค่าสุ่มระหว่างการขยายสภาพแวดล้อมซึ่งปกติจะเกิดขึ้นก่อนที่ลูปจะเริ่ม callทำให้เกิดขึ้นทุกครั้งที่ผ่านการวนซ้ำ แต่คุณต้องเพิ่ม%สัญญาณเป็นสองเท่าเพื่อป้องกันการขยายตัวก่อนที่จะเกิดการวนซ้ำ ความสนุกเริ่มต้นขึ้นเพราะเราต้องการโมดูโลผลลัพธ์ด้วย 6 ซึ่งต้องใช้%เครื่องหมายจริงซึ่งตอนนี้ต้องเพิ่มเป็นสองเท่า ผลที่ได้คือหกติดต่อกัน%s


1

JavaScript (ES2015), 75 78 ไบต์

f=(n=2)=>[...Array(n)].reduce(a=>a+Math.random()*6|0,n)==3.5*n?'':n+`
`+f(n+2)

เอาต์พุตสตริงของผลลัพธ์คั่นด้วยบรรทัดใหม่

แก้ไข: บันทึกไบต์ด้วย Shaggy, เพิ่ม 4 ไบต์เพื่อเริ่มฟังก์ชั่นที่ 2

คำอธิบาย

f=n=>
  [...Array(n)]                // Array of size n
    .reduce(                   // Combine each item
      a=>a+Math.random()*6|0,  // Add a random roll between 0 and 5 for each item
    n)                         // Start at n to correct rolls to between 1 and 6
    ==3.5*n                    // Compare total to most probable roll total
  ? ''                         // If true, end
  : n+'\n'+f(n+2)              // Otherwise, output n and continue

f=(n=2)=>[...Array(n)].reduce(a=>a+Math.random()*6|0,n)==3.5*n?'':n+`
`+f(n+2)

let roll = _ => document.getElementById('rolls').innerHTML = f();
document.getElementById('roll-button').onclick = roll;
roll();
<button id="roll-button">Roll</button>
<pre id="rolls"></pre>


2
บันทึกไบต์โดยใช้ตัวอักษรขึ้นบรรทัดใหม่ล้อมรอบใน backticks '\n'แทน
Shaggy

สิ่งนี้ไม่ได้เริ่มต้นด้วยn=2คุณต้องระบุจำนวนเริ่มต้นของลูกเต๋าเมื่อเรียกใช้ฟังก์ชัน
MT0

1

php - 89 ตัวละคร

$r=0;$n=2;while($r!=$n*3.5){$r=$i=0;while($i<$n){$r+=rand(1,6);$i++;}print $n."
";$n+=2;}

คุณไม่จำเป็นต้อง$r=0;ใช้งานครั้งแรก echoแทนprint $n."สามารถเขียนเป็น"$nและสำหรับลูปแทนในขณะที่อนุญาตให้ทำอะไรบางอย่างในวงหลังหรือก่อนที่จะบันทึกบาง bytes
JörgHülsermann


1

Haskell 133 132 ไบต์

import System.Random;import Control.Monad
s k=do n<-replicateM k$randomRIO(1,6);if sum n==7*div k 2 then pure()else do print k;s(k+2)

ขอขอบคุณ @Laikoni สำหรับคำแนะนำในความคิดเห็นด้านล่าง


1. ) การนำเข้าควรนับเป็นจำนวนไบต์ 2. ) return()สามารถย่อให้สั้นลงpure()และputStrLn$showสามารถย่อให้สั้นลงprintได้
Laikoni

ฉันจะแก้ไขทันที ขอบคุณ
Davide Spataro

บางสิ่งเล็ก ๆ เพิ่มเติม: div k 2 thenสามารถdiv k 2thenและเป็นdo print k;s(k+2) print k>>s(k+2)
Laikoni

1

อ็อกเทฟ 55 ไบต์

n=2;
while mean(randi(6,n,1))-3.5!=0
n
n=n+2;
end

แรงบันดาลใจจากคำตอบของ Andrewarchi หากใครบางคนมีพอยน์เตอร์ที่จะย่อให้เล็กลงพวกเขาจะยินดี


Wow, TI-BASIC and Octave have surprisingly similar syntaxes
andrewarchi

@andrewarchi Octave (the online version is what I use) is just the basics of the basics when it comes to programming.
Michthan


0

QBIC, 40 bytes

{[1,r|g=g+_r1,6|]~g=r*3.5|_X\g=0?r┘r=r+2

Thispretty much literally does what the challenge asks for; seems the shortest way to get the distribution right.

Explanation

{          DO infinitely
[1,r|      FOR a=1, a<=r (at start, r == 2), a++
g=g+       Add to g (0 at start)
  _r1,6|   a random number between 1 and 6 incl.
]          NEXT
~g=r*3.5   IF the result of all dice rolls equals the expected value
|_X        THEN quit
\g=0       ELSE, reset the dice total
?r┘        PRINT the number of dice used
r=r+2      and add 2 dice.
           END IF and LOOP are courtiously provided by QBIC at EOF.


0

JavaScript (ES6) - 69 Characters

r=n=>n?r(n-1)+(Math.random()*6|0)-2.5:0;f=(n=2)=>r(n)?n+`
`+f(n+2):""

console.log(f())

Explanation:

r=n=>                                     # Roll n dice
     n?                                   # If there is a dice left to roll
       r(n-1)                             #   Roll n-1 dice
             +(Math.random()*6|0)         #   Add a random number from 0 .. 5
                                 -2.5     #   Subtract 2.5 so sum of average is 0
                                     :0   # Else total is 0

and:

f=(n=2)=>                                 # Start with n = 2
         r(n)                             # Roll n dice
             ?n+"\n"+f(n+2)               # If non-zero then concatenate n, newline and
                                          #    result for n+2 dice
                           :""            # If zero (average) terminate.

0

Calc2 0.7, 119 118 111 bytes

using"runtime";for(n=2,d=0;d!=3.5*n;Console.WriteLine(n),n+=2)for(i=d=0;i++<n;)d+=Math.Int(Random().Next(1,7));

ungolfed:

using "runtime";
var d = 0;
var r = Random();
for(var n = 2; d != 3.5 * n; Console.WriteLine(n), n += 2)
{
    d = 0;
    for(var i = 0; i < n; i++)
        d += Math.Int(r.Next(1,7));
}

I could do without the Math.Int() but unfortunately in 0.7 the Random().Next() functions have a bug where they all return doubles instead of ints. It has been fixed but only after this question was posted. I'm not gonna win anything, but hey, nice proof of concept.

Edit:

  • removed unnecessary space between using and "runtime" (-1 byte)

Edit2:

  • removed var r and create a new Random where it's needed (-4 byte)

  • changed i=0,d=0 to i=d=0 (-2 byte)

  • incremented i after check (-1 byte)


0

Ruby, 52 bytes

s=x=2;(s=0;p x.times{s+=rand(6)-2.5};x+=2)while s!=0

Explanation

s=x=2;                                                # sum=2, x=2
      (                                  )while s!=0  # while sum != 0:
       s=0;                                           #  reset the sum
           p                                          #  print
             x.times{              };                 #  repeat x times:
                     s+=                              #   Add to sum:
                        rand(6)                       #    random int in 0..5
                               -2.5                   #    subtract average
                                                      #  (implicitly return x for printing)
                                     x+=2             #  Increment x by 2

Try it online!


@Pakk note the s=0 at the front of the loop and the use of x.times. This means the sum is reset every time and then x dice are rolled, which should be the correct distribution. I'll write up an explanation of my code.
Value Ink

You are correct, I was too fast with my conclusion.

0

Javascript, 87 chars

for(n=2;eval('+'.repeat(n).replace(/./g,x=>x+(Math.random()*6|0)))!=2.5*n;n+=2)alert(n)

Test with console.log instead of alert:

for(n=2;eval('+'.repeat(n).replace(/./g,x=>x+(Math.random()*6|0)))!=2.5*n;n+=2)console.log(n)
console.log('Done')


0

lua, 102 bytes

function r(n,t) for d=1,n do t=t+math.random(1,6)end return t==n*3.5 or print(n)or r(n+2,0)end r(2,0)

Or the more readable version

function r(n,t) --recursive function does its magic, t is given to safe usage bytes(no local)
    for d=1,n do --roll n dice and count them up to the total (t)
         t =t+math.random(1,6)
    end 
    return t==n*3.5 or --check if t==n*3.5. If it is then it ends
           print(n) or --t != n*3.5 thus print n. print returns nil
           r(n+2,0) --both the check and the return value from print are false thus r gets executed.
end 
r(2,0) --start the process

A more cheaty version for 96 bytes

function r(n,t,m)t=t+m(1,6)+m(1,6)return t==n*3.5 or print(n)or r(n+2,t,m)end r(2,0,math.random)

This pretty much works the same as the first but reuses the rolls from earlier calls. Because of this I can remove the for loop. Both are tested in lua 5.2



-1

PHP, 51 bytes

$r=2;$n=2;while(rand(0,6)-2.5*$r){print $n;$n=$n+2;}

If your output is always 2, then this is not a valid answer...

If we print $n inside while loop, then it will print the following : 2,4,6,8,10.....
Shiva

2
Still, I don't see how this follows the requirements in the question. You use two variables: "$n" and "n". "n" is undefined, so will be set to zero. So effectively, what you do is print an even number, and have a chance of 5/6 of printing the next even number. This is mathematically not equivalent to the distribution in the question.

Typo, that n should be always 2, updated the code.
Shiva

Still not what the question asks... Now you are throwing a die, check if it is five (=2*2.5); if the die is five, you stop, and if it is not five, you write the next even number and continue. Mathematically effectively the same as what you did in the previous version of the code.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.