ซ้ำลูกเต๋ากลิ้ง


12

ได้รับการป้อนข้อมูลnที่3 <= n <= 25ดำเนินการขั้นตอนดังต่อไปนี้เริ่มต้นด้วยหนึ่งเดียวnตายด้านเดียว (ใบหน้าในช่วง[1, n]รวม):

  1. พิมพ์ผลnการทอยลูกเต๋าปัจจุบันที่มีการเล่นในรูปแบบkdn: X(ซึ่งXเป็นผลลัพธ์และkจำนวนของลูกเต๋าที่เล่น)
  2. หากXมากกว่าหรือเท่ากับn/2จำนวนครั้งของลูกเต๋าที่เล่นให้เพิ่มตาย อื่นเอาตาย
  3. หากจำนวนของลูกเต๋าที่เล่นเท่ากับ0หรือnหยุด อื่นไปที่ขั้นตอนที่ 1

ตัวอย่างการรัน (โปรดทราบว่าเอาต์พุตในวงเล็บใช้สำหรับคำอธิบายและไม่จำเป็นต้องใช้):

6 ด้าน:

1d6: 4 (avg: 3.0, add)
2d6: 6 (avg: 6.0, add)
3d6: 9 (avg: 9.0, add)
4d6: 16 (avg: 12.0, add)
5d6: 13 (avg: 15.0, remove)
4d6: 9 (avg: 12.0, remove)
3d6: 5 (avg: 9.0, remove)
2d6: 7 (avg: 6.0, add)
3d6: 11 (avg: 9.0, add)
4d6: 14 (avg: 12.0, add)
5d6: 17 (avg: 15.0, add)

9 เข้าข้าง:

1d9: 7 (avg: 4.5, add)
2d9: 14 (avg: 9.0, add)
3d9: 18 (avg: 13.5, add)
4d9: 18 (avg: 18.0, add)
5d9: 28 (avg: 22.5, add)
6d9: 26 (avg: 27.0, remove)
5d9: 28 (avg: 22.5, add)
6d9: 34 (avg: 27.0, add)
7d9: 33 (avg: 31.5, add)
8d9: 30 (avg: 36.0, remove)
7d9: 29 (avg: 31.5, remove)
6d9: 35 (avg: 27.0, add)
7d9: 32 (avg: 31.5, add)
8d9: 42 (avg: 36.0, add)

กฎระเบียบ

  • เอาต์พุตต้องอยู่ในรูปแบบที่kdn: Xแน่นอนโดยมีบรรทัดใหม่คั่นแต่ละม้วน
  • คุณต้องจำลองการทอยลูกเต๋าหลายลูก เพียงแค่ส่งกลับจำนวนเต็มแบบสุ่มในช่วง[1, n](รวม) คูณด้วยจำนวนของลูกเต๋าที่กำลังเล่นอยู่ในขณะนี้เนื่องจากไม่ได้จำลองการหมุนหลายลูกเต๋าอย่างแม่นยำ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

ลีดเดอร์บอร์ด

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างกระดานแต้มนำจากคำตอบ a) เป็นรายการคำตอบสั้นที่สุดต่อภาษาและ b) เป็นกระดานแต้มนำโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวได้ ตัวอย่างเช่น

## Ruby, <s>104</s> <s>101</s> 96 bytes

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของสองไฟล์หรือคุณต้องการแสดงรายการการลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

## Perl, 43 + 2 (-p flag) = 45 bytes

คุณยังสามารถทำให้ชื่อภาษาเป็นลิงก์ซึ่งจะปรากฏในตัวอย่างข้อมูล:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


ฉันพบว่ามันสับสน ตัวอย่างคำตอบได้ไหม
Hipe99

คำตอบตัวอย่างเช่นตัวอย่างสั้น ๆ
Hipe99

การแก้ไขของคุณชี้แจง ขอบคุณ!
Hipe99

16
คุณแน่ใจเกี่ยวกับเลขคณิตของคุณหรือไม่ d6 ทั่วไปมีม้วนเฉลี่ย 3.5
Peter Taylor

11
ค่าเฉลี่ยทั้งหมดในตัวอย่างของคุณดูเหมือนผิด
edc65

คำตอบ:



3

Mathematica, 95 89 80 ตัวอักษร

For[k=1,0<k<#,If[Print[k,d,#,": ",x=Tr[{1,#}~RandomInteger~k]];x<k/2#,k--,k++]]&

Ungolfed

For[
  k = 1,
  0 < k < #,
  If[
    Print[k, d, #, ": ", x = Tr[{1, #}~RandomInteger~k]];
    x < k/2 #,
    k--,
    k++
  ]
] &

1
@ MartinBüttnerขอบคุณสำหรับคำแนะนำของคุณ Echoน่าเสียดายที่ไม่สามารถเรียงลำดับของอินพุตPrintได้
ยักไหล่

โอ้จุดดี
Martin Ender

3

PHP, 164 121 112 113 109 ไบต์

รุ่นสุดท้ายฉันสัญญา ปรับปรุงโดยใช้คำแนะนำของติตัส:

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x: $r\n";$y+=$r/$y>$x/2?:-1;$y<$x&&$y?d($x,$y):0;}

แก้ไข: เพิ่มไบต์พิเศษสำหรับการจัดรูปแบบ ลืมมี IF ในนั้นขอบคุณที่ปล่อยข้อความ "เพิ่ม / ย่อย" อาจเป็นผู้ประกอบการที่สาม:

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x: $r\n";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}

ผลลัพธ์ตอนนี้ดูเหมือนว่า:

1d6: 5
2d6: 11
3d6: 8
2d6: 11
3d6: 7
2d6: 4
1d6: 5

แก้ไข: ขอบคุณ @Manatwork ช่วยฉันได้มาก! ใหม่และที่ไม่ประทับใจ:

function d($x,$y){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x=$r\n";if($r/$y>$x/2)$y++;else$y--;if($y<$x&&$y){d($x,$y);}}

รายการก่อนหน้า:

function d($x,$y){for($i=0;$i<$y;$i++)($r+=rand(1,$x));$s=$y."d$x=$r, ";if($r/$y>$x/2){$y++;$s.="add";}else{$y--;$s.="sub";}echo $s."\n";if($y<$x&&$y>0){d($x,$y);}}`

ม้วนแม่พิมพ์แยกออกผลลัพธ์นี้:

1d6=6, add
2d6=7, add
3d6=11, add
4d6=14, add
5d6=15, sub
4d6=15, add
5d6=18, add

และมันก็ถูกเรียกว่า: d(6, 1);

การแสดงAddและSubส่วนต่อท้ายบังคับหรือไม่ นี่ไม่ชัดเจนจากคำถามของคุณ


ข้อกำหนดระบุว่า“ โปรดทราบว่าเอาต์พุตในวงเล็บมีไว้เพื่ออธิบายและไม่จำเป็นต้องใช้” วิธีนี้ดูเหมือนจะสั้นกว่า:function d($x,$y=1){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x, $r↵";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}
58

@ การจัดการขอบคุณคุณช่วยได้มากจริงๆ!
steenbergh

ถ้ายังสามารถเป็น ternary บันทึกหนึ่งไบต์ และการเปลี่ยนแปลงเพิ่มขึ้น / ลดลงสามารถบันทึกไบต์ที่สอง:$y-=$r/$y>$x/2?:-1
ติตัส

2

Python 3, 125

บันทึก 3 ไบต์ด้วย DSM

def x(d):
 import random;c=1
 while 0<c<d:r=sum(map(random.randint,[1]*c,[d]*c));print('%id%i: %i'%(c,d,r));c+=2*(r>=d*c/2)-1

ค่อนข้างง่ายม้วนลูกเต๋าเป็นจำนวนมากและตรวจสอบค่าเฉลี่ย ยังไม่มีอะไรแฟนซีเกินไปที่นี่
มันจะต้องมีการเรียกด้วย int ดังนั้นx(6)จะผลิตสิ่งนี้:

1d6: 5
2d6: 10
3d6: 8
2d6: 7
3d6: 11
4d6: 8
3d6: 13
4d6: 19
5d6: 13
4d6: 15
5d6: 22

.


2

JavaScript (ES6), 97 102 106 112ไบต์

ขอบคุณ @ user81655 และ @Jupotter ที่ช่วยฉันสองสามไบต์

f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=k;i--;)x+=Math.random()*n|0}

// 102 bytes:
f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=0;++i<=k;)x+=1+Math.random()*n|0}

// Previous attempt, 112 bytes
f=n=>{k=1;while(k&&k!=n){for(x=i=0;i++<=k;)x+=1+~~(Math.random()*n);console.log(k+`d${n}: `+x);k+=x<k*n/2?-1:1}}

การสาธิต

ใช้งานได้กับเบราว์เซอร์ที่ใช้งานได้กับ ES6 เท่านั้น (ในขณะนี้ซึ่งรวมถึง Firefox และ Edge ซึ่งอาจเป็นได้ด้วย Chrome และ Opera ที่เปิดใช้งานคุณลักษณะ JavaScript แบบทดลอง):

f=n=>{for(k=1;k%n;console.log(k+`d${n}: `+x),k+=x<k*n/2?-1:1)for(x=i=k;i--;)x+=Math.random()*n|0}

// Snippet stuff
console.log = x => {
  document.getElementById('O').innerHTML += x + `<br>`;
}

document.getElementById('F').addEventListener('submit', e => {
  document.getElementById('O').innerHTML = ``
  f(document.getElementById('I').valueAsNumber)
})
<form id=F action=# method=get>
  <label>
    Number of faces: 
    <input type=number min=3 max=25 value=9 required id=I>
  </label>
  <button>Play</button>
  
  <div>
    <output id=O></output>
  </div>
</form>


คุณสามารถเปลี่ยนwhileเป็นforลูปปัดเศษด้วย|0แทน~~()และย้ายข้อความสั่งสองสามคำสั่งเพื่อให้คุณสามารถลบวงเล็บเพื่อบันทึกสองสามไบต์ นอกจากนี้คุณยังได้รับอนุญาตให้ทำหน้าที่ไม่ระบุชื่อ (ไม่f=) 103 ไบต์:n=>{for(k=1;k&&k!=n;k+=x<k*n/2?-1:1)for(x=i=0;i++<=k;console.log(k+`d${n}: `+x))x+=1+Math.random()*n|0}
user81655

@ user81655 ขอบคุณ ด้วยเหตุผลบางอย่างที่เวอร์ชันของคุณสร้างเอาท์พุทที่ไม่เกี่ยวข้องมากมายดังนั้นฉันจึงย้ายconsole.logไปที่forลูปอื่น ยังลดลงเหลือ 106
rink.attendant.6

ฉันเพิ่งเขียนขึ้นโดยไม่ทดสอบดังนั้นฉันจึงดีใจที่ส่วนใหญ่ใช้งานได้ :)
user81655

คุณสามารถได้รับหนึ่งตัวละครโดยการแทนที่k&&k!=nเงื่อนไขโดยการเปรียบเทียบk%n!=0
Jupotter

@Jupotter ขอบคุณk%nทำงานได้ดียิ่งขึ้น;)
rink.attendant.6

1

CJam, 45 ไบต์

ri:M;{X__{Mmr+}*[X'dM':S5$N]o_+XM*<_+(-:XM%}g

ลองออนไลน์

ใช้ข้อมูลจำเพาะที่แท้จริงอย่างแท้จริง (รวมถึงสูตร "mean roll" ที่ไม่ถูกต้องทางคณิตศาสตร์) เป็นที่คาดหวังการย้ายโปรแกรม GolfScript เดิมด้านล่างเพื่อ CJam บันทึกพวงของไบต์เนื่องจากสั้นตัวในชื่อคำสั่ง ( mr, oและgแทนrand, putsและdo)

GolfScript, 51 ไบต์

~:&;{1..{&rand+}*[1"d"&": "4$]puts.+1&*<.+(-:1&%}do

นี่คือรายการ GolfScript ต้นฉบับของฉัน เทคนิคการเล่นกอล์ฟที่โดดเด่นรวมถึงการใช้หมายเลข1เป็นตัวแปรที่กำหนดค่าเริ่มต้นได้อย่างสะดวกเพื่อจัดเก็บจำนวนลูกเต๋าปัจจุบันที่จะทำการรีด (เวอร์ชั่น CJam ใช้แทนXซึ่ง CJam จะกำหนดค่าเริ่มต้นเป็น 1)


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

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

ทั้งหมดที่กล่าวมานี่คือสิ่งที่ใกล้เคียงที่สุดที่ฉันจะได้รับใน AnyDice :

N: 6
K: 1
function: clip X:n { result: X * (X < N) }
function: adjust X:n { result: [clip X + ((XdN)*2 >= X*N)*2-1] * (X > 0) }
loop I over {1..20} {
  output K named "dice in roll [I]"
  output KdN named "outcome of roll [I]"
  K: [adjust K]
}

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

เคล็ดลับสำคัญที่ใช้ที่นี่เป็นที่เมื่อคุณเรียกฟังก์ชันคาดหวังว่าหมายเลข (ตามที่ระบุโดย:nในการกำหนดฟังก์ชั่น) ใน AnyDice และผ่านมันตาย (เช่นการกระจายความน่าจะเป็น) แทน AnyDice โดยอัตโนมัติประเมินฟังก์ชันสำหรับทั้งหมดที่เป็นไป คุณค่าของความตายและรวมผลลัพธ์เข้ากับการตายใหม่

นี่คือภาพหน้าจอของเอาต์พุต (ในรูปแบบแผนภูมิแท่ง) สำหรับสามม้วนแรก:

ภาพหน้าจอ AnyDice

(หมายเหตุว่า "0" คอลัมน์ในแต่ละกราฟแสดงน่าจะเป็นที่ย้ำหยุดเนื่องจากจำนวนของลูกเต๋าตีทั้ง 0 หรือ N, ก่อนที่จะม้วนปัจจุบัน. นี้เกิดขึ้นจะเป็นวิธีที่สะดวกในการเป็นตัวแทนของสภาพหยุดเนื่องจาก แน่นอนกลิ้ง 0dN ให้ผลตอบแทนเสมอ 0)


1

R, 103 ไบต์

การดำเนินการไปข้างหน้าอย่างเป็นธรรม ทอยลูกเต๋าเสร็จsum(sample(n,i))แล้ว

i=1;n=scan();while(i&i<=n){cat(i,'d',n,': ',s<-sum(sample(n,i)),'\n',sep='');i=ifelse(s<i*n/2,i-1,i+1)}

ทดสอบการทำงาน

> i=1;n=scan();while(i&i<=n){cat(i,'d',n,': ',s<-sum(sample(n,i)),'\n',sep='');i=ifelse(s<i*n/2,i-1,i+1)}
1: 9
2: 
Read 1 item
1d9: 9
2d9: 14
3d9: 10
2d9: 14
3d9: 9
2d9: 9
3d9: 12
2d9: 7
1d9: 9
2d9: 11
3d9: 17
4d9: 18
5d9: 25
6d9: 29
7d9: 33
8d9: 43
9d9: 45
> 

1

CoffeeScript, 106 99 ไบต์

f=(n,k=1)->(x=k;x+=Math.random()*n|0for[k..0];console.log k+"d#{n}: "+x;k+=x<k*n/2&&-1||1)while k%n

# Previous attempt, 106 bytes
f=(n,k=1)->(x=i=0;x+=1+Math.random()*n//1while++i<=k;console.log k+"d#{n}: "+x;k+=x<k*n/2&&-1||1)while k%n

Ungolfed

f = (n, k = 1) ->
 (x = k
 x += 1 + Math.random() * n | 0 for [k..0]
 console.log k + "d#{n}: " + x
 k += x < k * n / 2 && -1 || 1
 ) while k % n

1

Julia, 77 ไบต์

n->(N=1;while 0<N<n k=sum(rand(1:n,N));print(N,"d$n: $k
");N+=1-2(2k<N*n)end)

ส่วนใหญ่สิ่งนี้ควรอธิบายด้วยตนเอง - มีการใช้การขึ้นบรรทัดใหม่จริงในprintสตริงแทนที่จะใช้printlnเพื่อบันทึกไบต์ rand(1:n,N)ผลิตNจำนวนเต็มสุ่มระหว่าง 1 nและ


1

Ruby, 93 90 82 ตัวอักษร

->n{d=s=2
puts"#{d}d#{n}: #{s=eval'+rand(n)+1'*d}"while(d+=s<d*n/2.0?-1:1)>0&&d<n}

วิ่งตัวอย่าง:

2.1.5 :001 > -->n{d=s=2;puts"#{d}d#{n}: #{s=eval'+rand(n)+1'*d}"while(d+=s<d*n/2.0?-1:1)>0&&d<n}[6]
1d6: 5
2d6: 10
3d6: 6
2d6: 5
1d6: 5
2d6: 8
3d6: 15
4d6: 18
5d6: 22

0

QBIC , 83 ไบต์ (ไม่แข่งขัน)

:c=a{e=0[1,q|e=e+_rq,a|]?!q$+@d|!+a$+@:|+!e$~e<c/2|q=q-1\q=q+1]c=q*a~q=a|_X]~q=0|_X

คำอธิบาย:

q                    Tracks the number of dice (is implicitly 1 at the start)
:                    Takes input from a CMD line parameter
[1,q|e=e+_rq,a|]     Rolls the dice separately
?!q$+@d|!+a$+@:|+!e$ Prints the roll result (requires an unfortunate amount of casting...)
~e<c/2|q=q-1\q=q+1]  Checks whether to increase or decrease
~q=a|_X]~q=0|_X      Tests the amount of dice and quits on either boundary.

0

PHP, 104 ไบต์

for($n=$argv[$k=1];$k&&$k<$n;print$k."d$n: $x\n",$k-=$x<$n*$k/2?:-1)for($x=$i=0;$i++<$k;)$x+=rand(1,$n);

ทำงานด้วย php -r '<code>' <N>

แตกหัก

for($n=$argv[$k=1];     // import input, init number of dice
    $k&&$k<$n;          // while 0<$k<$n
    print$k."d$n: $x\n",    // 2. print results
    $k-=$x<$n*$k/2?:-1      // 3. remove or add a die
)
    for($x=$i=0;$i++<$k;)   // 1. roll dice separately
        $x+=rand(1,$n);         // sum up results
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.